budi

May 15, 2026 · View on GitHub

CI Release Downloads License GitHub stars

Local-first cost analytics for AI coding agents. See where your tokens and money go across Claude Code, Cursor, Codex, Copilot CLI, and Copilot Chat (VS Code) — broken down by repo, branch, ticket, and file.

brew install siropkin/budi/budi && budi init

Everything stays on your machine by default. Optional cloud sync pushes aggregated daily metrics to a cloud dashboard — prompts, code, and responses never leave your machine.

budi CLI demo

Cloud dashboard screenshots

Overview — cost visibility across your projects and team

budi dashboard — cost overview

Repos & Tickets — cost breakdown by project, branch, and ticket

budi repos

Sessions — recent sessions across your machines and team

budi sessions

What budi does

  • Tracks every AI coding agent — Claude Code, Cursor, Codex CLI, Copilot CLI, and Copilot Chat (VS Code) in one place
  • Per-message cost and tokens — not just session totals; every API call attributed individually
  • Repo, branch, and ticket breakdown — know which project, PR branch, or ticket is driving spend
  • Session health — detects context bloat, cache degradation, and cost acceleration with actionable tips
  • Live status line in Claude Code, Cursor, and VS Code showing rolling 1d / 7d / 30d spend (VS Code aggregates over Copilot Chat + any other detected provider)
  • Cloud dashboard at app.getbudi.dev — for solo developers and teams; optional sync sends only aggregated metrics, prompts and code never leave your machine
  • ~6 MB Rust binary, zero config required, minimal footprint

Ecosystem

budi ← you are hereCore Rust daemon and CLI
budi-cloudCloud dashboard and ingest API at app.getbudi.dev — for solo developers and teams
budi-cursorVS Code / Cursor status bar extension
budi-jetbrainsJetBrains IDE status bar plugin (Kotlin) — Marketplace listing
homebrew-budiHomebrew tap for brew install siropkin/budi/budi
getbudi.devWebsite and documentation

Supported agents

AgentStatusHow
Claude CodeSupportedLive JSONL transcript tailing
Codex CLISupportedLive transcript tailing
CursorSupportedLive tailing + Usage API reconciliation
Copilot CLISupportedLive transcript tailing
Copilot Chat (VS Code / Cursor)SupportedLive JSON/JSONL tailing + GitHub Billing API reconciliation (ADR-0092)
Copilot Chat (JetBrains)Supported (metadata + billing API)Session-level discovery under ~/.config/github-copilot/<ide-slug>/ (ADR-0093) + GitHub Billing API reconciliation for per-turn costs
Gemini CLIDeferredTracked in #294

All agents also support one-time historical import via budi db import.

Install

Homebrew (macOS / Linux) — recommended

brew install siropkin/budi/budi && budi init

Shell script (macOS / Linux)

curl -fsSL https://raw.githubusercontent.com/siropkin/budi/main/scripts/install-standalone.sh | bash

Windows (PowerShell)

irm https://raw.githubusercontent.com/siropkin/budi/main/scripts/install-standalone.ps1 | iex

Or paste this into your AI coding agent: Install budi from https://github.com/siropkin/budi following the install instructions in the README

Build from source, Windows notes, version pinning

From source — requires Rust toolchain

git clone https://github.com/siropkin/budi.git && cd budi && ./scripts/install.sh

Windows source build (PowerShell):

git clone https://github.com/siropkin/budi.git
cd budi
cargo build --release --locked
$BinDir = Join-Path $env:LOCALAPPDATA "budi\bin"
New-Item -ItemType Directory -Path $BinDir -Force | Out-Null
Copy-Item .\target\release\budi.exe $BinDir -Force
Copy-Item .\target\release\budi-daemon.exe $BinDir -Force
& (Join-Path $BinDir "budi.exe") init

Binaries install to %LOCALAPPDATA%\budi\bin. Restart your terminal after install.

Version pinning: set VERSION=v8.2.1 before the curl command, or $env:VERSION="v8.2.1" on PowerShell.

One install on PATH. Do not mix Homebrew with ~/.local/bin — mismatched budi and budi-daemon versions break daemon restarts. budi init warns if it detects duplicates.

Quick start

# 1. Install and initialize (starts daemon, installs status line, detects agents)
brew install siropkin/budi/budi && budi init

# 2. Use your agent normally — budi tails its transcripts automatically
claude   # or: codex / cursor / gh copilot

# 3. Verify everything is working
budi doctor

# 4. See today's cost
budi status

# Optional: import past sessions
budi db import

budi init starts the daemon, installs the platform autostart service, and wires the Claude Code status line and Cursor extension. It does not patch shell profiles or editor settings. Run budi doctor any time to check health end-to-end.

Common commands

budi status                  # daemon health + today's cost
budi stats                   # cost and token summary
budi stats projects          # repos ranked by cost
budi stats branches          # branches ranked by cost
budi stats tickets           # tickets ranked by cost
budi stats models            # model breakdown
budi stats files             # files ranked by cost
budi sessions                # recent sessions with cost and health
budi sessions <id>           # session detail: cost, models, vitals, tags
budi sessions latest         # detail + vitals for the most recent session
budi doctor                  # full health check
budi db import               # import historical transcripts (one-time backfill)
budi update                  # update to latest release

Data commands accept --period today|week|month|all (or relative like 7d, 2w, 1m) and --format json for scripting. See the full CLI reference below.

Status line

budi init wires a live cost display into Claude Code and Cursor automatically (pass --no-integrations to skip).

budi · \$1.24 1d · \$8.50 7d · \$32.10 30d

Windows show rolling 1d / 7d / 30d — not calendar reset at midnight. Customize via ~/.config/budi/statusline.toml:

slots = ["1d", "7d", "30d"]   # default quiet preset
# slots = ["session", "message"]          # session + last-message cost
# slots = ["session", "message", "1d"]    # session + message + rolling 1d

Available slots: 1d, 7d, 30d, session, message, branch, project, provider.

/budi Claude Code skill

budi init also drops a tiny Claude Code skill at ~/.claude/skills/budi/SKILL.md. From inside Claude Code, type /budi to surface live vitals — context bloat, cache hit rate, retry loops, cost acceleration — for the current session in this project, not the global "latest" one. The skill resolves to the right session even when multiple Claude Code windows are open across projects, because resolution is scoped to your current working directory rather than global recency. The terminal equivalent is budi sessions current. Pass --no-integrations to budi init to opt out, or budi integrations install --with claude-code-budi-skill to install later.

Cloud sync (optional)

Disabled by default. Get set up in two commands:

budi cloud init --api-key budi_your_key_here   # get your key at app.getbudi.dev → Settings
budi init                                      # restart daemon to pick up config
budi cloud status                              # confirm: state: ready

Only pre-aggregated daily rollups sync — prompts, code, and responses never leave your machine. See Privacy for full details.

Privacy

Budi is local-first. All data lives in ~/.local/share/budi/ (Unix) or %LOCALAPPDATA%\budi (Windows). The daemon reads the transcript files your agent already writes to disk and stores derived analytics: timestamps, token counts, model names, costs, and attribution tags. Prompts, code, and responses are never stored or transmitted.

Cloud sync (optional) sends only numeric aggregates — token counts, costs, model names, hashed repo IDs, branch names, and ticket IDs. Raw payloads, file contents, and email addresses are structurally excluded from every sync payload. See ADR-0083 for the full privacy contract.

Troubleshooting

No data after setup:

  1. budi status — check daemon health
  2. budi doctor — verify transcript visibility
  3. Send a prompt to your agent, then check budi stats
  4. For historical data: budi db import

Daemon won't start:

lsof -i :7878              # check if port is in use
pkill -f "budi-daemon"     # kill stale process
budi init                  # restart

Windows: Get-NetTCPConnection -LocalPort 7878 -State Listen / taskkill /IM budi-daemon.exe /F

Status line not showing in Claude Code:

budi integrations list
budi integrations install --with claude-code-statusline
# then restart Claude Code

Cursor extension offline or quiet: Run budi doctor, then Budi: Refresh Status in Cursor. Open a Cursor chat once so it creates its local session files, then recheck budi status.

Daemon doesn't survive reboots: budi autostart status — if not installed, run budi autostart install.

Uninstall

budi uninstall          # stops daemon, removes autostart, status line, config, and data
budi uninstall --keep-data  # preserve the analytics database

Remove binaries separately:

brew uninstall budi                            # Homebrew
rm ~/.local/bin/budi ~/.local/bin/budi-daemon  # shell script install
# Windows: irm https://raw.githubusercontent.com/siropkin/budi/main/scripts/uninstall-standalone.ps1 | iex

Contributing

Repository guidance is split across four top-level files so each has one audience:

  • README.md — end-user install, usage, and the daemon API surface (you are here).
  • CONTRIBUTING.md — local quality checks, supply-chain policy, PR workflow.
  • SOUL.md — canonical architecture, data flow, attribution contract, release flow, and AI-agent guidance.
  • AGENTS.md / CLAUDE.md — thin compatibility pointers that redirect AI tooling to SOUL.md.

ADRs live in docs/adr/.

Running CI checks locally

The six checks CI runs on every PR (issue #808):

cargo fmt --all -- --check                                       # formatting
cargo clippy --workspace --all-targets --locked -- -D warnings   # lints
cargo test --workspace --locked                                  # tests
cargo +nightly udeps --workspace --all-targets                   # unused deps (needs nightly)
cargo machete                                                    # unused deps (secondary pass)
cargo deny --all-features check                                  # supply-chain policy

One-time install of the supporting tools:

rustup toolchain install nightly                # for cargo-udeps
cargo install cargo-udeps cargo-machete cargo-deny --locked

License

MIT


Full CLI reference

Launch and onboarding:

budi init                          # start daemon + install autostart + show detected agents
budi db import                     # one-time import of historical transcripts (shows per-agent progress)
budi db import --format json       # JSON output with per-agent file/message breakdown (scripting)

Monitoring and analytics:

budi status                        # quick overview: daemon and today's cost
budi stats                         # usage summary with cost breakdown
budi stats models                  # model usage breakdown
budi stats projects                # repos ranked by cost
budi stats projects --include-non-repo  # also show per-folder detail for non-repo work
budi stats branches                # branches ranked by cost
budi stats branch <name>           # cost for a specific branch
budi stats tickets                 # tickets ranked by cost
budi stats ticket <id>             # cost for a specific ticket, with per-branch breakdown
budi stats activities              # activities ranked by cost (bugfix, refactor, …)
budi stats activity <name>         # cost for a specific activity, with per-branch breakdown
budi stats files                   # files ranked by cost (repo-relative paths only)
budi stats file <path>             # cost for a specific file, with per-branch + per-ticket breakdown
budi stats --provider codex        # filter stats to a single provider
budi stats tag ticket_id           # cost per ticket value (raw tag view)
budi stats tag ticket_prefix       # cost per team prefix
budi stats files --limit 0         # show every row (default limit is 30)
budi sessions                      # list recent sessions with cost and health
budi sessions --ticket <id>        # sessions tagged with a ticket
budi sessions --activity <name>    # sessions tagged with an activity
budi sessions <id>                 # session detail: cost, models, vitals, tags, work outcome
budi sessions latest               # detail + vitals for the most recent session

Diagnostics and maintenance:

budi doctor                        # check health: daemon, tailer, schema, transcript visibility
budi doctor --deep                 # run full SQLite integrity_check (slower)
budi doctor --format json          # JSON output for scripting
budi pricing                       # pricing manifest source, version, fetched-at, model count (read-only)
budi pricing status                # same as bare `budi pricing` (long form)
budi pricing sync                  # fetch the latest LiteLLM manifest into the local cache
budi pricing --format json         # same data in JSON
budi cloud init                    # generate ~/.config/budi/cloud.toml from a commented template
budi cloud init --api-key KEY      # write the key + enable sync in one step
budi cloud status                  # cloud sync readiness + last-synced-at + queued records
budi cloud sync                    # push queued local rollups to the cloud now
budi cloud sync --full             # drop watermarks then re-upload everything (cloud reset && cloud sync in one step)
budi cloud sync --full --yes       # same, non-interactive (CI / scripts)
budi cloud reset                   # reset watermarks so the next sync re-uploads everything (org switch / data wipe)
budi autostart status              # check daemon autostart service
budi autostart install             # install the autostart service
budi autostart uninstall           # remove the autostart service
budi db import --force             # re-ingest all data from scratch
budi db check                      # verify schema; report drift (read-only)
budi db check --fix                # verify + auto-repair drift and run migrations
budi update                        # check for updates (auto-detects Homebrew)
budi update --version <name>       # update to a specific version
budi integrations list             # show what is installed vs available
budi integrations install          # install all recommended integrations
budi integrations install --with claude-code-statusline
budi integrations install --with cursor-extension
budi uninstall                     # remove status line, config, and data
budi uninstall --keep-data         # uninstall but keep analytics database

Data views accept --period today|week|month|all (or relative like 7d, 2w, 1m) and --format json for scripting. Side-effecting commands (init, update, uninstall, db check, cloud init, integrations install) do not take --format json.

How budi compares
budiccusageClaude /cost
Multi-agent supportYes (Claude Code, Codex CLI, Cursor, Copilot CLI, Copilot Chat)Claude Code onlyClaude Code only
Live local transcript tailingYesNoNo
Cost historyPer-message + dailyPer-sessionCurrent session only
Cloud dashboardYes (app.getbudi.dev)NoNo
Status line + session healthYes (with actionable tips)NoNo
Cost attribution (branch/ticket/file)YesNoNo
PrivacyLocal-first, optional cloud sync (aggregates only)LocalBuilt-in
Setupbudi initnpx ccusageBuilt-in
Built withRustTypeScript
Architecture
┌──────────┐    HTTP     ┌──────────────┐    SQLite    ┌──────────┐
│ budi CLI │ ──────────▶ │ budi-daemon  │ ───────────▶ │  budi.db │
└──────────┘             │  (port 7878) │              └──────────┘
                         │              │                    ▲
                         │  - analytics │    Pipeline        │
                         │  - tailer    │ ───────────────────┘
                         │  - import    │    Extract → Normalize → Enrich → Load
                         └──────────────┘

       Claude/Codex/Copilot JSONL files  ──┐
       Cursor transcripts + Usage API       ├──▶ shared ingest pipeline
       Historical import (budi db import)  ──┘

A lightweight Rust daemon (port 7878) manages a single SQLite database. The daemon watches each provider's local transcript roots, tails incremental appends through the shared pipeline, and writes canonical messages + tag rows. The CLI is a thin HTTP client — it never touches the database directly.

Data model:

TableRole
messagesOne row per API call — all token/cost data
sessionsLifecycle context (start/end, duration, mode)
tagsFlexible key-value pairs per message
sync_stateIncremental ingestion progress + cloud sync watermarks
message_rollups_hourlyDerived hourly aggregates for fast reads
message_rollups_dailyDerived daily aggregates for summary scans

See SOUL.md for the full architecture, data flow, and module boundaries.

Daemon API

The daemon runs on http://127.0.0.1:7878. Privileged routes (/admin/*, POST /sync*) are loopback-only.

System:

MethodEndpointDescription
GET/healthHealth check
POST/syncSync recent data (loopback-only)
POST/sync/allLoad full transcript history (loopback-only)
POST/sync/resetWipe sync state + full re-sync (loopback-only)
GET/sync/statusSyncing flag + last_synced

Analytics:

MethodEndpointDescription
GET/analytics/summaryCost and token totals
GET/analytics/messagesMessage list (paginated)
GET/analytics/projectsRepos ranked by usage
GET/analytics/branchesCost per git branch
GET/analytics/ticketsCost per ticket
GET/analytics/activitiesCost per activity bucket
GET/analytics/filesCost per repo-relative file
GET/analytics/modelsModel usage breakdown
GET/analytics/sessionsSession list (paginated)
GET/analytics/sessions/{id}Session metadata and aggregate stats
GET/analytics/session-healthSession health vitals and tips
GET/analytics/statuslineStatus line data (shared provider-scoped contract)
GET/analytics/cache-efficiencyCache hit rates and savings
GET/pricing/statusPricing manifest snapshot
POST/pricing/refreshTrigger immediate LiteLLM manifest refresh (loopback-only)

Most endpoints accept ?since=<ISO>&until=<ISO> for date filtering. Full endpoint list including admin and cloud routes is in SOUL.md.