AI code intelligence: token tracking, attribution, cost analysis for Claude Code, Codex, Cursor
Project description
obsly-ai
AI code intelligence: token tracking, attribution, and cost analysis for Claude Code, Codex, and Cursor.
obsly-ai is one place to see what your AI coding agents are spending, what's left in your usage windows, and which lines of code they actually wrote. It works locally, supports Claude Max + Codex side by side, and ships a zero-dependency core so you can drop it into any agent's process without a virtualenv dance.
What you get
- Live dashboard — Claude weekly / Sonnet / 5h utilization and Codex 7d / 5h windows in one view, with burndown charts and live API calls.
- macOS menubar —
Claude: xx%andCodex: yy%always visible, with reset times and pace in the dropdown. - AI code attribution (
gitai) — git-notes-based record of which code each AI agent wrote, queryable withai-blameandai-stats. Zero dependencies, runs in agent hooks. - LLM proxy (optional) — mitmproxy addon that captures provider, model, tokens, cost, repo, branch, and git user from intercepted API calls. Enterprise team dashboard included.
Claude stays on its own calculation path. Codex is added as a separate source with its own cycle and resets — never forced into Claude's billing window.
Installation
# Core: dashboard + gitai attribution (zero dependencies)
pip install obsly-ai
# With macOS menubar
pip install "obsly-ai[menubar]"
# With LLM proxy + team dashboard
pip install "obsly-ai[proxy]"
# Everything (for development)
pip install -e ".[all]"
Requires Python 3.10+.
Quickstart
# Live web dashboard at http://localhost:8765
obsly-ai live
# macOS menubar
obsly-ai menubar
# One-shot analytics
obsly-ai analyze
obsly-ai burndown
obsly-ai report
The legacy claude-dashboard entrypoint is kept as an alias.
Main views
Live dashboard
- Claude weekly utilization, Sonnet utilization, and 5h window
- Codex 7d used / left, 5h used, reset times, plan type
- Claude burndown chart + separate Codex chart from local session logs
- Live API calls, session costs, and recent activity
obsly-ai live
obsly-ai live --no-browser --port 8765
Menubar
Claude: xx%andCodex: yy%in the bar- Claude weekly / Sonnet / 5h, Codex 7d / 5h, reset times, pace, recent session costs in the dropdown
obsly-ai menubar
AI code attribution (gitai)
obsly-ai ships a zero-dependency attribution engine that records which AI agent wrote each line of code, stored in refs/notes/ai (git notes). It installs hooks into Claude Code, Codex, Cursor, and Windsurf so attribution happens automatically as the agent edits files.
Install the hooks
# Install hooks into every detected agent (Claude Code, Codex, Cursor, Windsurf)
# plus pre-commit / post-commit / post-rewrite hooks in the current repo
obsly-ai ai-install
# Or target a single agent
obsly-ai ai-install --agent claude-code
obsly-ai ai-install --dry-run # preview without writing
# Check what's wired up
obsly-ai ai-status
# Remove hooks
obsly-ai ai-uninstall
ai-install writes to each agent's own settings file (~/.claude/settings.json, ~/.codex/hooks.json, ~/.cursor/hooks.json, ~/.codeium/windsurf/hooks.json) and to .git/hooks/ in the current repo. It never touches your git config, staging area, or working tree.
Query attribution
ai-blame path/to/file.py # like git blame, with AI agent + session per line
ai-blame path/to/file.py -L 40,80 # limit to a line range
ai-blame path/to/file.py --cost # join with proxy cost data
ai-stats # recent commits, % AI per commit
ai-stats --repo # repo-wide breakdown by agent / author
ai-stats --durability # how much AI-written code survives over time
The whole gitai/ package uses only Python stdlib so it can run safely inside any agent's process without polluting their environment.
LLM proxy + team dashboard (optional)
pip install "obsly-ai[proxy]"
obsly-ai proxy # start mitmproxy with the obsly addon
obsly-ai server # team dashboard at http://localhost:8800
obsly-ai doctor # health checks for proxy + cert + storage
Captures every LLM API call (Anthropic, OpenAI, Mistral, DeepSeek) and attributes it via PID → cwd → git remote → branch → git config user.email. Events are persisted as JSONL locally and aggregated in the team dashboard.
Data sources
Claude
Reads the Claude Code OAuth token from macOS Keychain (Claude Code-credentials) and calls:
GET https://api.anthropic.com/api/oauth/usage
Authorization: Bearer <your token>
anthropic-beta: oauth-2025-04-20
That's the same utilization source behind /usage. It also parses ~/.claude/projects/**/*.jsonl for per-call detail.
Codex
Local-only, from ~/.codex/sessions/**/*.jsonl. Parses token_count events and uses:
rate_limits.secondary.used_percent→ 7-day windowrate_limits.primary.used_percent→ 5-hour windowresets_at→ reset timesplan_typewhen present
Privacy
- All log parsing is local
- Claude project logs and Codex session logs are read-only
- The only outbound call is the Claude usage API to Anthropic, using your own local OAuth token
- The proxy stores events locally as JSONL by default; the team dashboard is opt-in
Project layout
claudedashboard/ # Core package
cli.py # Unified entrypoint (obsly-ai / claude-dashboard)
live.py # Live SSE dashboard (port 8765)
analyze.py # Text analytics
burndown.py # Weekly burndown
report.py # One-shot HTML report
menubar.py # macOS menubar [extra: menubar]
proxy/ # LLM traffic proxy [extra: proxy]
gitai/ # AI code attribution (zero deps)
saas/ # Web product (landing, onboarding, dashboard)
tests/ # pytest suite
See CLAUDE.md for development guidelines (TDD, dependency tiers, hook safety rules).
Development
pip install -e ".[all]"
pytest tests/ -v
The project follows strict TDD and a three-tier dependency policy: core + gitai/ are pure stdlib, optional features are pinned in pyproject.toml extras, dev tools are isolated. See CLAUDE.md for details.
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file obsly_ai-0.3.0.tar.gz.
File metadata
- Download URL: obsly_ai-0.3.0.tar.gz
- Upload date:
- Size: 114.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bbfeaccb4a08b75f1a7e257933ad302f80ac6e33867fe82ec205f765967de411
|
|
| MD5 |
1655e37a8df16b8abf40505536976e3a
|
|
| BLAKE2b-256 |
ac4e7cb2e6e2b639d6436fe7a884fe0483d25051b16b8f05c803edfb16ef02a5
|
File details
Details for the file obsly_ai-0.3.0-py3-none-any.whl.
File metadata
- Download URL: obsly_ai-0.3.0-py3-none-any.whl
- Upload date:
- Size: 102.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
846e59f8c9baf0e4df0ec30cc19886ca1bc60605fa23c6e4e38ccdae403476a8
|
|
| MD5 |
3de638a8ef1f9324cc8a2c7e76d67ab1
|
|
| BLAKE2b-256 |
f7e25f392c01b141b00f05b44aa6e6c5061f2768c0eb0bd90b52aa875f5497d9
|