Skip to content

Releases: JasonYeYuhe/cli-pulse

CLI Pulse v1.12.0 — runtime language switching + Sessions tab + PDF export

01 May 06:29

Choose a tag to compare

CLI Pulse v1.12.0 — runtime language switching + Sessions tab + PDF export

Localization

  • In-app language switcher on macOS — globe icon in the menu-bar footer, immediately left of the refresh button. Tap to switch between English / 简体中文 / 日本語 / System Default. Changes take effect instantly without a restart and cover every surface: tabs, Settings, Onboarding, Remote Approvals, Subscription, Yield Score, exported PDFs, even the rarely-touched Folder Access and Provider Config screens.
  • Apple .strings parity: 601/601/601 keys across en/ja/zh-Hans, zero diff.
  • Android strings.xml parity: 191/191/191 across en/ja/zh-rCN.

Sessions tab

  • Sessions tab now reliably shows fresh Codex / Claude activity in real time, even when you're signed in and paired across multiple devices. Stale "ended" rows from prior helper uploads no longer linger in the list — only what's actually been written to JSONL in the last 5 minutes shows up.
  • Cloud-route session merge: paired Mac users now see locally-detected JSONL sessions merged with cross-device cloud sessions in a single coherent list. Earlier draft missed fresh JSONL whose token cache hadn't caught up; now bypasses that race.
  • Codex sessions display the actual project name (extracted from the rollout JSONL's cwd) instead of a generic "Codex" placeholder.
  • Session row relative timestamp now anchors to last_active_at, so synthesized rows don't immediately render as "5m ago" because of an internally-backdated started_at.
  • Filter strips legacy helper-process artifacts (/Applications/Claude.app/..., node --no-warnings ...) so they never resurface in cloud cache.

PDF export

  • macOS Export → Export PDF Report now opens an NSSavePanel defaulting to ~/Downloads/cli-pulse-report-YYYY-MM-DD.pdf. Cancel = no file. Save = file lands where you can find it; Finder reveals it automatically. No more silent temp-directory dumps.
  • PDF content is fully localized in the active language, including all section headers, table headers, summary keys, and the footer (now uses Bundle.main short version, no longer hard-coded v1.9).

Provider quotas

  • Claude (Designs / Daily Routines): new quota tiers display correctly with their own remaining counts; Sonnet-only tier no longer collides with weekly tier in the breakdown.

Subscription tier resolution (backend)

  • Rank-safe get_user_tier(): a Pro promo grant can lift a free user up but never downgrades an existing Team admin grant. Active paid subscription always wins. Backend-only change — no client UI difference.
  • New promo_redemptions table (service-role only) for future XHS / Twitter campaign grants. No client redemption UI; tier delta picks up on next refresh.

Stability

  • iter21 hotfix included: CostForecastEngine no longer crashes on the last day of a month.
  • iter21 helper sync: gradle exit code is now checked, so a stale APK can never ship if the macOS helper build silently failed.
  • Sentry: auto-uploads dSYMs + Proguard mappings on every build. DSN keys rotated.

Tests

  • 628/628 Swift tests pass (added 14 new across LocaleOverrideStoreTests, SessionFreshnessFilterTests, CodexCandidateDetectionTests, PDFDestinationTests).
  • Helper Python: 33/33.
  • Android: testDebugUnitTest green.

Install

  • macOS: download CLI-Pulse-Bar-v1.12.0.dmg below; signed + notarized + stapled. App Store version (Mac App Store) is queued for review separately.
  • Android: download CLI-Pulse-Android-v1.12.0.apk below for sideload. Play Store closed-testing release is uploaded separately.
  • iOS: queued for App Store review.

CLI Pulse v1.11.0 — major sign-in & onboarding polish

29 Apr 15:07

Choose a tag to compare

CLI Pulse v1.11.0 — major sign-in, onboarding & reliability polish

Sign-in & accounts

  • Google / GitHub sign-in fix: resolved "OAuth state parameter is invalid" error that blocked sign-in on real devices. Root cause was a client-generated state query param colliding with Supabase's PKCE flow's server-side state management — code_verifier alone is the CSRF anchor.
  • Login screen modes: clearer Email Code vs Password modes — buttons no longer flip labels based on whether the password field is empty.
  • Delete Account: now reliably surfaces server errors (token expired, network failures) with a clear alert, instead of silently signing you out while leaving your account intact server-side. macOS uses an inline confirmation flow that doesn't fight the menu-bar popover.
  • Sign-out flow: now properly clears Remote Approvals and push-token state, so account-switching on the same device works cleanly without an app relaunch.
  • APNs push registration: gated on authenticated state — no more "Failed to register for push notifications: Session expired" message on the login screen.

Onboarding (Mac)

  • Top-right close (✕) button on every onboarding step + "Skip for now" on the Sign-In step. No more being trapped on the Welcome screen.
  • After delete-account or sign-out: lands on Settings (Sign-In form) instead of an empty Overview, with a bottom Quit button on every signed-out screen.
  • Welcome screen offers a clear pick: "Sign in to sync" vs "Use local mode".

Local mode (Mac, new)

  • New "Use local mode" option for users who want collector data without an account. Tracks AI tool usage on this Mac only; nothing is uploaded.
  • Local Mode guide card on Overview explains what's happening and how to switch to cloud sync later.

Cross-device sync (iPhone)

  • Fixed: iPhone Dashboard could show "Waiting for data" forever even when the Mac was actively collecting. Same-account users now see their Mac data automatically — no manual device pairing needed. Dropped the obsolete paired gate that was tied to the helper-daemon model.

Provider banner (free plan)

  • Fresh free-plan users no longer see "Disabled 23 providers" warnings on first launch. The plan-limit banner now only fires when actively-used providers genuinely exceed the limit (gated on canonical activeProviderCount, not raw enabled-toggle count).

Remote Approvals hardening

  • Concurrent decide on two devices no longer surfaces a raw database error — clean "Request already decided" message instead (ON CONFLICT (request_id) DO NOTHING idempotency, applied as migrate_v0.34).
  • Closed several push-token registration races during sign-in / sign-out.

Under the hood

  • 535+ swift tests across iOS / macOS / shared core; all passing.
  • Backend RPCs unchanged in signature; helper / edge function unchanged.
  • 14-commit hotfix series (iter8 → iter20) folded into this release.

Thanks for the bug reports!

CLI Pulse Android v1.11.1

30 Apr 00:26

Choose a tag to compare

Android release v1.11.1 — synced with iOS version.

CLI Pulse Android v1.11.0

29 Apr 15:07

Choose a tag to compare

Android v1.11.0 — synced with iOS / macOS v1.11.0 release. See v1.11.0 release for the full changelog.

CLI Pulse v1.10.7 — OAuth cancel + macOS session scanner restore

27 Apr 16:41

Choose a tag to compare

CLI Pulse v1.10.7

Fixes

Google / GitHub sign-in cancel — Tapping "Cancel" on the provider consent screen now returns you to the sign-in screen with a friendly "Sign-in cancelled" message instead of navigating out to the CLI Pulse website. The in-app sign-in sheet closes properly on cancel.

macOS helper session detection restored — The process scanner was missing AI coding tools launched through Node (Claude Code, Codex CLI, Gemini CLI, and others), so the Sessions tab on iPhone/iPad stopped showing fresh rows for many users. The scanner now reads argv via sysctl(KERN_PROCARGS2) and detects node-launched tools again. Your Sessions list will fill in with current data the next time the macOS helper runs.

iPhone Overview: Subscription Utilization + Provider Usage — Both cards were blank on cloud-only iPhone setups. They're back, with Provider Usage bars now scaled by cost (not tokens) and sorted biggest-spend-first. Free-tier providers with usage but no cost keep a minimum visible bar.

iPhone Providers toggle — The card you just toggled off now stays visible so you can toggle it right back on without digging. An "All providers hidden" empty state with a "Show All" action is added too.

Downloads

  • macOS DMGCLI-Pulse-Bar-v1.10.7.dmg (12 MB, signed + notarized)
  • Android APKCLI-Pulse-Android-v1.10.7.apk (4 MB, signed upload key)
  • App Store — v1.10.7 submitted for review today (iOS + macOS, build 41)
  • Google Play — v1.10.7 (versionCode 19) pending manual Closed Testing upload

SHA256

```
aca84c9eb409688237ad1973367061e2b67de9d0a5b391cdd03c601765a1e9fa CLI-Pulse-Bar-v1.10.7.dmg
1e01f437a77d78e75ad3b2a74fd49bbbd5a3e17f874844dc7709452b1ce0cd74 CLI-Pulse-Android-v1.10.7.apk
c61611d7a14c4b6e415fd3d2ce07bc11e183b8ec9b8138d12e33173aa8ff5657 CLI-Pulse-Android-v1.10.7.aab
```

Requirements

  • macOS 13.0 Ventura or later
  • iOS / iPadOS 17.0 or later
  • Android 8.0 (API 26) or later

CLI Pulse v1.10.6 — accurate 30-day cost + quieter alerts

27 Apr 16:41

Choose a tag to compare

CLI Pulse v1.10.6 — accurate 30-day cost + quieter alerts

Fixed

  • Dashboard 30-day cost now shows the real total from your usage history. Previously the iPhone / iPad / Apple Watch clients extrapolated from a 7-day window (week × 4.3), which under-reported by ~50% on typical usage patterns. The server now returns the real 30-day sum from daily_usage_metrics, so the "30 Day Est." tile matches what the Mac menu-bar app shows.
  • Per-provider cost breakdown on iPhone no longer shows <$0.01 for every provider under the "30 Day" header — each row now displays its real 30-day spend.
  • Device CPU spike alert stopped spawning a new row every 2 minutes. The alert now updates in place, so you see one current "CPU is elevated" entry instead of a growing stack.

Improved

  • Repeated notifications dampened. If several alerts belong to the same ongoing issue (same project, same quota window, repeated CPU spikes), the app now fires a local notification only the first time — until that group is resolved or clears from the feed.

New

  • "Resolve All" button on iPhone / iPad Alerts tab, matching the macOS version. Clears every open alert with one tap, and issues a single batched refresh instead of one per alert.

Under the hood

  • Supabase schema v0.24 — provider_summary RPC exposes estimated_cost_today, estimated_cost (7-day, back-compat), and new estimated_cost_30_day. Additive only; older clients keep working against the new server.
  • Client-side suppression-key state persisted to UserDefaults and correctly filters out resolved alerts so re-occurrences still notify.
  • resolveAlerts(_:) batch API uses TaskGroup for concurrent network calls and a single terminal refreshAll().

macOS notes

  • macOS App Store build 1.10.6 (40) submitted and pending review.
  • Notarized DMG for direct download attached to this release.

CLI Pulse v1.10.4 — macOS Claude quota + FREE-tier fix

27 Apr 16:41

Choose a tag to compare

What's new in v1.10.4

macOS-only bug-fix release. iOS / iPadOS / watchOS / Android users: stay on v1.10.3 — no binary change.

Claude quota bars work again

A type-mismatch in the OAuth usage parser was silently zeroing out the 5-hour / weekly / Sonnet / Opus windows on macOS. Anthropic's /api/oauth/usage endpoint returns utilization as a JSON number that Foundation decodes as Double (e.g. 9.0); a bare as? Int cast on NSNumber(Double) returns nil, so every window collapsed to ?? 0 and then to nil in the cached snapshot — rendering as "Quota data unavailable". Now coerces via NSNumber.doubleValue.rounded(). Your iPhone will also see real numbers again once the fixed macOS helper pushes to Supabase.

Free plan handling is deterministic

Fresh installs on the free tier used to enable all 26 providers, instantly triggering an "over plan limits" warning. On first launch the app now picks your 3 most-used providers — ranked by recent usage → configured credentials → first N of the default list — and shows a one-time dismissable banner explaining what it kept. Disabled providers get a "Limited by free plan" badge in Settings → Providers so you can swap which three you want.

"Connect Claude Code" button

New Settings → Claude → Connect Claude Code button that explicitly triggers the macOS cross-app keychain prompt. The sandbox blocks silent reads of the "Claude Code-credentials" keychain item, so OAuth was failing invisibly on first launch. Now you tap, accept once, done — token cached in the app's own keychain for future reads.

Clearer error copy when Claude quota is missing

No more "try /usage in the CLI" — that slash command was removed in Claude CLI v2.x. New copy: "Signed in as X — Connect Claude Code in Settings" (when we have an email) or "Claude quota unavailable — Connect in Settings → Claude" (when we don't).

Helper-side filter

CLI Pulse Helper now filters local sessions + quota data by the user's enabled-provider set before pushing to Supabase — respecting the tier-migration result end-to-end rather than silently dropping 23 providers server-side.

Internal hygiene

  • Account metadata (email / tier / weekly reset) is now cached in a separate claude_account.json sibling file so diagnostic copy survives quota-fetch failures.
  • applySignedOutState clears tier-migration UserDefaults so another account signing in on the same Mac starts fresh.
  • Keychain reads happen off the main actor — no more beach-balling while waiting on the prompt.
  • Migration idempotency is now gated by the natural enabledCount > maxProviders check instead of a persistent flag, so subscription downgrades re-fire correctly and upgrades clear lock badges automatically.

Install

  • Direct DMG (below): notarized + signed, drag to /Applications.
  • Mac App Store: v1.10.4 build 38 is submitted; waiting for Apple. Direct-DMG users get the fix immediately.

Under the hood — review gates

Two rounds of Codex review + two rounds of Gemini 3.1 Pro review (full diff) before commit. See docs/FIX_PLAN_claude_quota_and_free_tier_2026_04_23.md in-tree for the detailed plan.

CLI Pulse v1.10.3 — Sentry crash reporting

27 Apr 16:41

Choose a tag to compare

What's new in v1.10.3

Crash reporting, privacy-first

CLI Pulse now ships with Sentry crash reporting across macOS, iOS, and Apple Watch. The goal is simple: stop finding out about bugs through App Store 1-star reviews.

What's scrubbed before anything leaves your device:

  • Your provider API keys (OpenAI, Anthropic, Claude, Gemini, etc.)
  • OAuth / Bearer tokens, JWTs, Supabase session tokens
  • /Users/<you>/... paths in stack traces → /Users/[user]/...
  • Any field whose name contains token, secret, password, api_key, supabase, keychain, or similar fragments
  • Your email, IP address, and device username (PII disabled at the SDK level)

No performance tracing is collected — only crashes and explicit errors, nothing else.

See the updated PRIVACY.md for full details.

Platforms in this release

  • macOS (Mac App Store + direct DMG) — v1.10.3 build 36
  • iOS / iPadOS — v1.10.3 build 36
  • watchOS — v1.10.3 build 36
  • Android — held at v1.10.2 for this cycle; next Android release will catch up

Install

  • Direct DMG: download CLI-Pulse-Bar-v1.10.3.dmg below, drag to /Applications. Notarized & signed.
  • Mac App Store / iOS App Store: coming once Apple approves this build.

v1.10.2

27 Apr 16:41

Choose a tag to compare

Hotfix release — Claude weekly reset was computing in the user's local timezone instead of Claude's actual anchor (Asia/Tokyo). For users outside Asia/Tokyo, the reset countdown was off by 9–14 hours. Pinned the canonical weekly-reset calendar to Asia/Tokyo so the reset time is now correct regardless of the user's device timezone.

The bug lived in v1.10.1 and earlier. If you're on Asia/Tokyo, nothing you see changes. If you're anywhere else, your Claude weekly reset in the menu bar will now line up with Claude's real rollover time.

  • macOS (outside App Store): download CLI-Pulse-Bar-v1.10.2.dmg below (notarized + stapled).
  • Android (sideload): download CLI-Pulse-v1.10.2.apk below.
  • macOS / iOS (App Store): v1.10.2 is in Apple Review (replaces the canceled v1.10.1 submission).
  • Android (Google Play): v1.10.2 AAB uploaded to the Closed Testing track.

v1.10.1

27 Apr 16:41

Choose a tag to compare

Post-release follow-ups to v1.10.0 after Codex review:

  • P2 (user-visible): Notification dedupe now survives cold launch. v1.10.0 would re-fire notifications for every unresolved alert in the feed on every app relaunch, especially noisy after v1.10.8 enabled iOS local quota-alert synthesis. previousAlertIDs is now persisted to UserDefaults.
  • P1 (backend): Retention cron now has standalone time indexes on commits.committed_at / sessions.last_active_at / daily_usage_metrics.metric_date / yield_score_daily.day. Previous composite indexes with leading user_id would have degraded to seq scan at 2-3 year scale. Applied live as schema v0.23; EXPLAIN confirms Index Only Scan.
  • P3 (Swift 6 forward-compat): TeamView now reads userId from AuthState @mainactor cache instead of crossing into the APIClient actor boundary synchronously. WatchAppState's 3 Task-in-closure sites now bind self to a let before the Task hop, satisfying strict concurrency.
  • Architecture doc: docs/ARCHITECTURE.md consolidates the god-class decomposition rules (env-injection sites, MenuBarLabel cross-contract pattern, ProviderConfigWindowContent scene-body isolator, access-control preservation on forwarders, actor-crossing avoidance, SECURITY DEFINER + pg_cron backend patterns) from 14 PROJECT_FIX archives into one reference.

Builds: build 34 on macOS/iOS, versionCode 15 on Android.
Replaces the canceled v1.10.0 Apple Review submissions — Apple will review build 34 instead.

Install

  • macOS (outside App Store): download CLI-Pulse-Bar-v1.10.1.dmg below (notarized + stapled).
  • Android (sideload): download CLI-Pulse-v1.10.1.apk below.
  • macOS / iOS (App Store): v1.10.1 is in Apple Review; the App Store listing will update once approved.
  • Android (Google Play): v1.10.1 is in the Closed Testing track.