Dashboard

A local page with everything at once: what is waiting for you, what each agent has spent against its limits, and every decision in the ledger.

Launching

bash
shotoku ui
Shotoku dashboard: http://127.0.0.1:4402/#token=9f2c… Ledger /home/you/project/data/decisions.jsonl Policy /home/you/project/policy.yaml Open the link above; the token in it is this session's only key. Ctrl+C to stop.

Open the link. The page refreshes every two seconds, so decisions appear while your agent works.

OptionDefaultWhat it does
--port <n>4402Port on 127.0.0.1. 0 picks a free one.
--policy <path>resolvedSame resolution as every command; shotoku where shows it.
--ledger <path>resolvedThe ledger to read and answer in.

What it shows

  • Totals — pending, approved, denied, and spent in the last 24 hours.
  • Pending approvals — who wants to do what, for how much, and why a human is asked, with Approve and Deny. Approving does what shotoku approve does and is recorded with via: dashboard.
  • Budgets — each agent budget from your policy, and each agent's spend on each tool or vendor against the daily limit of the rule it matched.
  • History — every decision, newest first, with the human answer and where it came from. Sort, filter any column, search, and click a row for its full reasons.
  • Ledger integrity — whether the hash chain still verifies.

The tables are AG Grid Community, served from the installed package. The page loads nothing from the internet.


How it is locked down

The dashboard can approve spending, so it is locked to the person at the keyboard:

  • It listens on 127.0.0.1 only, never on your network.
  • Every API call needs the session token from the link. It is new each run, printed only in your terminal, written to no file, and moved out of the address bar on load.
  • Requests must name 127.0.0.1 or localhost as their host, which stops a web page that rebinds its own domain to your machine.
  • Approve and Deny are only accepted from the dashboard's own page, so another site cannot post to it.
  • Everything an agent wrote is shown as text, never as HTML.

What this does not stop: a process running as your user that can read the terminal the token was printed in. For a separation an agent cannot cross, answer on another device with phone approvals.