At its core, an App is a microservice that exposes a set of predefined routes. SAALT registers the App from its /meta, proxies requests to it, and renders any views it declares inside the platform.
/meta
Returns the App's metadata — SAALT reads it to learn the App's name, version, and capabilities.
Code
id— optional URL-safe routing id (pattern^[a-z0-9][a-z0-9._-]*$). Used as the/app/{id}path prefix for all of your App's view routes; falls back to a slug ofnameif omitted.icon— optional absolutehttp(s)ordata:URI, shown on the Apps page.standalone— optional boolean (defaultfalse); marks an agent-less, top-level App. See Standalone apps.hasAdminChatPage— settrueto render a view in the Agent's admin section; requires an/app/{id}/adminroute returning an HTML page.hasUserChatPage— settrueto render a view in the user's chat; requires an/app/{id}/userroute returning an HTML page.hasKnowledgeProvider— settrueto supply Knowledge documents; requires the/knowledge/*routes. See Knowledge.hasCron— optional boolean; whentrue, SAALT Core POSTs/cronto the App every 5 minutes with body{ agentIds: string[] }. Respond200immediately (30s timeout).
Required routes
Which routes your App must implement depends on the capabilities it declares in /meta:
| Route | Required when | Purpose |
|---|---|---|
/meta | Always | Returns the App metadata (capabilities, name, version, …). |
/app/{id}/user (+ /:agentId when agent-scoped) | hasUserChatPage | Renders the user chat view. |
/app/{id}/admin (+ /:agentId when agent-scoped) | hasAdminChatPage | Renders the admin view. |
/tools | App defines Tools | Lists Tool definitions and handles execution. See Tools. |
/knowledge/listDocuments + /knowledge/getDocument | hasKnowledgeProvider | Provides Knowledge documents. See Knowledge. |
/cron | hasCron | Receives the scheduled cron POST described under hasCron above. |
/meta, /tools, /knowledge/*, and /cron are contract routes — SAALT calls them directly, unprefixed. Your view routes (/user, /admin) must live under your App's own /app/{id}/ prefix so SAALT can route to them without colliding with other installed Apps. For standalone Apps, the user surface is served without an agentId — at /app/{id}/user rather than inside an Agent.
Still serving /user//admin unprefixed? See the 1.2 Migration guide.
Next steps
- Views — build the admin and user views.
- Bridge — talk to SAALT from your App with the SDK.
- Local development — run and register your App locally.