{"id":43730518,"url":"https://github.com/robinebers/openusage","last_synced_at":"2026-06-26T11:00:40.727Z","repository":{"id":335817388,"uuid":"1147103080","full_name":"robinebers/openusage","owner":"robinebers","description":"Burning through your subscriptions too fast? Paying for stuff you never use? Stop guessing. OpenUsage is free and open source.","archived":false,"fork":false,"pushed_at":"2026-06-23T07:33:39.000Z","size":38581,"stargazers_count":2934,"open_issues_count":45,"forks_count":296,"subscribers_count":5,"default_branch":"main","last_synced_at":"2026-06-23T08:10:32.436Z","etag":null,"topics":["claude","codex","copilot","cursor","subscription"],"latest_commit_sha":null,"homepage":"https://www.openusage.ai","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/robinebers.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-02-01T07:37:03.000Z","updated_at":"2026-06-23T06:20:53.000Z","dependencies_parsed_at":"2026-02-12T11:01:45.166Z","dependency_job_id":null,"html_url":"https://github.com/robinebers/openusage","commit_stats":null,"previous_names":["robinebers/openusage"],"tags_count":51,"template":false,"template_full_name":null,"purl":"pkg:github/robinebers/openusage","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robinebers%2Fopenusage","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robinebers%2Fopenusage/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robinebers%2Fopenusage/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robinebers%2Fopenusage/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/robinebers","download_url":"https://codeload.github.com/robinebers/openusage/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robinebers%2Fopenusage/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34813782,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-26T02:00:06.560Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["claude","codex","copilot","cursor","subscription"],"created_at":"2026-02-05T10:10:11.564Z","updated_at":"2026-06-26T11:00:40.714Z","avatar_url":"https://github.com/robinebers.png","language":"JavaScript","funding_links":[],"categories":["Swift","Menubar"],"sub_categories":["Text"],"readme":"# OpenUsage\n\nTrack your AI coding subscriptions from the macOS menu bar — native Swift edition.\n\nOpenUsage shows how much of your AI coding plans you've used: session and weekly limits, credits, and spend, all in one popover. Pin your most important metrics straight into the menu bar.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/screenshot.jpg\" alt=\"OpenUsage menu bar tracker showing Claude and Codex session, weekly, and spend usage\" width=\"900\"\u003e\n\u003c/p\u003e\n\n## Supported Providers\n\n- [**Antigravity**](docs/providers/antigravity.md) — Gemini Pro/Flash and Claude model quotas\n- [**Claude**](docs/providers/claude.md) — session, weekly, extra usage, local daily spend (ccusage)\n- [**Codex**](docs/providers/codex.md) — session, weekly, credits, local daily spend (ccusage)\n- [**Cursor**](docs/providers/cursor.md) — credits, total/auto/API usage, requests, on-demand, per-day spend\n- [**Devin**](docs/providers/devin.md) — weekly and daily quota, extra usage balance\n- [**Grok**](docs/providers/grok.md) — credits used, pay-as-you-go\n\nEach provider reads the credentials already on your machine (keychain, auth files, app state) — no extra login, and nothing leaves your Mac except the same API calls the vendor's own tools make.\n\n## Features\n\n- **Menu bar pins.** Pin metrics to the menu bar (up to 2 per provider); render as compact text or mini bars. The strip hides metrics with no data instead of showing placeholders.\n- **Dashboard popover.** Provider-grouped meters with live reset countdowns, pace indicators, and context menus (pin, hide, used⟷left, countdown⟷exact resets, refresh).\n- **Global shortcut.** Toggle the popover from anywhere — record any combo in Settings.\n- **Customize.** Add/remove widgets, drag-reorder providers and metrics.\n- **Stale-while-revalidate.** Cached values display instantly at launch; refresh runs every 5 minutes.\n- **[Local HTTP API](docs/local-http-api.md).** Other apps can read your usage as JSON from `127.0.0.1:6736` (`/v1/usage`), same format as the original app. It is loopback-only and serves usage numbers, never credentials; note that browser pages can read it too — see the [privacy note](docs/local-http-api.md#cors-and-privacy).\n- **[Proxy support](docs/proxy.md).** Route provider requests through SOCKS5 or HTTP(S) via `~/.openusage/config.json`.\n- **Native settings.** Launch at login, global shortcut, menu style, theme, density, 12/24-hour time — see [Settings](docs/settings.md).\n- **[Automatic updates](docs/updates.md).** Signed, notarized in-app updates via Sparkle, with an optional early access channel.\n\n## Documentation\n\nBehavior docs live in [docs/](docs/README.md): the [dashboard](docs/dashboard.md), [menu bar pins](docs/menu-bar.md), [settings](docs/settings.md), [refresh \u0026 caching](docs/refreshing.md), the [local HTTP API](docs/local-http-api.md), the [proxy](docs/proxy.md), and one page per provider.\n\nFor working on the code, see the developer docs: [architecture](docs/architecture.md), [adding a provider](docs/adding-a-provider.md), and [debugging \u0026 capturing logs](docs/debugging.md).\n\n## Requirements\n\n- macOS 15 (Sequoia) or later\n- Universal binary — runs natively on both Apple Silicon and Intel Macs\n- A JavaScript package runner — optional, only for the local Today / Yesterday / Last 30 Days spend tiles (which run `ccusage`). [Bun](https://bun.sh) is preferred (`bunx`), but `pnpm dlx`, `yarn dlx`, `npm exec`, or `npx` work too — so an existing Node.js install is enough.\n\n## Building\n\n```sh\nswift build            # debug build\nswift test             # run the test suite\n./script/build_and_run.sh   # build and launch the dev app from dist/ (no install)\n```\n\n## Architecture\n\nSwiftPM executable, SwiftUI content hosted in an AppKit-owned `NSStatusItem` + `NSPopover`, Swift 6 strict concurrency. Providers implement a small `ProviderRuntime` protocol (auth store → usage client → mapper → `ProviderSnapshot`), and the UI renders normalized `MetricLine` values — see the [architecture overview](docs/architecture.md) for how the pieces fit together and [AGENTS.md](AGENTS.md) for engineering conventions.\n\n## Releasing\n\nReleases are automated: pushing a `v*` tag on `main` builds, signs, notarizes, and publishes a new version. A plain tag (`v0.7.1`) ships to everyone; a pre-release suffix (`v0.7.1-beta.1`) ships to the Early Access channel. The pipeline lives in [.github/workflows/release.yml](.github/workflows/release.yml), and the step-by-step is in the `release-swift` skill.\n\n### Release setup (one-time)\n\nThe release workflow needs these repository secrets (Settings → Secrets and variables → Actions):\n\n| Secret | What it is |\n| --- | --- |\n| `APPLE_CERTIFICATE` | base64 of your Developer ID Application `.p12` |\n| `APPLE_CERTIFICATE_PASSWORD` | the password set when exporting that `.p12` |\n| `APPLE_ID` | the Apple ID email used for notarization |\n| `APPLE_PASSWORD` | an app-specific password for that Apple ID |\n| `APPLE_TEAM_ID` | your Apple Developer team ID |\n| `SPARKLE_PUBLIC_KEY` | base64 EdDSA public key, baked into the build as `SUPublicEDKey` |\n| `SPARKLE_PRIVATE_KEY` | base64 EdDSA private key used to sign the DMG |\n\nExport the Developer ID Application cert (with its private key) from Keychain Access as a `.p12`, then `base64 -i DeveloperID.p12 | pbcopy`. App-specific passwords come from appleid.apple.com → Sign-In and Security → App-Specific Passwords. Generate the Sparkle EdDSA key pair once with Sparkle's `generate_keys` tool; the public and private values must be a matching pair or signing is silently skipped.\n\nThe repository must be public (Sparkle fetches the DMG and appcast anonymously), and the appcast is served from GitHub Pages — confirm Settings → Pages points at the `gh-pages` branch after the first release.\n\n## Contributing\n\nIssues and PRs are welcome — read [CONTRIBUTING.md](CONTRIBUTING.md) first; the quality bar is deliberately high. Report security issues privately per [SECURITY.md](SECURITY.md). The OpenUsage name and logo are covered by the [trademark policy](TRADEMARK.md).\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frobinebers%2Fopenusage","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frobinebers%2Fopenusage","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frobinebers%2Fopenusage/lists"}