Otter Stats app icon

macOS 14 Sonoma or newer · Universal · Free, MIT

What your Devin sessions burn,
in the menu bar.

Otter Stats reads the local Devin CLI and Devin Desktop database and shows tokens, turns, model time and an estimated cost at list prices, per agent, model, project and session. Read only. Nothing leaves your Mac.

Install with Homebrew
brew install --cask chris-wozniczek/tap/otter-stats

Then open -a OtterStats. The otter appears in your menu bar.

Ad-hoc signed for now (no Apple Developer ID yet). Homebrew clears the Gatekeeper quarantine flag for you; for the manual download, right-click the app and choose Open the first time.

Otter Stats menu bar popover showing estimated cost, tokens, turns and model time for the last 7 days, a share bar of who burned it, a 14 day timeline, top agents, top models and top sessions
Est. costtokens × list price, not your bill
Tokensinput, output, cache read
Turnsone assistant message with metrics
Model timeseconds the model spent per turn

Dashboard

The full report, as a native window.

Overview, Agents, Models, Timeline, Projects, Sessions, Tools, Efficiency and Methodology. Period picker from today to everything embedded, plus a custom date range with a calendar, search, a pricing class filter (paid, free tier, unknown), and click to filter on any bucket, agent, model, project or session.

Otter Stats · Overview
Otter Stats dashboard overview: KPI tiles for turns, tokens, model time, estimated cost, sessions and cache hit, the who burned it share bar, a stacked tokens per day chart and top agents and models
Otter Stats · Sessions
Otter Stats sessions view listing each session with project, model, age, role share chips, turns, prompts, tokens, time and cost

Same numbers as otter stats

Otter Stats is the usage side of Otter Swarm's /otter:stats report, packaged as a standalone app for people who don't run the plugin. Attribution is structural: each assistant turn is walked up the message tree to its root. Duplicates are collapsed once. Pricing comes from the same price snapshot.

Caveats are shown, not hidden

Duplicate rows, unknown attribution, missing metrics, unpriced models and truncation are all surfaced in the report. When a model has no price, the turn is marked unpriced and the cost shows as a lower bound with a ≥ sign.

Privacy

Everything stays on your Mac.

The sessions database at ~/.local/share/devin/cli/sessions.db is opened read only. There is no account, no telemetry and no server. The only network request the app makes is the optional daily version check against the GitHub Releases API, and it carries nothing about you.

  • Read only access to the local database
  • No data sent anywhere
  • No Dock icon, lives in the menu bar
  • Cost is a local estimate, never an invoice
  • Open source, MIT licensed

Install

Three ways to get it.

Requirements: macOS 14 Sonoma or newer. Devin CLI or Devin Desktop for real data. No Devin data yet? Turn on demo mode and explore the UI with a synthetic database.

Homebrew recommended

brew install --cask chris-wozniczek/tap/otter-stats open -a OtterStats

Upgrade with brew upgrade --cask otter-stats. Remove with brew uninstall --cask otter-stats; add --zap to also delete settings and demo data.

Manual download

Download OtterStats.zip from the latest release, unzip, drag OtterStats.app to /Applications, open it.

The app is ad-hoc signed, so on first launch macOS may ask you to confirm: right-click the app and choose Open, or allow it under System Settings › Privacy & Security.

Latest release

Build from source

git clone https://github.com/chris-wozniczek/otter-stats.git cd otter-stats Scripts/build-app.sh --zip open dist/OtterStats.app

Produces a universal, ad-hoc signed dist/OtterStats.app. Set CODESIGN_ID to sign with your own identity.

First run

  1. Otter Stats lives only in the menu bar. Look for the otter next to the clock.
  2. If you already use Devin CLI or Devin Desktop, your usage appears immediately. Otherwise click Try demo data.
  3. For cost estimates the app needs a price snapshot. Settings › Refresh prices runs devin models list once, or it reuses the one Otter Swarm writes to ~/.config/devin/otter/prices.json.

Data sources

Where the numbers come from.

WhatDefaultOverride
Sessions database~/.local/share/devin/cli/sessions.dbOTTER_SESSIONS_DB or Settings
Price snapshot~/.config/devin/otter/prices.jsonOTTER_PRICES_PATH or Settings
Role pins (drift check)~/.config/devin/agents/<role>.mdnone

Methodology

How a turn becomes a number.

Turn

One assistant chat_message row with usage metrics. Duplicate rows for the same message are collapsed once, and the count is reported.

Buckets

Lead = normal, plan and ask profiles. Otter workers = planner, researcher, implementer, reviewer, tester, interrogator. Other subagent_* profiles = Other subagents. Summarizer and compactor = Housekeeping. Chains that can't be resolved = Unknown.

Tokens

Input + output + cache read. Cache writes are shown separately.

Estimated cost

Per-turn tokens × the price snapshot. Models the snapshot marks as free tier count as $0. It is a list price equivalent of the usage, computed locally, never an invoice.

Pricing classes

Every model is Paid, Free tier or Unknown according to the snapshot. Unknown turns are unpriced and turn the total into a lower bound marked ≥. You can filter the whole dashboard by class.

Equivalent paid cost

What the free tier turns would have cost at the paid SWE rate (SWE-1.7 when it is in the snapshot). Shown next to the estimate as a simulation, never as a charge.

FAQ

Questions people ask first.

Does it work without Devin installed?

The app opens, but there is nothing to read. Turn on Settings › Demo mode or click Try demo data to generate a deterministic synthetic database in ~/Library/Application Support/OtterStats/ and explore the UI.

I am on a subscription plan. Why do I see dollars?

The dollar figure is your token usage priced at the per-token list rates from devin models list. It is there so you can compare agents, models and sessions on one scale and see where the usage goes. It is not what you are charged. On a plan your actual cost is the plan. Models the snapshot marks as free tier count as $0, and a separate Equivalent paid cost shows what those turns would have cost at the paid SWE rate, labelled as a simulation.

Why does cost show a ≥ sign?

At least one model in the period has no entry in the price snapshot. Those turns are counted as unpriced and the total is a lower bound. Run Settings › Refresh prices to fetch a fresh snapshot.

Is this an official Devin or Cognition product?

No. It is an independent open source app that reads the local database the Devin CLI writes. Cost figures are estimates from a price snapshot and are not a bill.

Which architectures are supported?

The release build is a universal binary for Apple silicon and Intel Macs, on macOS 14 Sonoma or newer.

How do updates work?

At launch and then once a day the app asks the GitHub Releases API for the latest version. When a newer release exists you get a banner in the popover. Settings › Updates has Check now and lets you unskip a version. The app never downloads or installs updates itself; use brew upgrade --cask otter-stats or the release page.

Can I reuse the engine?

Yes. OtterStatsCore is a Swift package with no UI dependency: read only SQLite reader, tree attribution, usage cube, slicing and filters, prices and a synthetic fixture generator. It can back a widget extension or a CLI.

See what your sessions burn.

brew install --cask chris-wozniczek/tap/otter-stats