The gateway serves the SolidJS UI by default. To fall back to the previous
shell as a rollback path, set AXINITE_WEB_UI=legacy before starting the
gateway; the setting is read at startup.
Signing in
On first visit the UI asks for the gateway access token (the value of
GATEWAY_AUTH_TOKEN) and keeps it for the browser session only. A link of the
form /chat?token=<token> signs in without the prompt; the UI stores the token
and removes the token parameter from the address bar. A token that the
gateway rejects is discarded and the prompt reappears.
Routes and controls
The UI has chat, memory, jobs, routines, extensions, skills, and logs routes.
Each can be hidden with the flags route_chat, route_memory, route_jobs,
route_routines, route_extensions, route_skills, and route_logs; the log
panel is hidden separately by panel_logs.
- Restart control: a button in the header, with a confirmation dialog, that
sends
/restartto the agent and waits for the gateway to go down and come back. It is not feature-flagged; it appears only when the gateway reports restart support, which requiresAXINITE_IN_DOCKER=truein its environment. If the command fails, the UI shows a retryable alert and changes the button to Retry restart. The browser console records onlyrestart_failedand its bounded category (timeout,transport, orhttp); it does not log response bodies or URLs. - TEE attestation: a header indicator whose popover fetches the full
attestation report and copies it to the clipboard. It requires the
surface_tee_attestationflag and a non-local hostname (the report is served fromapi.<domain>), so it stays hidden onlocalhostand IP addresses. - Extension pairing and activation: on the extensions route, a three-step
stepper shows the activation progress of WebAssembly (WASM) channels, and
pending pairing requests for a channel can be approved. Neither has its own
flag; both follow
route_extensions.
Feature flags
The UI reads its flags from GET /api/features. Each flag resolves in this
order, highest first:
- The
FEATURE_FLAG_<NAME>environment variable, read when the process first resolves flags.true(in any case) enables the flag; any other set value disables it. Set it before starting the gateway. - A deployment override, set without a restart through
PUT /api/settings/feature_flag:<name>. - Subsystem availability: a flag whose backing subsystem is not running (for
example
route_jobswithout a jobs runtime) is switched off. This layer can only disable a flag, never enable one. - The compiled default.
Reads of GET /api/features take an optional X-Deployment-Id header that
defaults to default. Writes require it. The value must be 1 to 64 lowercase
letters, digits, or underscores; anything else is rejected with 400.
The gateway requires Authorization: Bearer <GATEWAY_AUTH_TOKEN> for API
requests. The SPA currently reads the default deployment; API clients can
select another deployment by sending the same X-Deployment-Id header on both
reads and writes. For example, this disables the logs route for the SPA's
default deployment:
curl -X PUT http://127.0.0.1:3000/api/settings/feature_flag:route_logs \
-H "Authorization: Bearer $GATEWAY_AUTH_TOKEN" \
-H "X-Deployment-Id: default" \
-H "Content-Type: application/json" \
-d '{"value": false}'
The value must be a JSON boolean or the string "true" or "false"
(case-insensitive). Flag names use lowercase letters, digits, and underscores.
The gateway stores overrides per deployment and applies writes without a
restart. Environment variables take precedence over stored values. To remove a
persisted override, delete its row from feature_flag_overrides, then restart
each gateway process that has cached that deployment. Deleting the row alone
does not clear its in-memory override. The settings DELETE route rejects
feature_flag: keys with 400 Bad Request.
If the gateway cannot load persisted overrides, GET /api/features returns
503 Service Unavailable. The SPA continues with browser-local overrides and
compiled defaults, and records a generic failure in the browser console. Check
gateway logs and database availability before relying on those displayed flags.
Trying the UI without the daemon
make frontend-stub serves the UI against a stubbed backend, with no daemon
needed. See docs/solidjs-frontend.md for developer details, including the
stub's limitations.