A Real Answer When You Cannot Open a Project
Opening a project you are not a member of now explains itself instead of bouncing you to /dashboard without a word or dropping you on the 404 page, and every error screen picked up the redesigned 404's look.
#What's Changed
- [Fix] Opening a project you are not a member of no longer redirects you to the dashboard in silence. It now shows a No access screen in place, explaining what happened and offering a way back. Being removed from a project, or following a shared link before accepting the invite, previously teleported you with no explanation at all.
- [Fix] A project URL that does not resolve no longer falls through to the site-wide 404 page. Signed-in users stay inside the app shell, with the header and account menu intact.
- [Security] The No access screen is identical whether the project exists or not, and it echoes only the URL you typed — never anything read from the database. Distinguishing the two would have turned every project URL into an enumeration oracle, letting anyone probe /<username>/<slug> to learn which projects an account owns; slugs routinely carry client and environment names.
- [Improvement] The URL is preserved rather than redirected away, so reloading the page works the moment someone grants you access.
- [Improvement] The screen drops the project sidebar entirely, since there is no project to scope navigation to and project-scoped links would only mislead. The header breadcrumb reads “No access” instead of naming a page you cannot open.
- [Improvement] Project pages now set a real browser tab title. Members see the project name; everyone else sees “No access”, so the tab reveals no more than the page does. Every project page previously fell back to the marketing title.
- [Improvement] The application and start-up error screens were rebuilt to match the redesigned 404: the status code leads, over the same fading grid. The start-up boundary also follows your system light or dark setting for the first time — it renders before the theme script runs, so it previously forced a dark page on everyone — and labels its own browser tab instead of showing the raw URL.