A standalone App is a full-page experience that is not tied to any Agent or chat. You declare one by returning standalone: true (and a stable id) from your App's /meta route.
Where it renders
SAALT Core renders a standalone App's user surface at the top-level URL /app/{id}/user, outside any Space, Agent, or chat context, proxying to your App's own /app/{id}/user route. An optional admin/config surface is embedded through the Admin → Apps "Configure" dialog — shown when your meta sets hasAdminChatPage.
Bridge scope
The token forwarded to a standalone App is standalone-scoped: it carries no Agent ids. Create the bridge without an agentId:
Code
Because there is no Agent in scope, the agent-only namespaces (knowledge.*, conversation.findFirst, agent.getAgent, llm.getAvailableModels) throw on a standalone bridge, while the scope-agnostic ones (data.config, data.pluginData, files) work — scoped per-App, not per-Agent. See Agent-scoped vs standalone bridges for the full comparison.
Data
Standalone App data is stored per-App (Agent-optional), so pluginData and config persist without an Agent.
Access control
Standalone Apps are not gated by per-Agent or per-Space availability. Access is granted per-App through permission groups (an "App Permissions" / "Use App" scope). A user sees the sidebar Apps entry and the /apps gallery only for the Apps they have been granted.
Headers
Requests to your App carry the same forwarded headers as agent-scoped views:
saalt_session_tokensaalt_server_urlsaalt_base_path