Operations · 03 macOS only

The bundled dashboard

A small free local visualiser at localhost:3000. Reads the daemon's loopback API. Open source under Apache 2.0.

macOS 12+ · Python 3.11+ Reading time 2 min Updated May 11, 2026

The Halton Meter dashboard is a small Next.js app that runs locally and reads the daemon’s loopback HTTP API. It opens at localhost:3000 once the daemon is running.

It is a free accessory — most operators never need it. halton-meter report covers the same data from the terminal in two-thirds the time. The dashboard exists for when a visual breakdown is faster: filtering by project, watching cost-per-call as it changes, scrolling captured- request bodies side by side.

What it is, what it isn’t

The dashboard is open source under Apache 2.0. The daemon it talks to is not — the daemon is a local binary distributed on PyPI. They are two separate processes with two separate distribution channels. The dashboard exists to visualise what the daemon already captured; it is not a separate data plane.

The dashboard does not transmit data anywhere. Its only network call is to 127.0.0.1:8765 — the daemon’s loopback API. It has no analytics endpoint, no version check, no crash reporter. If you point Little Snitch at the dashboard process you should see exactly one outbound flow: localhost.

Where to find it

When the daemon is running, the dashboard ships alongside it at:

open http://localhost:3000

The page reads from the daemon’s API at 127.0.0.1:8765 and renders charts, per-project breakdowns, and a captured-request viewer. Pricing data, project tags, redaction settings — everything the dashboard shows is the same data halton-meter report reads from the same SQLite file.

How it talks to the daemon

The daemon exposes a small HTTP API on 127.0.0.1:8765:

  • /api/projects — project list and tags
  • /api/calls — captured calls, with pagination and filters
  • /api/bodies — captured request/response bodies (when body capture is enabled)
  • /api/pricing — current pricing rates per provider/model

The dashboard reads these endpoints. CORS is restricted to http://localhost:3000 by default; the dashboard does not work from a different origin without changing the daemon’s CORS allowlist (which you should not do).

What’s next