Your team reviews calls in a browser tab that binds to 127.0.0.1.
hotato serve is a web app over the workspace registry and conversation artifacts: calls, suite health, failure clusters, failure records, release readiness, and drill-ins for the scenario matrix and the conversation inspector. It is built on http.server and sqlite3 from the standard library, and nothing else.
$ hotato serve $ hotato serve --workspace default --port 8321
--host exposes the workspace to your network, and the server prints a warning saying so.The posture
Loopback, a token, an audit trail, and exactly one write route.
The same four properties hold for serve and for console.
127.0.0.1 unless you say otherwise.
Nothing leaves the machine. The default host is loopback; changing it is an explicit flag with a printed warning.
A bearer token on every request.
Generated and stored at mode 0600 under the workspace state directory on first start, or supplied with --token / --token-file. Every request is authenticated.
Append-only, per request.
Every request is audited. Every view reads with SELECTs.
One route, CSRF-fenced.
The single write route is pin-to-contract on a call’s candidate moments. It is audited, and it refuses with a reason rather than writing a bundle it cannot stand behind.
Every view carries a ?format=json mirror, so the same workspace serves a person in a browser and a script in CI without a second API to maintain.
# one command, one process, one tab, opening on the live call feed $ hotato console --production-db ./evidence.sqlite3
mode=ro). Derived score records go to a console.sqlite3 sidecar beside it, never into the evidence itself.- SCORED
- NOT_SCORABLE · with its reason
- ERROR
Calls score as they land, and a call that cannot be scored says so.
console runs the workspace with a score-on-arrival worker: completed sessions are scored one at a time with the deterministic scorer.
All three outcomes are first-class visible states. A recording the input-health gate refuses shows as NOT_SCORABLE with the specific reason attached, rather than disappearing from the feed or being counted as a pass.
The sidecar is derived data, and it says so structurally: serve --rebuild-scores regenerates the entire sidecar from the evidence database and exits, and the same evidence database always rebuilds to identical content.
The whole stack moves on a tarball.
The self-host image runs on an air-gapped host once its one-time steps are done: bring the image over, load it, and start it.
The judge model is pre-seeded the same way — copy the populated model volume, or its backing directory, to the air-gapped host, and the stack runs the judge profile with the model already present.
$ docker save hotato-selfhost:local \ | gzip > hotato-selfhost.tar.gz # move the tarball to the air-gapped host, then: $ gunzip -c hotato-selfhost.tar.gz | docker load
docs/SELF-HOST.md, verbatim.The store the workspace reads is its own command group.
hotato production is the durable evidence plane behind the console, with ten subcommands including ingest, status, finalize, maintain, alerts, audit and delete.
serve --production-db projects that store’s manifests and alerts into the workspace /health view, opened read-only and without access to the payloads. A team can watch the health of live calls without any of them holding a key to the evidence.