[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-11491":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":23,"hasPages":23,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":31,"readmeContent":32,"aiSummary":33,"trendingCount":16,"starSnapshotCount":16,"syncStatus":34,"lastSyncTime":35,"discoverSource":36},11491,"codex-island","ericjypark\u002Fcodex-island","ericjypark","CodexIsland - AI usage limits in your MacBook notch","https:\u002F\u002Fcodexisland.com",null,"Swift",229,14,1,6,0,11,21,77,33,81.73,"MIT License",false,"main",[26,27,28,29,30],"claude","claude-code","codex","macos","notch","2026-06-12 04:00:55","# CodexIsland\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"Assets\u002Fcodexisland-logo.png\" width=\"160\" alt=\"CodexIsland logo\">\n\u003C\u002Fp>\n\n\n> Your AI usage limits, living in your notch.\n\nCodexIsland is a native macOS overlay that turns the MacBook notch into a\nDynamic-Island-style live activity for Claude Code and Codex usage limits. It\nsits quietly over the notch, peeks on hover with the 5-hour headline, and\nexpands on click to show both providers' 5-hour and weekly windows with reset\ntiming, chart controls, and a swipeable Cost screen that estimates dollar\nspend and token throughput from your local session logs.\n\nhttps:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F195beeff-0f70-4d6b-8f3d-9f31d9c0b989\n\n\nThe app is free, open source, unsigned, and local-first. It reads credentials\nalready written by Claude Code \u002F Claude Desktop and Codex, then calls only the\nproviders' own usage endpoints.\n\n## What it does\n\n- **Two providers, four windows.** Claude 5h + 7d and Codex 5h + 7d live in\n  one panel.\n- **Notch-native overlay.** The compact state is a black pill aligned to the\n  physical notch, drawn with continuous (squircle) corners that match the\n  hardware. On non-notched Macs it falls back to a 200 x 28 menu-bar pill.\n- **Hover to peek.** The silhouette widens just enough to show each visible\n  provider's 5-hour percentage and reset headline.\n- **Click to expand.** Click the island to open the full Usage \u002F Cost panel,\n  provider columns, and chart controls.\n- **Swipe between Usage and Cost.** A second screen estimates today and\n  month-to-date dollar spend + token throughput from your local Claude Code\n  and Codex session logs (no extra auth — same files `ccusage` reads). Cycle\n  display modes between USD, VALUE (vs your subscription), TOKENS, and TREND.\n- **Configurable token counting.** The TOKENS hero can sum every token type\n  that crossed the wire (cache included, ccusage parity) or input + output\n  only — the latter matches Anthropic's claude.ai stats panel.\n- **Click-through outside the island.** The window ignores mouse events outside\n  the visible silhouette so the menu bar and apps underneath still work.\n- **Five chart styles.** Ring, Bar, Stepped, Numeric, and Sparkline. Pick the\n  default in Settings or Cmd-click the expanded panel to cycle.\n- **On-demand refresh.** Click `synced Xs ago` in the panel header to refetch\n  immediately; the next scheduled poll re-arms from there.\n- **Cobalt glow + Low Power Mode.** A soft glow around the island signals an\n  in-flight refresh. Low Power Mode hides the steady-state glow so it only\n  pulses during active work.\n- **Settings without a Dock icon.** A quiet gear in the expanded panel opens a\n  custom settings window for launch-at-login, refresh interval, provider\n  visibility, chart style, cost view style, token counting, links, and Quit.\n- **Configurable safe polling.** Choose 5m, 15m, or 30m. The app does not offer\n  sub-5-minute polling because Anthropic rate-limits the usage endpoint\n  aggressively.\n- **Universal binary.** `build.sh` compiles arm64 and x86_64 slices and merges\n  them with `lipo`, targeting macOS 13+.\n- **Auto-updates via Sparkle.** The app checks the appcast attached to the\n  latest GitHub Release on launch and once a day thereafter, then prompts\n  before installing. Updates are signed with an EdDSA key — verifiable\n  without involving Apple's signing infrastructure. Toggle off in Settings\n  if you'd rather pin a version.\n- **Native app privacy.** No app telemetry, no crash reporting, no third-party\n  app analytics, and no proxy service.\n\n## Install\n\n### Homebrew\n\n```sh\nbrew install --cask ericjypark\u002Ftap\u002Fcodexisland\n```\n\nThe first invocation auto-taps `ericjypark\u002Fhomebrew-tap`. The cask strips the\nGatekeeper quarantine attribute automatically (CodexIsland is unsigned by\nApple — Sparkle handles update verification independently).\n\n### Direct download\n\nDownload `CodexIsland-X.Y.Z.dmg` from\n[Releases](https:\u002F\u002Fgithub.com\u002Fericjypark\u002Fcodex-island\u002Freleases), drag the app\nto `\u002FApplications`, then run:\n\n```sh\nxattr -dr com.apple.quarantine \u002FApplications\u002FCodexIsland.app\n```\n\n\u003Cdetails>\n\u003Csummary>Why is the dequarantine command necessary?\u003C\u002Fsummary>\n\nCodexIsland is unsigned because Apple charges $99\u002Fyear for a Developer ID\ncertificate, and this is a free open-source project. The command removes the\nmacOS Gatekeeper quarantine attribute that triggers the \"cannot be opened\nbecause Apple cannot check it for malicious software\" warning. The source code\nis in this repository for audit.\n\nIf a sponsored Apple Developer ID becomes available via\n[GitHub Sponsors](https:\u002F\u002Fgithub.com\u002Fsponsors\u002Fericjypark), signed builds can\nfollow.\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n\u003Csummary>I do not want to use Terminal. What do I do?\u003C\u002Fsummary>\n\n1. Drag `CodexIsland.app` to `\u002FApplications`.\n2. Try to open it. macOS will block it because the build is unsigned.\n3. Open **System Settings -> Privacy & Security**.\n4. Scroll to the bottom and find the blocked CodexIsland message.\n5. Click **Open Anyway**, then re-launch the app.\n\u003C\u002Fdetails>\n\n## First run\n\nCodexIsland does not ask for passwords or API keys. It reads the auth state\nalready created by the command-line tools or desktop apps you use.\n\nFor Codex:\n\n- Sign in to Codex \u002F ChatGPT CLI first.\n- CodexIsland reads `~\u002F.codex\u002Fauth.json`.\n- If the file or access token is missing, the panel shows `no codex auth`.\n\nFor Claude:\n\n- Run `claude` once, or open Claude Desktop, so Claude credentials are\n  populated.\n- CodexIsland tries `CLAUDE_CODE_OAUTH_TOKEN`, then the macOS Keychain item\n  named `Claude Code-credentials`, then a refresh against Anthropic's OAuth\n  token endpoint.\n- If none work, the panel shows `auth required — run claude`.\n\nThe first fetch starts at app launch so the panel usually has values ready by\nthe first peek. Opening Settings also triggers a fresh fetch.\n\n## Using the app\n\n- Hover the notch to peek at the current 5-hour usage.\n- Click the island to expand the full panel.\n- Swipe horizontally on the panel (or use the indicator dots) to cross between\n  the **Usage** screen and the **Cost** screen.\n- Move away to collapse it.\n- Cmd-click the expanded panel to cycle chart styles on the active screen\n  (Usage cycles Ring\u002FBar\u002FStepped\u002FNumeric\u002FSparkline; Cost cycles\n  USD\u002FVALUE\u002FTOKENS\u002FTREND).\n- Click `synced Xs ago` in the panel header to refetch immediately.\n- Click the gear in the lower-left corner of the expanded panel to open\n  Settings.\n- Use Settings to enable Launch at Login, pick a refresh interval, toggle Low\n  Power Mode, hide\u002Fshow Claude or Codex, choose the default chart and cost\n  styles, choose between all-tokens and billable-only token counting, open\n  GitHub \u002F License, or quit the app.\n\nProvider visibility is display-only. Hiding a provider removes that provider's\nlogo and column from the island, but the app keeps the latest usage values in\nmemory so showing it again does not require a reset.\n\n## Settings\n\nSettings is a custom `NSWindow`, not the system Settings scene. The app still\nruns as an accessory app with no Dock icon and no menu bar.\n\nStored preferences:\n\n| Setting | Store | UserDefaults key | Values |\n| --- | --- | --- | --- |\n| Chart style | `StylePref` | `MacIsland.chartStyle` | `ring`, `bar`, `stepped`, `numeric`, `spark` |\n| Cost style | `CostStylePref` | `MacIsland.costStyle` | `dollar`, `multi`, `tokens`, `spark` |\n| Token counting | `TokenCountModeStore` | `MacIsland.tokenCountMode` | `all`, `billable` |\n| Refresh interval | `RefreshIntervalStore` | `MacIsland.refreshInterval` | `300`, `900`, `1800` |\n| Low Power Mode | `LowPowerModeStore` | `MacIsland.lowPowerMode` | Boolean, default `false` |\n| Claude visible | `ProviderVisibilityStore` | `MacIsland.claudeVisible` | Boolean, default `true` |\n| Codex visible | `ProviderVisibilityStore` | `MacIsland.codexVisible` | Boolean, default `true` |\n| Launch at login | `LaunchAtLoginStore` | managed by `SMAppService.mainApp` | System login item status |\n| Style hint seen | `StylePref` | `MacIsland.hasCycledStyle` | Boolean |\n| Cost style hint seen | `CostStylePref` | `MacIsland.costStyleCycled` | Boolean |\n\nThe refresh interval applies live. `UsageStore` invalidates the current timer\nand re-arms it with the selected cadence.\n\n## Build from source\n\nRequires macOS 13+ and a Swift toolchain from Xcode \u002F Command Line Tools.\n\n```sh\ngit clone https:\u002F\u002Fgithub.com\u002Fericjypark\u002Fcodex-island\ncd codex-island\n.\u002Fbuild.sh\nopen build\u002FCodexIsland.app\n```\n\nThere is no Xcode project and no SwiftPM package. `build.sh` runs `swiftc` over\n`Sources\u002F**\u002F*.swift`, compiles arm64 and x86_64 slices, merges them with\n`lipo`, copies bundled resources, and writes `Info.plist`.\n\nSmoke test the native app:\n\n```sh\n.\u002Fscripts\u002Fverify.sh\n```\n\nThe script builds the app, launches the binary for one second, then kills it if\nit is still alive.\n\n## Release\n\nPackage a DMG:\n\n```sh\nnpm install --global create-dmg\n.\u002Frelease.sh\n```\n\n`release.sh` runs the native build, copies the `.app` to `dist\u002F`, applies ad-hoc\ncodesigning, creates `dist\u002FCodexIsland-X.Y.Z.dmg`, and prints the file size and\nSHA-256.\n\nPushing a `v*` tag triggers `.github\u002Fworkflows\u002Frelease.yml` on `macos-15`,\nbuilds the DMG, computes the checksum, publishes a GitHub Release, and mirrors\nthe cask to `ericjypark\u002Fhomebrew-tap` when `HOMEBREW_TAP_TOKEN` is configured.\n\n`Casks\u002Fcodexisland.rb` is the Homebrew Cask template. Do not manually bump its\nversion or SHA for normal releases; CI copies it to the tap and rewrites those\nfields from the tag and freshly built DMG.\n\n## Repository layout\n\n```text\n.\n├── Sources\u002F\n│   ├── App.swift\n│   ├── Cost\u002F                # Local-log cost + token aggregation\n│   ├── Model\u002F\n│   ├── Theme\u002F\n│   ├── Update\u002F              # Sparkle wrapper\n│   ├── Usage\u002F\n│   ├── Views\u002F\n│   └── Window\u002F\n├── Resources\u002F              # App-bundled logo PNGs and .icns\n├── Assets\u002F                 # README logo asset\n├── docs\u002F                   # Sparkle runbook, design specs\n├── Casks\u002F                  # Homebrew Cask template\n├── scripts\u002Fverify.sh       # Native smoke test\n├── build.sh                # Universal .app build\n├── release.sh              # DMG packaging\n└── VERSION\n```\n\n## Privacy\n\nNative app behavior:\n\n- No app telemetry.\n- No app analytics.\n- No crash reporting.\n- No proxy server.\n- No credentials are stored by CodexIsland.\n- Codex tokens are read locally from `~\u002F.codex\u002Fauth.json`.\n- Claude tokens are read from `CLAUDE_CODE_OAUTH_TOKEN`, the macOS Keychain, or\n  Anthropic's refresh endpoint.\n- Tokens leave the machine only as `Authorization` headers to `chatgpt.com` and\n  `api.anthropic.com`.\n- The Cost screen reads local Claude Code session logs from\n  `~\u002F.claude\u002Fprojects\u002F**\u002F*.jsonl` (and `~\u002F.config\u002Fclaude\u002F...`, plus any path\n  in `CLAUDE_CONFIG_DIR`) and Codex session logs from `~\u002F.codex\u002Fsessions\u002F`.\n  Aggregation happens entirely on-device — no log content is uploaded or\n  shared anywhere.\n\nThe network surface is concentrated in\n[`Sources\u002FUsage\u002FUsageFetcher.swift`](Sources\u002FUsage\u002FUsageFetcher.swift). The\nlocal log readers live in [`Sources\u002FCost\u002F`](Sources\u002FCost\u002F).\n\n## Troubleshooting\n\n**Claude shows `auth required — run claude`.**\nRun `claude` once in Terminal or open Claude Desktop so the credentials exist.\n\n**Codex shows `no codex auth`.**\nSign in to Codex \u002F ChatGPT CLI and confirm `~\u002F.codex\u002Fauth.json` exists.\n\n**The app shows stale values after an error.**\nThat is intentional. `UsageStore` keeps the previous good values when a refresh\nreturns only errors, so a temporary 429 does not turn the panel into 0%.\n\n**Why can I not choose 30-second polling?**\nAnthropic rate-limits `\u002Fapi\u002Foauth\u002Fusage` per token. The app exposes 5m, 15m,\nand 30m only.\n\n**Does it work without a notch?**\nYes. It falls back to a 200 x 28 pill in the menu-bar area.\n\n**Does it support multiple monitors?**\nPartially. The app prefers the first display whose safe-area inset indicates a\nnotch, then falls back to `NSScreen.main`. Multi-monitor setups still get one\nisland, not one island per display.\n\n**Will the usage endpoints break?**\nProbably at some point. Both provider endpoints are undocumented. If the panel\nstarts showing parse errors or HTTP errors, open an issue with the response\nshape and redact tokens.\n\n**Why is there no Dock icon?**\nCodexIsland is an accessory app. Use the gear in the expanded island to open\nSettings, and use Settings -> Quit to exit.\n\n## Known limits\n\n- Unsigned builds require dequarantine \u002F Open Anyway.\n- Claude and Codex usage endpoints are undocumented.\n- Sparkline history is synthesized, not provider-sourced history.\n- Multi-monitor placement uses a single island.\n- Accessibility is partial: VoiceOver labels exist, but a high-contrast variant\n  is not implemented yet.\n\n## Acknowledgements\n\n- [codexbar](https:\u002F\u002Fgithub.com\u002Fsteipete\u002Fcodexbar) by Peter Steinberger -\n  auth-source archaeology for the Claude env-var -> keychain -> refresh ladder.\n- [claudecodeusage](https:\u002F\u002Fgithub.com\u002FRchGrav\u002Fclaudecodeusage) by Rich Hickson\n  - the `claude-code\u002F2.1.121` User-Agent requirement on `\u002Fapi\u002Foauth\u002Fusage`.\n- [LaunchAtLogin-Modern](https:\u002F\u002Fgithub.com\u002Fsindresorhus\u002FLaunchAtLogin-Modern)\n  by Sindre Sorhus - reference shape for `SMAppService.mainApp`.\n- [Emil Kowalski](https:\u002F\u002Fanimations.dev) - animation timing and interaction\n  discipline.\n\n## Changelog\n\nSee [CHANGELOG.md](CHANGELOG.md) for user-facing changes per release.\n\n## License\n\nMIT - see [LICENSE](LICENSE).\n\n\u003Ca href=\"https:\u002F\u002Fwww.star-history.com\u002F?type=date&repos=ericjypark%2Fcodex-island\">\n \u003Cpicture>\n   \u003Csource media=\"(prefers-color-scheme: dark)\" srcset=\"https:\u002F\u002Fapi.star-history.com\u002Fchart?repos=ericjypark\u002Fcodex-island&type=date&theme=dark&legend=top-left\" \u002F>\n   \u003Csource media=\"(prefers-color-scheme: light)\" srcset=\"https:\u002F\u002Fapi.star-history.com\u002Fchart?repos=ericjypark\u002Fcodex-island&type=date&legend=top-left\" \u002F>\n   \u003Cimg alt=\"Star History Chart\" src=\"https:\u002F\u002Fapi.star-history.com\u002Fchart?repos=ericjypark\u002Fcodex-island&type=date&legend=top-left\" \u002F>\n \u003C\u002Fpicture>\n\u003C\u002Fa>\n","CodexIsland 是一个 macOS 原生应用，将 MacBook 的刘海区域转变为动态显示 Claude Code 和 Codex 使用限制的实时活动界面。该应用通过在刘海位置显示 AI 服务的5小时和每周使用情况，帮助用户监控 API 调用限额及费用。其核心功能包括：动态岛式叠加层、悬停预览与点击展开详情、滑动切换使用情况与成本估算等。此外，它还支持多种图表样式选择、自定义刷新间隔以及低功耗模式下的优化显示。适用于需要频繁调用 AI 服务且希望直观管理资源消耗的开发者或团队，在不干扰日常工作流程的情况下提供即时反馈。",2,"2026-06-11 03:31:59","CREATED_QUERY"]