by ericjypark
CodexIsland - AI usage limits in your MacBook notch
# Add to your Claude Code skills
git clone https://github.com/ericjypark/codex-islandGuides for using ai agents skills like codex-island.
Your AI usage limits, living in your notch.
CodexIsland is a native macOS overlay that turns the MacBook notch into a Dynamic-Island-style live activity for Claude Code and Codex usage limits. It sits quietly over the notch, peeks on hover with the 5-hour headline, and expands on click to show both providers' 5-hour and weekly windows with reset timing, chart controls, and a swipeable Cost screen that estimates dollar spend and token throughput from your local session logs.
https://github.com/user-attachments/assets/195beeff-0f70-4d6b-8f3d-9f31d9c0b989
The app is free, open source, unsigned, and local-first. It reads credentials already written by Claude Code / Claude Desktop and Codex, then calls only the providers' own usage endpoints.
ccusage reads). Cycle
display modes between USD, VALUE (vs your subscription), TOKENS, and TREND.synced Xs ago in the panel header to refetch
immediately; the next scheduled poll re-arms from there.build.sh compiles arm64 and x86_64 slices and merges
them with lipo, targeting macOS 13+.brew install --cask ericjypark/tap/codexisland
The first invocation auto-taps ericjypark/homebrew-tap. The cask strips the
Gatekeeper quarantine attribute automatically (CodexIsland is unsigned by
Apple — Sparkle handles update verification independently).
Download CodexIsland-X.Y.Z.dmg from
Releases, drag the app
to /Applications, then run:
xattr -dr com.apple.quarantine /Applications/CodexIsland.app
CodexIsland is unsigned because Apple charges $99/year for a Developer ID certificate, and this is a free open-source project. The command removes the macOS Gatekeeper quarantine attribute that triggers the "cannot be opened because Apple cannot check it for malicious software" warning. The source code is in this repository for audit.
If a sponsored Apple Developer ID becomes available via GitHub Sponsors, signed builds can follow.
CodexIsland.app to /Applications.CodexIsland does not ask for passwords or API keys. It reads the auth state already created by the command-line tools or desktop apps you use.
For Codex:
~/.codex/auth.json.no codex auth.For Claude:
claude once, or open Claude Desktop, so Claude credentials are
populated.CLAUDE_CODE_OAUTH_TOKEN, then the macOS Keychain item
named Claude Code-credentials, then a refresh against Anthropic's OAuth
token endpoint.auth required — run claude.The first fetch starts at app launch so the panel usually has values ready by the first peek. Opening Settings also triggers a fresh fetch.
synced Xs ago in the panel header to refetch immediately.Provider visibility is display-only. Hiding a provider removes that provider's logo and column from the island, but the app keeps the latest usage values in memory so showing it again does not require a reset.
Settings is a custom NSWindow, not the system Settings scene. The app still
runs as an accessory app with no Dock icon and no menu bar.
Stored preferences:
| Setting | Store | UserDefaults key | Values |
| --- | --- | --- | --- |
| Chart style | StylePref | MacIsland.chartStyle | ring, bar, stepped, numeric, spark |
| Cost style | CostStylePref | MacIsland.costStyle | dollar, multi, tokens, spark |
| Token counting | TokenCountModeStore | MacIsland.tokenCountMode | all, billable |
| Refresh interval | RefreshIntervalStore | MacIsland.refreshInterval | 300, 900, 1800 |
| Low Power Mode | LowPowerModeStore | MacIsland.lowPowerMode | Boolean, default false |
| Claude visible | ProviderVisibilityStore | MacIsland.claudeVisible | Boolean, default true |
| Codex visible | ProviderVisibilityStore | MacIsland.codexVisible | Boolean, default true |
| Launch at login | LaunchAtLoginStore | managed by SMAppService.mainApp | System login item status |
| Style hint seen | StylePref | MacIsland.hasCycledStyle | Boolean |
| Cost style hint seen | CostStylePref | MacIsland.costStyleCycled | Boolean |
The refresh interval applies live. UsageStore invalidates the current timer
and re-arms it with the selected cadence.
Requires macOS 13+ and a Swift toolchain from Xcode / Command Line Tools.
git clone https://github.com/ericjypark/codex-island
cd codex-island
./build.sh
open build/CodexIsland.app
There is no Xcode project and no SwiftPM package. build.sh runs swiftc over
Sources/**/*.swift, compiles arm64 and x86_64 slices, merges them with
lipo, copies bundled resources, and writes Info.plist.
Smoke test the native app:
./scripts/verify.sh
The script builds the app, launches the binary for one second, then kills it if it is still alive.
Package a DMG:
npm install --global create-dmg
./release.sh
release.sh runs the native build, copies the .app to dist/, applies ad-hoc
codesigning, creates dist/CodexIsland-X.Y.Z.dmg, and prints the file size and
SHA-256.
Pushing a v* tag triggers .github/workflows/release.yml on macos-15,
builds the DMG, computes the checksum, publishes a GitHub Release, and mirrors
the cask to ericjypark/homebrew-tap when HOMEBREW_TAP_TOKEN is configured.
Casks/codexisland.rb is the Homebrew Cask template. Do not manually bump its
version or SHA for normal releases; CI copies it to the tap and rewrites those
fields from the tag and freshly built DMG.
.
├── Sources/
│ ├── App.swift
│ ├── Cost/ # Local-log cost + token aggregation
│ ├── Model/
│ ├── Theme/
│ ├── Update/ # Sparkle wrapper
│ ├── Usage/
│ ├── Views/
│ └── Window/
├── Resources/ # App-bundled logo PNGs and .icns
├── Assets/ # README logo asset
├── docs/ # Sparkle runbook, design specs
├── Casks/ # Homebrew Cask template
├── scripts/verify.sh # Native smoke test
├──
No comments yet. Be the first to share your thoughts!