PRIOR WebUI: Operator Guide
The PRIOR WebUI is a browser dashboard for operating a PRIOR engine: chat with the model and watch the policy gate decide in real time, manage policy packs, issue API keys, apply licenses, and read the compliance audit logs.
It is a standard, unprivileged API client. It holds an Operator API key in the browser's
localStorage and talks to the engine's public /v1, /admin, and /metrics routes exactly like
any customer integration would. There are no UI-only privileges, no server-side session, and
no auth bypass. Ship it as a separate, optional container; the engine image stays headless.
Stack: Vite + React + TypeScript + Tailwind. Typed API client generated from the engine's OpenAPI spec. Self-hosted IBM Plex fonts (no CDN). Dark-first theme with a light toggle.
Connecting (the login screen)
On first load the UI asks for two things, both stored only in your browser's localStorage:
| Field | Example | Notes |
|---|---|---|
| Engine URL | http://localhost:8089 |
The base URL of your PRIOR engine. |
| Operator API key | prior_sk_β¦ |
An Operator or Admin key (from the engine's /admin/keys). |
The key is validated against GET /admin/keys before you enter the dashboard, so a read-only
Viewer key (which lacks admin access) is rejected up front. The key is sent as
Authorization: Bearer <key> on every request.
Cross-origin + HTTPS. The UI and engine are separate origins, so the engine must allow the UI's origin via
PRIOR_ALLOWED_ORIGINS. If you point the UI at a non-localhostengine over plainhttp://, the console warns that the key travels in cleartext, so use HTTPS for any remote engine.
The six tabs
| Tab | What you do there |
|---|---|
| Playground | Live chat + real-time policy X-Ray; a steering-on/off comparison. |
| Analytics | Traffic metrics, refusal rate, latency, traffic-by-zone. |
| Policy & Packs | Ingest governance documents; enable/disable/reload packs. |
| Access | API keys and license management. |
| Audit Log | Safety decisions + control-plane action log, with export. |
| Configuration | Steering-model params, calibration, runtime toggles, live logs. |
Playground
The demonstration surface: watch the gate fire as tokens stream.
- Chat mode. A live chat window streaming from
/v1/chat/completions, with an optional system prompt (note: the system prompt is gated too). The X-Ray panel reads thex-prior-*response headers live and shows the tri-state decision (π’ GREEN passed / π‘ YELLOW flagged / π΄ RED blocked), the winning pack, and whether steering engaged. - Comparison mode. Runs the same prompt twice, side by side: steering off (the raw model) vs steering on (PRIOR re-imposed), so you can prove a jailbreak that lands on the raw model is stopped by PRIOR. Includes preset jailbreak prompts or your own. Runs sequentially (the GPU serializes the two passes) and reports the zone + injection count for each.
Analytics
A live dashboard polled from /metrics every 5 seconds.
- System status band. The active steering model + certification tier (Certified/Beta), loaded pack count, license status, and whether steering enforcement is on.
- Traffic metrics. Total requests, refusal rate (% RED), average gate latency (ms), and total injections / average completion tokens per injection.
- Traffic by zone. A stacked bar of GREEN / YELLOW / RED, with a live indicator when data is flowing.
Policy & Packs
Manage what the engine enforces, all hot, no restart.
- Ingest policy document. Paste raw prose or upload a file (
.txt,.md,.pdf,.docx), optionally name it, and PRIOR extracts the intents, generates exemplars, calibrates thresholds, and (if you opt in) hot-reloads the resulting{name}_guard+{name}_policypacks, typically in 5β15 s. The panel then shows the enforcement mode,t_low/t_high, and the calibration diagnostics (separation, recall, specificity) so you can judge the pack before trusting it. See the engine's Policy & Packs guide. - Active packs table. Every live pack from
/admin/packs/native: name, encoder type, tier, priority, thresholds. Toggle any pack enabled/disabled instantly (no reload), click a name for a detail modal (sensitivity label, exemplar count, span-scoring status), or hot-reload all from disk.
Exemplars and vectors are never exposed; the table shows metadata and counts only, by design.
Access
Operator credentials and licensing.
- API Keys. Create a key with a role (Viewer reads dashboards, Operator manages policies,
Admin has full control) and an optional label (e.g.
ci-pipeline). The rawprior_sk_β¦token is shown once at creation; only a hash is stored server-side. Revoke any key (with a confirmation) from the table. - License. An Active/Unlicensed badge plus the license details: variant, tier, capabilities,
expiry + days remaining, customer id. Upload a
.binlicense file and it's hot-applied with no restart. Links out to the procurement page when unlicensed.
Audit Log
Two compliance logs, both filterable and exportable (CSV/JSON, with a capped row export).
- Safety decisions (
/admin/audit/safety) log every gated request: timestamp, zone, the pack that fired, match score, whether it was steered, and a prompt hash (SHA, never plaintext). Filter by zone / pack / hash. Polled every 5 s. - Control-plane actions (
/admin/audit) cover administrative operations: key create/revoke, license upload, pack reload, and config changes, each with timestamp, action, resource, actor role, and IP. Actor keys are hashed. Filter by action / resource / actor.
Configuration
Engine tuning and observability.
- Steering model. The loaded model's name, layer count, golden-layer index (depth), alpha
(strength), and calibration status, with a Certified vs Beta badge, plus the
.ggufmodels available on disk (with sizes). Auto-calibrate runs the golden + alpha sweeps (1β4 min) and persists the certification; Share calibration downloads the payload and can submit it to the Eagle Logic registry. (Loading or switching the active model is driven through the engine's model API; see the API Reference.) - Runtime settings. Toggle require API key on
/v1live (no restart) and set the log verbosity (DEBUG/TRACE gated behind a diagnostic token). The structured-JSON-logs flag is boot-time and shown read-only. - Logs. A live tail of the last ~300 lines from
/admin/logs, filterable by level and color-coded by severity, polled every 3 s with a live toggle.
Running the WebUI
Develop
npm install
npm run dev # http://localhost:5173 (set your engine URL + key on the login screen)
Build & containerize
npm run build # -> dist/ (static assets)
docker build -t prior-webui . # multi-stage: node:22-alpine build, then nginx-unprivileged
docker run --rm -p 8080:8080 prior-webui
The runtime image is nginx-unprivileged running as a non-root user, so it serves on 8080
(not 80). nginx.conf provides the SPA index.html fallback for deep links and hard-caches the
hashed /assets/ bundles. It does not proxy /v1 or /admin, because the engine is a separate
origin set on the login screen, so the engine must allow the UI's origin via PRIOR_ALLOWED_ORIGINS.
Deploying alongside the engine
operator browser
β
βΌ
prior-webui (nginx :8080, static SPA) ββββ Bearer key + CORS βββββΆ PRIOR engine (:8089)
The UI holds no secrets of its own and keeps no server-side state; every operator authenticates with their own engine-issued key. You can run one UI for many engines (switch the Engine URL) or one per engine; it's stateless either way.
Security notes
- Credentials (API key, engine URL, theme) live only in the browser's
localStorage. Nothing is sent to any WebUI backend, because there isn't one. - Give each operator their own scoped key; revoke from Access β API Keys when someone leaves.
- Use HTTPS and a restricted
PRIOR_ALLOWED_ORIGINSfor any non-local deployment. - The UI cannot exceed the permissions of the key it holds: a Viewer key simply can't reach the admin surfaces.
For the engine itself, see the PRIOR product documentation.