v1.6.2WebsiteLatest
2 min read

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.