This was generated by AI during triage.
Hatchdoor has no answer for an address it does not recognise. Depending on how the visitor arrived, they get either a blank pane with no explanation or a bare browser 404, and the two are inconsistent with each other.
Found while triaging #293, which is where the blank pane first turned up. It is not a link problem. Markdown-style links were only one of several ways to reach it.
What happens
The browser app knows five addresses: the workspace root, /stats, /graph, /settings, and a note at /v/<vault>/n/<slug>. There is no route for anything else, and React Router renders nothing when no route matches. The sidebar, the explorer and the top chrome all render normally, so the result reads as a note that failed to load rather than an address that does not exist. Nothing is shown and nothing is logged.
The server registers the app's index for exactly those same five paths and serves everything else from the built static directory, which 404s when no such file exists. So the same address produces two different outcomes:
| how the visitor arrives |
what they get |
| client-side navigation, or a reload with the service worker active |
the app, with an empty main pane and no message |
| a cold load with no service worker |
a bare 404 from the static file server, no app at all |
The service worker's navigation fallback is what splits these: it serves the cached index for any navigation outside its /api, /vault-assets and /health denylist, so a returning visitor lands in the app and a first-time visitor does not.
How to reach it
Against just dev-start, any address outside the five: /nope, /setting (a typo for /settings), or a note route carrying a slash inside the slug, /v/<vault>/n/20-projects/Beacon%20Launch.md.
In ordinary use it is reached by a mistyped URL, a bookmark from before a note was renamed, a shared link into a vault that has since been disconnected, and any in-note link whose href is not a note address (#293).
What already works
A note route whose slug names no note is handled: the note view says Note not found: <slug>. Only an address matching no route at all is silent. The fix is about the gap around that, not a replacement for it.
Hatchdoor has no answer for an address it does not recognise. Depending on how the visitor arrived, they get either a blank pane with no explanation or a bare browser 404, and the two are inconsistent with each other.
Found while triaging #293, which is where the blank pane first turned up. It is not a link problem. Markdown-style links were only one of several ways to reach it.
What happens
The browser app knows five addresses: the workspace root,
/stats,/graph,/settings, and a note at/v/<vault>/n/<slug>. There is no route for anything else, and React Router renders nothing when no route matches. The sidebar, the explorer and the top chrome all render normally, so the result reads as a note that failed to load rather than an address that does not exist. Nothing is shown and nothing is logged.The server registers the app's index for exactly those same five paths and serves everything else from the built static directory, which 404s when no such file exists. So the same address produces two different outcomes:
The service worker's navigation fallback is what splits these: it serves the cached index for any navigation outside its
/api,/vault-assetsand/healthdenylist, so a returning visitor lands in the app and a first-time visitor does not.How to reach it
Against
just dev-start, any address outside the five:/nope,/setting(a typo for/settings), or a note route carrying a slash inside the slug,/v/<vault>/n/20-projects/Beacon%20Launch.md.In ordinary use it is reached by a mistyped URL, a bookmark from before a note was renamed, a shared link into a vault that has since been disconnected, and any in-note link whose href is not a note address (#293).
What already works
A note route whose slug names no note is handled: the note view says
Note not found: <slug>. Only an address matching no route at all is silent. The fix is about the gap around that, not a replacement for it.