Panel hosting
The admin panel is a static single-page application. It has no server of its own and talks only to your API.
Build it
Section titled “Build it”pnpm web:buildThe output is a folder of static files. Any static host serves it: an object store with a CDN, a static-site platform, or your own web server.
Point it at your API
Section titled “Point it at your API”The API base URL is a build-time value:
VITE_API_BASE=https://<your-api-host>No trailing /api — the panel calls the API’s routes at the root. Because it is
baked in at build time, changing your API URL means rebuilding the panel.
Allow the origin on the API
Section titled “Allow the origin on the API”The API only sends CORS headers for origins you list:
WEB_ORIGIN=https://<your-panel-host>Set it on the API, then restart it. Without this, the browser blocks every request and the panel appears broken while the API is perfectly healthy.
Deployment steps
Section titled “Deployment steps”- Build with
VITE_API_BASEset to your API URL. - Upload the output to your static host.
- Add the panel’s origin to the API’s
WEB_ORIGINand restart the API. - Open the panel; it should load
/config/statusbefore you even sign in. - Sign in with an account created by
pnpm users:create.
Routing
Section titled “Routing”The panel is a single-page app that handles two real paths — the emailed
verification and password-reset links. Configure your host to serve
index.html for unknown paths (the usual SPA fallback), or those links will
404.
Access
Section titled “Access”Verifying
Section titled “Verifying”- The panel loads and shows the sign-in screen.
- Sign-in succeeds and the watch list renders.
- The secrets-status panel shows the integrations you configured.
- A “Run now” on a watch returns an outcome within a reasonable time.
If sign-in fails with a network error but curl against the API works, the cause
is almost always WEB_ORIGIN.