Try it: the demo
The demo is the whole platform with nothing to configure. Each visitor gets a private throwaway workspace with sample agents and a guided tour, deleted after 30 minutes. Model answers come from recorded replays on a local fixture server and are labelled “replay”, so no key is needed and nothing is billed. It needs only Docker.
Start it
Section titled “Start it”# From a checkout. Needs Docker; make demo also needs openssl.make demo # starts and returns; open http://localhost:3001/kiosk once the dashboard is upmake demo-down # stop it and delete all demo dataOr through the CLI (Install builds it):
pal demo # builds, waits until healthy, opens the browser (--no-open to skip)pal demo --down # stop it and delete all demo datamake demo and pal demo both use the compose project pal-demo; stop it with make demo-down or pal demo --down. The stack is Postgres, Redis, the control plane, the dashboard and the replay server. It has no gateway, model router, workflow engine or MinIO. The first run builds images and is slow.
The demo publishes :8080 and :3001, the same host ports as make dev. Stop one before starting the other, or set KIOSK_API_PORT and KIOSK_WEB_PORT (both commands honour them). If something fails to start, run docker compose -p <project> logs with the project name above.
The tour
Section titled “The tour”Press Start demo. Five steps over real pages:
- The inbox.
- Running an agent, with the step waterfall.
- A budget that returns HTTP 402.
- A signed-receipt check at
/proof. - The sandbox view.
After 120 seconds without input, or when the 30-minute timer ends, the page drops the session token. The server deletes the workspace when its 30 minutes are up.
How visitors are isolated
Section titled “How visitors are isolated”POST /v1/kiosk/sessioncreates a freshkiosk-<rand>tenant and returns a short-lived JWT with rolekiosk. Row-level security is enforced, so visitor B reading visitor A’s run or agent gets404.- The token cannot write settings, connectors or budgets, mint API keys, or delete the tenant (
PAL_AUTHZ_ENFORCE=1is part of the overlay). - A sweep deletes expired tenants through the same erasure path as
DELETE /v1/tenants/{id}, across every table with atenant_idcolumn. - No provider key exists in a kiosk tenant. The server refuses to start in kiosk mode if a provider key is set without a fixture base URL.
Settings
Section titled “Settings”| Variable | Default | Purpose |
|---|---|---|
PAL_KIOSK |
off | 1 (or true, on) enables the endpoint, sweep and guards. Otherwise /v1/kiosk/session is 404. |
PAL_KIOSK_ALLOW_PROD |
off | Required to run kiosk in prod, production or staging. Use only on a dedicated demo host. |
PAL_KIOSK_TTL_MIN |
30 | Session lifetime in minutes. |
PAL_KIOSK_SWEEP_SEC |
60 | How often expired sessions are purged. |
PAL_KIOSK_MAX_SESSIONS |
20 | Live-session cap; over it returns 503. |
PAL_KIOSK_IP_PER_HOUR |
3 | Sessions per client address per hour; over it returns 429. The demo overlay sets 60. |
KIOSK_JWT_SECRET |
random per start | Compose overlay. make demo and pal demo generate one. The control plane refuses kiosk mode with an empty or dev-default JWT_SECRET. |
Kiosk mode also requires PAL_RLS_ENFORCE=1, PAL_AUTHZ_ENFORCE=1 and an explicit JWT_SECRET. The overlay infra/docker/docker-compose.kiosk.yml sets all of them and points PAL_LLM_BASEURL_OPENAI and _ANTHROPIC at the replay server.
Limits
Section titled “Limits”- Answers are recorded, not live. A live-model kiosk needs a separate, capped platform key and is not built.
- The per-address limit is in memory and per process. Behind a proxy, all visitors share one address.
- The sandbox step shows the view only; the overlay does not start the microVM runtime.
Next: Quickstart in 60 seconds. Related: Accounts and teams, Security model.