robinebers/openusage
58.2
Adequate · 30 September 2026
35.8k
lines of production code
Swift
primary language
2
measurements over time
What this system is
OpenUsage is a macOS application that provides native spend tracking and unified usage history for AI coding assistants. It replaces legacy tracking methods with a system that reads directly from local provider logs and CSV exports, calculating costs using a flexible pricing engine. The app features a Swift-based menu-bar interface with iCloud sync support, allowing users to monitor token usage and expenses across multiple providers.
Features
Introduce native spend tracking and unified usage history
The app replaces the legacy ccusage-based spend tracking with a new native log-scanning system that reads usage directly from local provider logs (Claude, Codex, Grok, etc.) and Cursor CSV exports. This change introduces a provider-neutral daily usage model and a unified pricing engine that resolves costs using a bundled supplement, LiteLLM, and models.dev catalogs, supporting complex token breakdowns (input, cache, long-context) and fast-variant multipliers. Usage history is now structured as a machine-local or account-wide document suitable for iCloud sync, and the dashboard now displays native spend tiles and usage trend charts powered by this new data pipeline.
Sources · high confidence
Behavioural changes
Build and release scripts now support iCloud sync and universal binaries
The build and release scripts have been updated to support iCloud synchronization and cross-platform distribution. The release script now produces a universal binary (Apple Silicon and Intel) and generates dSYM files for crash symbolication. Both dev and release builds now include iCloud entitlements and provisioning profile handling, enabling document sync. Additionally, the release build checks for updates hourly instead of daily, and the app version string now displays the full version including beta suffixes.
script · high confidence
Native Swift rewrite with improved first-run experience and stability fixes
OpenUsage has been rewritten in native Swift, replacing the legacy Tauri edition. New installs now automatically detect and enable only the providers actually installed on the machine, rather than showing all available tools by default. The app now cleans up leftover autostart LaunchAgents from previous versions to prevent duplicate launches at login. Stability is improved with a kernel-backed single-instance lock to prevent duplicate menu-bar icons during startup races, and a new refresh wake signal ensures provider changes are processed immediately without being lost during background data passes.
Sources/OpenUsage · high confidence
Switch OpenUsage launch workflow to in-place dev builds
The development workflow for OpenUsage has changed from installing a Preview app bundle to /Applications to building and launching the app in-place from the dist directory. This prevents interference with released versions and disables update checks during development. Additionally, the worktree setup process now excludes stale agent worktrees and scheduled task locks from synchronization.
.cursor · high confidence
Test coverage
Added tests for Antigravity provider and CLI usage scanning
Added comprehensive test coverage for the new Antigravity provider and the OpenUsageCLI tool. Tests verify the Antigravity database scanner handles schema variations, WAL-mode reads, and symlinked directories correctly, and that the quota summary parser robustly handles malformed or partial JSON responses. Additional tests cover the CLI's app bundle locator (including symlink resolution) and argument parsing.
Tests · high confidence
Dependencies
Update dependencies and add CLI target
This change updates the KeyboardShortcuts dependency from version 2.4.0 to 3.1.0, Sparkle from 2.9.3 to 2.10.0, and introduces the PostHog iOS SDK (version 3.81.0) for analytics. It also adds a new executable target named 'openusage-cli' and its corresponding tests, while updating the macOS platform requirement to version 15.
(dependencies) · high confidence
Housekeeping
Removed obsolete screenshot placeholder documentation
The placeholder file \assets/screenshots/README.md\ has been removed. This file previously contained instructions for capturing and naming screenshots (popover and menu bar) to be used in the main README, but these instructions are no longer needed as the referenced images have been updated or replaced elsewhere.
assets · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Score
- CAI 57 → 58 (+1.3)
- Rubric changed (rubric-2026.09.11 → rubric-2026.09.18) — scores are not directly comparable.
Lenses
- Code Health 87 → 88 (+0.5)
- Architecture 97 → 97 (-0.2)
- Maturity 63 → 63 (-0.1)
- Readiness 45 → 62 (+16.9)
- Security 58 → 50 (-7.9)
- Event-Driven 79 → 79 (+0.1)
- Performance 62 (new)
Resolved (18)
- ClaudeLogUsageScanner.hasUnsupportedNullField (cognitive 23) (Sources/OpenUsage/Providers/Claude/ClaudeLogUsageScanner.swift)
- DefaultAccountObserver.observeCodex (cognitive 16) (Sources/OpenUsage/Providers/DefaultAccountObserver.swift)
- Documentation: no installation or build instructions (README.md)
- Duplicated block (7 lines × 4) (Sources/OpenUsage/Providers/Antigravity/AntigravityProvider.swift)
- Duplicated block (8 lines × 3) (Sources/OpenUsage/Providers/Antigravity/AntigravityProvider.swift)
- Hotspot: Sources/OpenUsage/Providers/Antigravity/AntigravityProtoDecoder.swift (Sources/OpenUsage/Providers/Antigravity/AntigravityProtoDecoder.swift)
- Hotspot: Sources/OpenUsage/Providers/Antigravity/AntigravityProvider.swift (Sources/OpenUsage/Providers/Antigravity/AntigravityProvider.swift)
- Hotspot: Sources/OpenUsage/Providers/Cursor/CursorCSVParser.swift (Sources/OpenUsage/Providers/Cursor/CursorCSVParser.swift)
- Hotspot: Sources/OpenUsage/Providers/Grok/GrokCreditsConfigDecoder.swift (Sources/OpenUsage/Providers/Grok/GrokCreditsConfigDecoder.swift)
- Hotspot: Sources/OpenUsage/Providers/Ollama/OpenSSHEd25519Key.swift (Sources/OpenUsage/Providers/Ollama/OpenSSHEd25519Key.swift)
- Hotspot: Sources/OpenUsage/Support/OpenUsageISO8601.swift (Sources/OpenUsage/Support/OpenUsageISO8601.swift)
- Hotspot: Sources/OpenUsage/Support/PaceNotificationLogic.swift (Sources/OpenUsage/Support/PaceNotificationLogic.swift)
- Hotspot: Sources/OpenUsage/Support/PopoverDismissReader.swift (Sources/OpenUsage/Support/PopoverDismissReader.swift)
- Hotspot: Sources/OpenUsage/Support/ProviderIconShape.swift (Sources/OpenUsage/Support/ProviderIconShape.swift)
- Members sharing a duplicated core (4 members, 50+ identical tokens) (Sources/OpenUsage/Providers/Antigravity/AntigravityProvider.swift)
- MethodTooLong: AppContainer.init (Sources/OpenUsage/App/AppContainer.swift)
- Repeated repair: Sources/OpenUsage/App/SingleInstanceGuard.swift (Sources/OpenUsage/App/SingleInstanceGuard.swift)
- Repeated repair: Sources/OpenUsage/Providers/Codex/CodexLogUsageScanner.swift (Sources/OpenUsage/Providers/Codex/CodexLogUsageScanner.swift)
New (54)
- ClassTooLong: ClaudeProvider (Sources/OpenUsage/Providers/Claude/ClaudeProvider.swift)
- ClaudeAuthStore.loadCredentialSet (cognitive 28) (Sources/OpenUsage/Providers/Claude/ClaudeAuthStore.swift)
- ClaudeAuthStore.loadCredentialSet (cyclomatic 20) (Sources/OpenUsage/Providers/Claude/ClaudeAuthStore.swift)
- ClaudeAuthStore.loadSwapVaultCredential (cognitive 16) (Sources/OpenUsage/Providers/Claude/ClaudeAuthStore.swift)
- ClaudeLogUsageScanner.parseEntries (cognitive 16) (Sources/OpenUsage/Providers/Claude/ClaudeLogUsageScanner.swift)
- ClaudeLogUsageScanner.parseEntries (cyclomatic 16) (Sources/OpenUsage/Providers/Claude/ClaudeLogUsageScanner.swift)
- ClaudeSwapAccount.discover (cognitive 18) (Sources/OpenUsage/Providers/Claude/ClaudeSwapAccount.swift)
- ClaudeSwapAccount.discover (cyclomatic 16) (Sources/OpenUsage/Providers/Claude/ClaudeSwapAccount.swift)
- CodexLogUsageScanner.aggregate (cyclomatic 16) (Sources/OpenUsage/Providers/Codex/CodexLogUsageScanner.swift)
- CodexProvider.refreshAccount (cognitive 37) (Sources/OpenUsage/Providers/Codex/CodexProvider.swift)
- CodexSwapAccount.discover (cognitive 18) (Sources/OpenUsage/Providers/Codex/CodexSwapAccount.swift)
- Coverage not measured — Swift suite
- DashboardView.body (cognitive 28) (Sources/OpenUsage/Views/DashboardView.swift)
- DashboardView.body (cyclomatic 26) (Sources/OpenUsage/Views/DashboardView.swift)
- Duplicated block (10 lines × 2) (Sources/OpenUsage/Providers/Grok/GrokUsageClient.swift)
- Duplicated block (12 lines × 2) (Sources/OpenUsage/Providers/OpenRouter/OpenRouterAuthStore.swift)
- Duplicated block (5 lines × 2) (Sources/OpenUsage/Providers/Claude/ClaudeProvider.swift)
- Duplicated block (5 lines × 2) (Sources/OpenUsage/Providers/Cursor/CursorProvider.swift)
- Duplicated block (6–8 lines × 2) (Sources/OpenUsage/Services/ProviderAccountAssembly.swift)
- Duplicated block (7 lines × 2) (Sources/OpenUsage/Providers/Antigravity/AntigravityDbUsageScanner.swift)
- …and 34 more
Changes since last survey
- 39 commits — 20 feature/other, 19 fixes
By area
- Sources/OpenUsage — 23 commits
- (root) — 10 commits
- Tests/OpenUsageTests — 4 commits
- .github/workflows — 2 commits
Notable commits
- fix: Fix exhausted Devin weekly quota when percentage is omitted (#1251)
- fix: fix(claude): count terminal sessions when multiple accounts are known (#1299)
- fix: fix(claude): keep usage records whose nested iteration model is null (#1261)
- fix: fix(claude): keep verified launch-cached limits on the first 429 after relaunch (#1325)
- fix: fix(claude): preserve complete credential document during rotation (#1316)
- fix: fix(claude): read the plan badge from Anthropic's live profile (#1262)
- fix: fix(codex): attribute OpenCode 2 ChatGPT OAuth usage (#1284)
- fix: fix(codex): keep tier on tierless settings records and price Ultrafast -fast slugs at 6x (#1331)
- fix: fix(codex): scope Keychain reads and rotation writes to CLI account (#1317)
- fix: fix(cursor): bound usage CSV export to a 20s deadline (#1324)
- fix: fix(grok): keep local spend when team billing returns 412 (#1272)
- fix: fix(ollama): display monthly cloud usage limit (#1270)
- fix: fix(ollama): warn when the plan response can't be read (#1300)
- fix: fix(opencode): read OpenCode 2 usage and Go credentials (#1323)
- fix: fix(process): isolate each pipe drain from the shared utility pool (#1318)
- fix: fix(settings): rename update toggle to Check Automatically (#1330)
- fix: fix(settings): shorten the analytics toggle label and caption (#1328)
- fix: fix: discover Claude Swap accounts and isolate their usage (#1226)
- fix: fix: tolerate glued shell banners and recalculate pricing for every Codex card (#1320)
- change: Add Codex Swap account support (#1264)
- …and 19 more
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
robinebers/openusage was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 30 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit ab3e87bbb7c3e91205d64ef5be4baadc20d09c67 — the exact code this score is about.
- Scored under rubric-2026.09.18 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-cb25ca4feafa.