Versions
Sep 25, 2026Claude CodeCurrent
Web routes
Links to items stay stable and always open a rendered read view first. Editing has its own address. A project's address is /{owner}/{project}, its owner's username and its name, as on GitHub; the rules for usernames, renames and redirects are on Public projects, workbenches and outside help (#364).
| Item | Read | Edit |
|---|---|---|
| Project | /{owner}/{project} (also /overview, /memories, /settings) |
/{owner}/{project}/settings |
| New project | /new |
|
| Project task | /{owner}/{project}/tasks/{number} |
/{owner}/{project}/tasks/{number}/edit |
| Project memory | /{owner}/{project}/memories/{number} |
/{owner}/{project}/memories/{number}/edit |
| Personal or other non-project memory | /memories/{id} |
/memories/{id}/edit |
| Documentation page | /{owner}/{project}/docs/{number}/{path} |
/{owner}/{project}/docs/{number}/{path}/edit |
| Page versions | /{owner}/{project}/docs/{number}/{path}/versions |
|
| README badge | /{owner}/{project}/badge.svg |
|
| Project directory | /explore (Browse projects, open to everyone) |
|
| Username | /username |
{path} is the slug of each ancestor page and of the page itself, for example 283/development/database-and-migrations. The number identifies the page; any other path redirects to the current one, so renames and moves never break a link.
The first segment of every other page is reserved and can never be a username (Handles.Reserved); a new top-level page has to be added there. Pages with a literal first segment win over /{owner}/{project} in the router.
Behaviour shared by all editors
/newaddresses are creation forms. After creating or saving, the form address is replaced by the read address, so Back does not reopen a submitted form.- Cancel returns to the read view without writing.
- Leaving a form with unsaved changes asks whether to save, discard or keep editing.
- Live updates refresh read views. An open editor keeps its local input.
- Copied links always use the read address.
showClosed=trueis kept across the task list, task detail, editing and subtask navigation.- An old typed memory link is resolved by the memory's number from before the shared numbering, so it is never reinterpreted as a task.
Moved projects
An address a project left after a rename of the project or its owner answers 301 to the same page at the current address, from middleware in Program.cs, and pages redirect the same way when the circuit resolves an old address (ProjectMovedException). Both only for someone who may read the project.
Authorisation
Edit buttons appear only when the service permission check succeeds. Opening an edit address directly repeats that check, and every write still validates permissions and versions on the server. Signed in, unknown and inaccessible items both show the same 404 page. A visitor without an account reads public projects; for anything else they are sent to sign in, whether it is private or does not exist.
Circuit start
The app is interactive everywhere. A link clicked while the circuit is still starting is followed by the browser without it, so Routes compares the browser's address once the circuit is live and navigates to it when they differ. Pages that serve several addresses from one component, such as the project's Overview, Memories and Settings tabs, follow the address through LocationChanged and must recognise the /{owner}/{project} shape.
Sep 17, 2026Claude Code
Web routes
Links to items stay stable and always open a rendered read view first. Editing has its own address.
| Item | Read | Edit |
|---|---|---|
| Project task | /projects/{project}/tasks/{number} |
/projects/{project}/tasks/{number}/edit |
| Project memory | /projects/{project}/memories/{number} |
/projects/{project}/memories/{number}/edit |
| Personal or other non-project memory | /memories/{id} |
/memories/{id}/edit |
| Documentation page | /projects/{project}/docs/{number}/{path} |
/projects/{project}/docs/{number}/{path}/edit |
| Page versions | /projects/{project}/docs/{number}/{path}/versions |
{path} is the slug of each ancestor page and of the page itself, for example 283/development/database-and-migrations. The number identifies the page; any other path redirects to the current one, so renames and moves never break a link.
Behaviour shared by all editors
/newaddresses are creation forms. After creating or saving, the form address is replaced by the read address, so Back does not reopen a submitted form.- Cancel returns to the read view without writing.
- Leaving a form with unsaved changes asks whether to save, discard or keep editing.
- Live updates refresh read views. An open editor keeps its local input.
- Copied links always use the read address.
showClosed=trueis kept across the task list, task detail, editing and subtask navigation.- An old typed memory link is resolved by the memory's number from before the shared numbering, so it is never reinterpreted as a task.
Authorisation
Edit buttons appear only when the service permission check succeeds. Opening an edit address directly repeats that check, and every write still validates permissions and versions on the server. Unknown and inaccessible items both show the same 404 page.
To remove text that must not be kept, publish a corrected version first, then delete the older ones.