Vibe View is a native macOS menu bar app for Codex subscription quotas, with token usage and activity analytics. Version 1.3.7 prefers Codex's managed-auth app-server account APIs, preserves a bounded compatibility path for richer analytics, and adds explicit quota alerts and account controls while keeping the menu-bar percentage focused on the base weekly quota.
The app was formerly Codex Watch. The macOS bundle identifier (com.moebis.codexwatch), executable, and preference keys remain stable so upgrades retain your settings. The GitHub repository is now moebis/vibe-view.
Claude quota monitoring was removed in 1.3.5; the Claude desktop menu bar app shows the plan's five-hour and weekly limits itself.
- The rounded percentage remaining in the base weekly Codex quota, always visible in the menu bar.
- Every valid base and code-review quota window returned by ChatGPT, including remaining percentage, reset countdown, and progress. Retired Codex Spark limits are suppressed, and the obsolete Spark preference is removed. Other model-specific limits appear only when the server returns them; the menu-bar percentage always uses base Codex weekly quota.
- Deterministic quota pace (
On pace,in reserve, orin deficit) once at least 3% of a server-provided window has elapsed. Pace is a linear snapshot, not a probability or entitlement estimate. - The recognized ChatGPT plan, credits balance or
Unlimited, available reset-credit count, and the earliest supported reset-credit expiry when present. - A persistent
30 Days/Lifetimeselector in the compact menu. The 30-day summary shows total, uncached-input, cached-input, and output tokens plus turns, chats, token coverage, and server data-through date; Lifetime shows exact first-party headline totals, peak daily tokens, longest chat, streaks, and data-through date. - A reusable native dashboard whose Usage tab provides 7-, 30-, 90-, and 365-day ranges, summary cards, an Apple Charts token chart, an accessible activity heatmap, model activity, and client token totals.
- A Lifetime tab with exact server-reported lifetime tokens, peak daily tokens, longest chat, current and longest streaks, returned daily token activity, activity insights, and the 50 most-used Codex plugins or skills.
- Server-reported workspace credit or usage-limit exhaustion reasons when present, plus projected quota exhaustion when the available timing data supports it.
Model rows report turns, chats, credits, and turn share because the endpoint does not provide per-model token counts. Client rows report server-provided token fields. Dates with activity but no historical token fields are labeled Activity only; they are not treated as zero-token or missing days. Period comparisons appear only when both periods have at least 90% token coverage, and the 365-day range does not claim a comparison.
OpenAI deprecated GPT-5.3-Codex-Spark on September 14, 2026. The current model guide lists Luna, but neither that guide nor the pricing documentation establishes a Spark-to-Luna quota migration. Vibe View does not rename a legacy Spark bucket or invent a separate Luna allowance.
The app-server protocol exposes server-defined rateLimitsByLimitId buckets, with rateLimits retained for compatibility. Vibe View prefers the explicit codex base bucket and preserves distinct additional windows even when server identifiers are long or normalize to the same text. Historical model activity in Usage analytics remains unchanged.
The menu uses aligned content margins, trailing checkmarks for its toggles, and analytics sections that fit the selected content. Reset dates and pace share one line separated by an em dash; the next line uses the shorter Exhaustion label.
The menu includes:
Refresh NowRefresh Frequency: Adaptive, Manual, 1, 2, 5, 15, or 30 minutesQuota Notifications, an opt-in local alert at 25%, 10%, 5%, and exhausted thresholds without placing the private percentage in notification textLaunch at Login, managed by macOSUse Reset Credit…when the official account API reports an available credit, always behind confirmationOpen Analytics Dashboard…Open Usage Analytics…for the official ChatGPT web pageOpen ChatGPTCopy Diagnostics, which copies only operational state and never quota values, account data, paths, or credentials- Quit
Adaptive refresh is the default for a fresh preference domain. It checks every 2 minutes after recent menu interaction, then backs off to 5, 15, or 30 minutes. Low Power Mode and serious or critical thermal pressure use 30 minutes. Opening the menu requests fresh quota only when the last successful snapshot is older than 60 seconds. Bounded Usage analytics and Lifetime profile statistics are fetched on manual refresh and no more than once every 15 minutes automatically.
Quota publishes as soon as it completes, without waiting for slower analytics. Failed app-server connections recover on a bounded 30-second retry cadence. Automatic triggers share active work. A manual refresh replaces older background work, and stale generations cannot publish. Quota errors preserve and dim the last successful percentage with an Updated … ago label. Usage and Lifetime failures are independent: each preserves its own last successful in-memory result and marks only that dashboard surface stale.
Unchanged Usage projections and Lifetime presentation models are reused in memory. Quota-only refreshes do not republish unchanged dashboard data, and closed dashboards wait until reopened to update. Menu countdowns are rebuilt when the menu opens, without requiring a network fetch.
Codex app-server rate-limit updates request a coalesced quota-only refresh. Account-change notifications clear the previous quota, Usage projections, and Lifetime data and replace active work with a full refresh. Shutdown prevents new requests and drains active refreshes before closing the network session. The dashboard Refresh control invokes the same manual generation as the menu. Its heatmap uses weekday rows and week columns, and wide data tables scroll rather than clipping when the window is narrow.
Usage credits appear as a separate row from earned reset credits. The app preserves the exact server-reported balance, including an explicit zero after depletion. The row shows a comma-separated whole number rounded to the nearest credit; hover for the exact reported balance. It displays Unlimited when reported. It never converts credits to dollars or estimates remaining messages.
Export CSV… in the native dashboard exports only the currently selected projection after you choose a destination. The RFC 4180 CSV contains range metadata, coverage, every daily state, model activity, and client token totals. Server-supplied labels are protected against spreadsheet-formula injection. Vibe View never chooses an export path or writes analytics automatically.
Vibe View first launches an installed Codex executable's app-server command and uses its managed ChatGPT authentication for account identity, quota, lifetime summary, live rate-limit updates, and confirmed reset-credit use. This supports Codex's configured credential store without copying credentials into Vibe View. The app-server command is currently documented as experimental; Vibe View disables experimental protocol APIs, fails closed, and retains a compatibility path.
For richer 365-day Usage analytics and profile details, Vibe View optionally reads tokens.access_token and tokens.account_id from CODEX_HOME/auth.json; when CODEX_HOME is unset, it checks ~/.codex/auth.json. If file credentials are unavailable, official app-server quota and lifetime summaries remain usable while the richer compatibility-only surfaces show unavailable.
Compatibility credentials are used in memory only for read-only requests on the original ChatGPT HTTPS host:
GET https://chatgpt.com/backend-api/wham/usage
GET https://chatgpt.com/backend-api/wham/rate-limit-reset-credits
GET https://chatgpt.com/backend-api/wham/analytics/daily-workspace-usage-counts
GET https://chatgpt.com/backend-api/wham/profiles/me
These compatibility endpoints are internal ChatGPT routes, not a public API contract; they may change independently of the documented Codex app-server account methods. The current protocol covers quota buckets, usage credits, reset credits, and lifetime summaries, but does not supply the richer model/client analytics used here.
The Usage analytics request covers the inclusive trailing 365 calendar days. Smaller views are projected locally from that one bounded response. The profile request supplies exact Lifetime headline totals and its own daily activity buckets; those values are never reconstructed from incomplete historical rows. Each response is capped at one mebibyte. The production network session is ephemeral, uncached, cookieless, and rejects redirects to another host.
Authenticated responses remain in process memory. Vibe View never logs credentials, headers, response bodies, account identifiers, analytics values, or export paths. It does not read rollout JSONL, the Codex task database, prompts, titles, project paths, browser cookies, Keychain browser material, or process lists. Generic notification content contains no private usage value. The diagnostics action copies only operational state. It adds no telemetry, updater, automatic download, hidden web view, or unconfigured network destination. The explicitly connected Claude provider adds only Anthropic quota requests.
The ChatGPT routes are internal and may change without notice. Missing or changed optional fields are hidden or marked partial rather than guessed. Vibe View does not infer absolute token allowances, missing lifetime totals, streaks, plugin use, skill use, reasoning modes, or pricing.
See CHANGELOG.md for release notes.
Requirements: macOS 14 or newer, Xcode 15 or newer, and Swift 5.9 or newer.
Build and verify a local universal app bundle:
ARCHITECTURES="arm64 x86_64" \
EXPECTED_ARCHITECTURES="arm64 x86_64" \
./scripts/verify.sh /private/tmp/codex-watch-buildQuit Vibe View and preserve the existing app as the latest rollback copy in ~/Library/Application Support/Vibe View/Backups, then install and verify the new bundle. Retain only one verified rollback after installation succeeds:
ditto "/private/tmp/codex-watch-build/Vibe View.app" "/Applications/Vibe View.app"
EXPECTED_ARCHITECTURES="arm64 x86_64" \
./scripts/verify_app.sh "/Applications/Vibe View.app"The local release is ad-hoc signed because this repository does not contain an Apple Developer ID certificate. macOS may require Control-clicking the app and choosing Open on first launch.
Choose the relevant path in the change harness. For an installable app, this single command includes contracts, tests, compilation, and bundle verification:
./scripts/verify.sh /private/tmp/codex-watch-verifyDocumentation-only edits need link, authority, and whitespace checks; focused behavior changes need the relevant tests. Do not run the same prerequisites again before an aggregate gate.
Create a local universal release archive:
ARCHITECTURES="arm64 x86_64" ARCHIVE_ARCH=universal \
./scripts/release.sh /private/tmp/codex-watch-releaseSwift build intermediates use temporary storage by default; CODEX_WATCH_SCRATCH_PATH can select another nonsynced build directory. Release packaging first checks contracts, release-script regressions, and strict concurrency.
Keep signing output outside File Provider or other synced folders. Those services can attach Finder metadata to an app bundle after creation, which makes strict code-signature verification fail even when the source and build are valid.
Inspect workflow triggers before pushing. Use [skip ci] for routine pushes verified directly, including documentation updates. A separately authorized vMAJOR.MINOR.PATCH tag matching CFBundleShortVersionString triggers hosted release packaging and publication; it rejects a mismatched tag. An existing trigger does not authorize hosted execution when a direct path suffices.
Remove obsolete project build/temp outputs after use and keep one latest verified rollback app. Vibe View has no configured production server or Docker deployment. Keep preferences, user-selected exports, shared caches, and unrelated backups separate from app-build cleanup.
- ARCHITECTURE.md is the current structural authority.
- docs/PROJECT_MEMORY.md is the compressed durable handoff.
- AGENTS.md defines the required change and release workflow.
- Active behavior contracts and architecture decisions live under
docs/contracts/anddocs/decisions/.
MIT License. See LICENSE.
Vibe View is derived from CodexNotch by smallyunet. The original copyright and license notice are preserved. The Codex-only analytics architecture also drew practical inspiration from CodexBar while intentionally excluding its multi-provider, browser-cookie, and updater surface.