Garcon

Observability for coding agents. One tiny local proxy sits in front of Claude Code, Codex, OpenClaw, Hermes or anything else you run, records what every call cost in tokens, and shows it all in one dashboard, across accounts, tools and, with sync on, every machine you work from.

The Garcon dashboard's Overview: request, token, cache-hit, error-rate and latency tiles with deltas against the prior period, and a requests-by-harness chart over seven days.
The Overview, on synthetic data: two accounts, three tools, seven days.

The problem

Coding agents burn tokens on your behalf all day, and the evidence is scattered. Each tool keeps its own logs in its own format, each provider shows a different slice of the bill, subscription plans hide the per-call cost entirely, and none of it lines up across the laptop, the desktop and the server you also run agents on. Questions that should be trivial are not: which account is doing the work, which model, how much context is being re-read every turn, how much of that is cache hits, how fast the model is streaming, and what all of it would cost at list price.

The usual answer is a gateway such as LiteLLM: put a proxy in the path of every LLM call and observe the traffic there instead of in each tool. That is exactly the value proposition of Garcon. The difference is where the line is drawn.

What Garcon does

Harnesses send requests through Garcon to providers; Garcon records usage locally, serves a dashboard, and optionally syncs with other machines through a Supabase project. Claude CodeCodexOpenClaw, Hermesany other client api.anthropic.comchatgpt.comapi.openai.comopenrouter.ai Garcon 127.0.0.1:4141 forwards every requestunchanged, streams the reply records model + tokensper harness and account usage.jsonl and the dashboard your Supabase optional: other machines
Every agent points at a local URL that names the tool, the account and the provider. Nothing about the request or the reply is changed; Garcon only reads the usage block the provider already sends back.

Each agent is pointed at http://127.0.0.1:4141/<harness>/<account>/<provider>/, where harness names the tool, account is the login it uses (an email), and provider is the upstream. Completion calls are appended to a local log with the model and the token counts the provider reported: uncached input, cache read, cache write and output. Claude Code and Codex talk to one provider each, so their URLs omit the segment: /claude/<account>/ implies anthropic and /codex/<account>/ implies chatgpt.

SegmentUpstreamRecorded calls
anthropicapi.anthropic.com/v1/messages
openaiapi.openai.com/v1/responses, /v1/chat/completions
openrouteropenrouter.ai/api/v1/chat/completions
chatgptchatgpt.com/backend-api/codex/responses (ChatGPT-subscription Codex)

Because it is a pure pass-through, it works with subscription logins too: Claude Code on a claude.ai plan and Codex on a ChatGPT plan keep authenticating exactly as before, and Garcon still sees the token counts those calls report. That is the case a gateway that re-issues requests under its own keys cannot cover.

Compared with a gateway like LiteLLM

Same idea, different scope. A gateway is a piece of infrastructure: it fronts many providers, translates between APIs, routes and retries, issues virtual keys, enforces budgets, and stores its telemetry in a database it runs. Garcon deliberately does none of that. It is one binary that does one job for one person, and it keeps the data on the machine unless you say otherwise.

GarconLiteLLM-style gateway
Observability across tools, accounts and machinesYesYes
Requests and repliesForwarded byte for byte; the provider's own auth, streaming and errors pass straight throughNormalised to one API, re-issued with the gateway's keys
Subscription logins (claude.ai, ChatGPT plans)Work unchanged; usage is still recordedGenerally not; the gateway needs API keys
Routing, retries, fallbacks, budgets, virtual keysNone, by designYes, that is the product
Where the data livesA JSONL file in your home directory; optionally a table in a Supabase project you ownThe gateway's Postgres, or a hosted logging service
FootprintNo Go dependencies; one binary with the dashboard inside it, listening on loopback by defaultA Python service plus its database, usually a container or a hosted deployment
SetupInstall from npm, run garcon setup, then connect each harnessA config file of models and keys, a deployment, then a base URL per client
Multiple people or teamsNo; one person, any number of machinesYes

If you need a control plane for a team, run a gateway. If you want to know what your own agents are doing, with nothing to operate and nothing leaving your machine unless you choose, that is Garcon.

What you get

  • One picture of everything: requests, tokens and their composition by harness, account, model and device, over any time range, with period-over-period deltas.
  • Cost you can reason about: estimated spend at published list prices (never a bill; subscriptions bill differently), cache savings, blended price per million tokens, run rate, and an editable price table.
  • Sessions: calls grouped into coding sessions per account, tool and machine, with context growth, peak context, busy time and cost per session.
  • Performance: generation speed and time to first byte by model, latency against output size, and the proxy's own overhead measured separately so it is never confused with the model's time.
  • Every request: a sortable, filterable log with CSV export, and a JSON endpoint for anything else.
  • Every machine: switch on sync and each dashboard shows the union of all your devices, pulled from a table in your own Supabase project.
The Sessions view: a per-account timeline of coding sessions and a table with duration, requests, models, tokens, peak context and estimated cost per session.
Sessions: a burst of calls from one account and tool becomes one row, with its models, peak context and estimated cost.

What it records, and what it never touches

Per completion call: time, harness, account, provider, model, HTTP status, duration, connection timings, and the four token counts. That is the whole row. Prompts, replies, tool calls, file contents, API keys and session ids are never read into the log; the proxy forwards them and forgets them. The dashboard listens on loopback by default. Provider credentials are forwarded but never stored. If you enable sync, the Supabase secret key is saved in an owner-only settings file; see sync security. With sync off, which is the default, Garcon makes no network calls of its own at all.

Quick start

shell
npm install -g ai-garcon@latest
garcon setup

macOS and Linux, x64 and arm64. Node 18+ runs the npm command. Setup starts Garcon at login, checks its version, and prints the dashboard link. No Supabase account is needed for local recording.

  1. Install and startrun the commands above as your normal user. For a foreground trial or source build, see the install guide.
  2. Connect your first harnessopen Settings, choose your tool and account label, and copy its configuration. Restart the tool, make one short request, and check Logs for the new row.
  3. Add your other machinesrepeat installation and harness setup there. For a combined dashboard, create or choose one Supabase project, then reuse its URL and key with a distinct device name on each machine.

Later, run garcon update to update an npm installation and refresh its service. Run garcon doctor to check reachability, versions, first-request progress and sync errors. See updating and troubleshooting.