gateway.controlUi.basePath prefixes every path below. For example, /chat/main
becomes /openclaw/chat/main when the base path is /openclaw.
Session and dashboard URLs
Chat and dashboard views are parallel route namespaces:<namespace> is either /chat or /dashboard. The first form opens that
agent’s main session. The other forms encode one immutable session key in one of
two ways.
The short-id form applies when the session key’s rest, everything after
agent:<agentId>:, ends in a UUID. <sessionRef> is an optional display-name
slug plus a short id, such as deploy-monitor-6db92d48. The short id is the
authoritative part: at least eight lowercase hexadecimal characters from the
start of the key’s trailing UUID, with UUID dashes omitted. Longer prefixes up
to all 32 hexadecimal characters are accepted. The row’s rotating sessionId
is not part of the URL identity.
Every other key uses the literal-key form. Each colon-delimited segment after
agent:<agentId>: becomes one URL-encoded path segment. For example,
agent:main:telegram:12345 becomes /chat/main/telegram/12345, and
agent:main:cron:nightly:run:8821 becomes
/chat/main/cron/nightly/run/8821.
Literal rest segments exactly equal to . or .. use ~dot and ~dotdot so
browsers cannot collapse them as relative path segments. A literal segment that
starts with ~ doubles that leading character to keep the encoding reversible.
When an otherwise literal one-segment rest could be mistaken for a short id,
the builder inserts ~key before it, for example
agent:main:release-deadbeef becomes
/chat/main/~key/release-deadbeef. The marker forces literal interpretation
and appears only when the unescaped form would be ambiguous.
The reserved single-segment literal rest names are main, global, boot,
and sessions. The configured session.mainKey joins that set at runtime.
Exactly one segment after the agent id is literal when it is reserved or does
not contain a valid short id; otherwise it is a short reference. Two or more
segments after the agent id are always literal.
Only the configured session.mainKey collapses to the agent-only main-session
path. With session.mainKey: "workspace", agent:research:workspace becomes
/chat/research, while the distinct key agent:research:main remains the
literal path /chat/research/main.
Stability contract
The following parts are stable URL contracts:- The
/chatand/dashboardnamespace words. - The key UUID short id in short-id URLs.
- The arity and short-versus-literal parsing rules above.
/<namespace>/<agentId>/<slug>-<shortId> reference. If several sessions share
the slug, the UI shows the same disambiguation view used for short-id ties
instead of guessing. Exact short-id and literal-key references always win over
slug matching.
If one short id matches more than one session and the slug does not settle it,
the UI does not guess. It shows a small disambiguation view with the matching
display names, agents, and longer id prefixes. Use a longer prefix to make the
URL unique. Resolution examines at
most five pages of search results; if more remain, the view says that the search
was incomplete instead of guessing.
Canonical links do not use ?session= or ?face=. Released links such as
/chat?session=<sessionKey> are accepted only at the application boundary as a
migration aid and immediately rewritten, without adding browser history, to the
canonical path. The released ?face=dashboard companion selects the
/dashboard namespace during that rewrite. Loaders and page code never read the
query-form identity, and new links must not emit it. The Sessions list keeps its
own ?session= parameter because that parameter expands a row; it is not a
session deep link. The one-shot composer value ?draft= remains supported on
chat and dashboard session paths.
Route table
This table lists every Control UI application route. A dash means the route has no route-specific URL parameters.
Settings routes that use schema-backed deep links accept
?section=<section>,
?advanced=1, and #<setting-id>. These values select content within the page;
they do not change the route identity.
Special documents and startup modes
These Gateway-served documents sit outside the application route table:/?onboarding=1opens the first-run onboarding presentation./?view=terminalopens the full-screen terminal-only document used by the mobile apps. Availability still requiresgateway.terminal.enabledandoperator.admin./approve/<approvalId>opens a standalone approval document. With a base path, use<basePath>/approve/<approvalId>. The id identifies an approval but never authorizes it; normal Gateway authentication still applies.
404 instead of
falling through to a plugin route.
Remote Gateway handoff
The Vite development UI can connect to a different Gateway:ws:// or wss:// value. gatewayUrl is accepted only in a
top-level window, stored after load, and removed from the address bar. Prefer
#token= because fragments do not enter HTTP request logs or Referer headers.
The legacy ?token= handoff remains a bootstrap-only credential fallback and
is stripped immediately. Passwords stay in memory only.
When gatewayUrl selects another Gateway, the UI does not fall back to local
configuration or environment credentials. Provide the remote Gateway’s token
or password explicitly, and use wss:// behind TLS.