Routing

Overview

The web UI is a single page with a hash router: no history API, no server-side rewrite. window.location.hash decides which view renders, so a deep link, a bookmark and an installed PWA all land in the same place. The whole hash → route mapping is one ordered table in frontend/src/routes.js; frontend/src/router.js is only the browser wiring (the hashchange listener and nav()).

Usage

Every view has a hash. Deep links are stable and old names keep working.

HashView
#/chats (default, and any unknown hash)Chat list, grouped by project
#/chat/<chatId>?projectDir=…Chat transcript
#/projects/new?dir=…Project folder picker
#/inspectorInspector
#/settingsSettings root
#/settings/accessAccess / authentication
#/settings/providers, #/settings/providers/new, #/settings/providers/<id>AI providers
#/settings/projectsRegistered projects
#/settings/defaultsApp defaults
#/settings/notificationsPush notifications
#/settings/pricingPricing
#/settings/aboutAbout
#/settings/project?projectDir=…&chatId=…Project settings
#/settings/project/technicalProject settings → Technical details
#/settings/project/outputProject settings → File tool options (Layout: Hierarchical / Full JSON)
#/settings/project/previewProject settings → Web preview
#/settings/project/hide?file=…Project settings → Hide file content
#/settings/agents?projectDir=…Agents list
#/settings/agents/<name>?…Agent editor (new is a draft unless ?edit=1)
#/settings/actions?projectDir=…, #/settings/actions/<id>Custom actions
`#/settings/prompts?projectDir=…&scope=app\project`
#/settings/mcp, #/settings/mcp/registry, #/settings/mcp/new?scope=…, #/settings/mcp/<id>MCP servers
#/settings/tags?projectId=…File tagging

Query parameters

Legacy names

Old hashNow
#/projects#/chats
#/auth#/settings
#/settings/copilot#/settings/providers/github-copilot
#/settings/project/agents/<name>?…#/settings/agents/<name>?… (with returnTo=project)