assay dashboard
Prints a loopback URL and stays up until Ctrl-C.
assay dashboard — read-only console at http://127.0.0.1:4319/
  store       sqlite · ~/.local/state/assay/assay.sqlite
  Ctrl-C to stop.
--json prints the startup envelope instead of the banner (url, bind, port, backend, readOnly, …).

Why it is first-party

Almost every transcript column is readable with any SQL tool. Exactly one column is sealed: the message text. A BI tool gets spend. It cannot read the conversation. The console decrypts on the machine that already has the key.
PanelWhat it answers
SpendWhat this store spent, by day / principal / model, corrected, with provenance. Waste and ROI are sections on this page (#waste, #roi).
SessionsWhich conversations happened, type, product / objective, tokens, cost.
SearchWhat was actually said. Needs the index and the content key.
ProductsWhat the work was for — each trunk is a product.
ObjectivesSlices of each product, with goals under them.
SharesMinted session pages, if sharing is configured.
Type and Pricing accuracy are off the nav. They still exist at /type and /pricing. You set a sitting’s type from the session page. Old /waste and /roi URLs still answer.

Honest empty states

Panels appear only when the store can answer them. Anything turned off is stated in words at the top of the page. A store with no transcripts gets a coherent console without session panels, not a broken one. Search needs two facts: the index tables, and a content key on this machine. Missing either gets a sentence naming which.

Loopback is the boundary

The server has no login. Loopback is what keeps it private. A routable bind is refused unless you pass --unsafe-bind. That flag means unauthenticated read of spend and decrypted conversations. Do not use it on a shared network.

Flags that change what you see

Flag
--db / --pgWhich store
--pricing-overlayLocal rate overlay the pricing panel judges against (same file pricing check reads)
--snapshot <dir>Write a static tree instead of serving
--no-annotateHide the type writer on the session page
--jsonStartup envelope / snapshot manifest
Capture-time filters (--principal, --since, --until, …) apply in snapshot mode.

Snapshot

assay dashboard --snapshot ./console-export
A directory of HTML. Each page carries a fidelity stamp: when, which store, which version, which window. These numbers do not update. Content (decrypted turns) is refused by default in a snapshot. That is on purpose: a folder of files is easy to copy.

CSV and JSON

Spend and several panels export. The figures match assay waste / assay roi / assay products — same reports, not a second SQL.

Embed

The same panels are a web component. Open /embed on a running console and view source. Full contract: Embed.