---
title: "Dashboard"
description: "The read-only local console — spend, sessions, products, search, shares."
---

```bash
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.

## Nav

| Panel | What it answers |
|---|---|
| **Spend** | What this store spent, by day / principal / model, corrected, with provenance. Waste and ROI are sections on this page (`#waste`, `#roi`). |
| **Sessions** | Which conversations happened, type, product / objective, tokens, cost. |
| **Search** | What was actually said. Needs the index **and** the content key. |
| **Products** | What the work was **for** — each trunk is a product. |
| **Objectives** | Slices of each product, with goals under them. |
| **Shares** | Minted 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` / `--pg` | Which store |
| `--pricing-overlay` | Local rate overlay the pricing panel judges against (same file `pricing check` reads) |
| `--snapshot <dir>` | Write a static tree instead of serving |
| `--no-annotate` | Hide the type writer on the session page |
| `--json` | Startup envelope / snapshot manifest |

Capture-time filters (`--principal`, `--since`, `--until`, …) apply in snapshot mode.

## Snapshot

```bash
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](/embed).
