Changelog
What's new in pulse. Versions follow semver; minor releases ship roughly every 4 weeks.
Last updated · 2026-05-15
Building in public — every release ships with a public PR + release notes on GitHub.
v1.8 — Cloud server runnable + PWA + ChatGPT export + macOS CI (2026-05-15)
Closing the remaining infra gaps. The cloud server is now bootable in one command, the landing is a real PWA with offline support, ChatGPT Plus exports import into the dashboard with a drag-and-drop ZIP, and a GitHub Actions workflow produces an unsigned macOS build on every push to main.
Added — runnable cloud server
python -m api.server --dev --port 8000boots the FastAPI server in dev mode (JWT signature verification bypassed; user_id derived from token sha1). Without--dev, the server requiresSUPABASE_JWT_SECRETand verifies every request.- Real HS256 JWT verification path — uses PyJWT if installed, falls back to a hand-rolled HMAC verifier so a basic Supabase Pro setup works with zero extra dependencies.
- New
/healthzendpoint reports dev_mode + supabase_configured flags — picked up automatically by Fly.io / Render / Railway health checks. - New
CLOUD_DEPLOY.md— step-by-step Supabase + Fly.io deploy (with fly.toml, Dockerfile.api, fly secrets set commands), alternative platform comparison table, env-var reference, cost-at-scale table. - 9 new pytest cases (
tests/test_api_server.py) covering health, unauthenticated rejection, dev-mode bypass, and every/v1/*endpoint shape. Total tests: 51 → 60.
Added — PWA with offline support
landing/public/sw.js— service worker with 4 strategies: network-first for/, stale-while-revalidate for content subpages, cache-first for hashed Next static + brand assets, no caching for/api/*. Precaches the 11 main routes on install. Old caches evicted on activate.- New
/offlineroute — fallback page when the network is down and the user navigates to a non-cached page. Reminds the user the pulse desktop app keeps working without the network. Lists which pages are cached. - Service worker registered from
layout.tsxon HTTPS only (skipped in dev). Manifest already existed; bumpingCACHE_VERSIONinsw.jsevicts stale assets after deploys.
Added — ChatGPT Plus export import
sync_chatgpt_export(zip_path)insync_tokens.pywires the existingparse_export_archive()fromproviders/openai_parser.pyinto the standard insert pipeline. Inserts approximate token counts (1 token ≈ 4 chars) since ChatGPT exports don't ship token counts.- Settings → Integrations → "ChatGPT Plus / Pro export importer" file-uploader. Drop the ZIP, pulse parses it server-side in a temp file, deletes the temp on success/failure, shows the count of imported messages.
- Integration matrix on
/: ChatGPT Plus export moves from Coming Q3 2026to Available now.
Added — macOS GitHub Actions
.github/workflows/build-macos.yml— runs on every push tomainthat touches Python or build scripts. Produces an unsigned.app+.zipas a workflow artifact (14-day retention). Includes a GITHUB_STEP_SUMMARY explaining how to bypass Gatekeeper for unsigned builds.release.ymlmacOS job ungated. Was previously hidden behind anAPPLE_BUILD_ENABLEDsecret; now runs on every release tag and attaches the macOS zip to the GitHub Release alongside the Windows installer. Signs only ifAPPLE_DEVELOPER_IDsecret is set; ships unsigned otherwise.
v1.7 — Multi-provider wiring + Ask pulse (2026-05-15)
Stop letting v1.1 scaffolding sit on disk. OpenAI + Cursor parsers were written months ago but never wired into the sync loop; Copilot + Gemini + the assistant tools were stubs returningNotImplementedError. This release ships them as real code so the integration matrix on this site stops describing aspirations and starts describing what runs.
Added — multi-provider sync
- OpenAI
/v1/usagesync — pulse pulls last-30-day GPT-5 / GPT-4o / o-series usage from your account when you paste an API key. Real pricing math from the public rate table; cache reads accounted for separately. - Cursor IDE local parser — read-only scan of Cursor's
state.vscdbon Windows / macOS / Linux. Approximate token counts from message char length; provider tagged ascursor. - GitHub Copilot org-level sync — for org admins. Daily suggestions-made / suggestions-accepted / chat-turn counts via
/orgs/<org>/copilot/usage, used to compute cost-per-accepted-suggestion against the flat seat price. - Gemini API key validation — single test call confirms the key works. Google AI Studio has no retrospective usage endpoint, so the parser inserts no historical rows and tells you to install the browser extension for going-forward capture (honest, not aspirational).
- All four wired into
sync_all()so they run automatically in the 6-hour background loop alongside the existing Claude Code log scan.
Added — Ask pulse assistant
- New Ask pulse sidebar nav item. Natural-language Q&A against your local data, powered by Anthropic Messages API + tool-use. User pastes their own Anthropic key in Settings; pulse calls Anthropic directly, never proxies through a pulse server.
- 5 tool functions implemented in
assistant/tools.py:query_subscriptions,query_token_usage,compute_savings,predict_monthly_total,activity_summary. All run read-only SQL against local SQLite — no writes, no uploads. - Multi-turn chat history persisted in session_state with a "Clear conversation" reset. Quick-action buttons for the 3 most common questions (top subscriptions, AI spend last 30d, EOM forecast). Tool-call log surfaced in an expander so you can see exactly what Claude queried.
- Up to 4 tool-use round-trips per question to keep cost bounded. System prompt instructs Claude to cite specific numbers from tool output rather than guessing.
Added — Settings → Provider API keys
- Anthropic API key field repurposed to power Ask pulse (in addition to Admin sync).
- GitHub Copilot org PAT + org slug fields added for Copilot sync.
- Mistral field tagged as planned (parser still pending Q3).
Changed — website
- Integration matrix on
/: 7 rows now Available now (Claude Code, Anthropic Admin API, OpenAI API, Cursor, Copilot org, browser extension, Ask pulse), 1 Coming Q3 (ChatGPT Plus export), 2 Planned (Gemini retrospective — Google API limitation, Mistral). /roadmap"Now" column expanded from 12 to 17 items. "Next" column slimmed to ship-able Q3 work only (cloud sync, mobile PWA, ChatGPT Plus export, Mistral, leaderboard, Stripe).
v1.6 — Website audit + privacy plumbing (2026-05-15)
Five-phase audit of the website and end-to-end privacy plumbing. Site shipped from "explains the vision well" to "honest about what's live today." Activity-tracking consent is now true end-to-end, not just a marketing claim.
Phase 1 — Honesty
- Lifetime Pro defused to an interest-list with no commercial promise — removed "first 500", "$199", and "every future Pro feature through v9.x". Final terms will be published before any sale.
- Pricing tiers got
Available now/Coming Q3 2026/Roadmapbadges. CTAs softened on unreleased tiers. - New "What you can use today" 3-column section above Screenshots.
- Pricing comparison matrix gained a Status column tagging every row.
/securitypage: top status-legend callout + per-claim badges (Implemented · local mode / Designed for Pro / Planned for Team / Enterprise roadmap / Not certified yet). New "Service-level claims" section says no SLA today.- Operator name and governing law (Thai law, Bangkok) added to footer and
/terms.
Phase 2 — Activation
- New
/downloadpage — OS card matrix, 4-step install walkthrough, data-location table, run-from-source snippet, troubleshooting accordion, SHA-256 verification guidance. - New
/methodologypage — Plan ROI formula, equivalent API value breakdown, full Anthropic pricing table fromsync_tokens.py, cache TTL explainer, cost-per-active-hour formula, cancellation savings formula, exact-vs-estimate table, honest limitations section. - Waitlist form gained optional segmentation: persona, OS, AI tools, monthly spend, plan interest, biggest pain. Success state replaced with a 3-step next-steps card + personal referral link.
Phase 3 — Credibility
- New Personas section: 5 cards — Solo AI users / Developers / Founders + Operators / Teams (Q3) / Finance + Ops — each with persona-specific jobs-to-be-done and tailored CTAs.
- New Integrations matrix: per-provider table (Claude Code, Anthropic Admin API, OpenAI, ChatGPT Plus, Cursor, Gemini, Copilot, Browser extension) with Status / Data source / Accuracy / Notes.
- Self-host vs hosted comparison added at the top of Pricing — 5 rows distinguishing Local Free / Self-host Cloud / Pro Hosted / Team Hosted / Enterprise.
- New
/roadmappage — public Now / Next / Later / Under consideration board with vote-via-Discussions CTA.
Phase 4 — Plumbing
/api/waitlistmade pluggable. IfSUPABASE_URL+SUPABASE_SERVICE_ROLE_KEYare set, inserts to awaitlisttable. IfRESEND_API_KEYis set, sends a plain-text confirmation email with the user's referral link. Both opt-in; falls back to Vercel logs if not configured. UTM + referral params (utm_source,utm_medium,utm_campaign,r) now captured.- New
landing/WAITLIST_SETUP.mdwith the Supabase SQL schema + Resend domain verification + Vercel env-var table. - First-run onboarding wizard expanded: from 4 sections to 7. Auto-detects Claude Code logs at
~/.claude/projects/*.jsonl, asks for explicit activity-tracking + window-title consent (both default OFF), shows where your data lives, optional demo-data seed (4 example subscriptions you can poke around with). - New Settings → Preferences → "Privacy & activity tracking" section: master tracking toggle, store-titles toggle, allowlist + blocklist (semicolon-separated), pause buttons (1h / until tomorrow / 1 week), export activity CSV, delete activity history. Plus a "Danger zone" expander for full local-data wipe with type-DELETE confirmation.
- Tracker honors privacy settings end-to-end.
tracker.pyrefreshes settings every 60 seconds. If tracking is off or paused, no rows are inserted at all. If window-title storage is off, the title column is always empty. Allowlist takes precedence over blocklist when both are set.
Phase 5 — Polish + production readiness
- Trust strip below Hero: 100% local · MIT open-source · no telemetry · 1 outbound call · no account.
- New
/docshub — 9 sections × 4 cards each. Quickstart, importing data, privacy & security, backup + export + data location, self-hosting, how pulse calculates things, security model, troubleshooting, FAQ by audience (developer / non-technical / founder / privacy-conscious). - CSS safety rules applied verbatim from the website brief —
box-sizing: border-box,overflow-x: clipon html/body,overflow-wrap: break-wordon text elements,word-break: anywhereon code paths. No horizontal scroll at 320–1440px. - Accessibility: skip-to-content link at the top of
/,:focus-visiblemint outline on every interactive element,prefers-reduced-motionmedia query that disables the ECG animation for users who set the OS preference. - Vercel Analytics added (
@vercel/analytics). Privacy-safe by default — no cookies, no PII. Disabled at build time viaNEXT_PUBLIC_ANALYTICS_DISABLED=1if you don't want it.
Phase 6 — Interactive demo + SEO landing variants
- New
/demo— interactive client page with persona toggle (Solo / Developer / Founder), synthetic-but-realistic subscriptions and token usage, all metrics computed live from the same formulas as the real app. Plan ROI / equivalent API value / cost per active hour / cancellation savings update instantly when you switch persona. "Demo data only — your real data stays local" banner at the top. Downloadable sample CSV. - New
/alternatives— honest 800-word comparison hub against ClaudeMetrics, Anthropic Console, OpenAI Usage, Vantage, Pry/Cledara, Mint (shut down 2024), YNAB, Lunch Money, Actual Budget. Includes "where pulse is genuinely worse" section (no shared dashboards today, Claude-first parser coverage, no bank auto-sync). Quick-pick guide table at the bottom. - New
/compare/claude-code-cost-tracker— focused SEO landing for the highest-intent search term. Explains the cache TTL 5m/1h pricing math, why most cost trackers are off by 10-60%, and the local-parser-no-upload advantage. - New
/compare/cursor-cost-tracker— Cursor-specific landing. Tells the truth about what's available now (subscription cost + foreground time + cost-per-hour) vs Q3 2026 (per-request token breakdown from Cursor's local state DB). - Sample CSV file at
/samples/pulse-sample-export.csv— same column structure as the real export, populated with the demo persona's data. - Hero CTA simplified to Download pulse + Try interactive demo (the demo replaces "View on GitHub" as the secondary action — GitHub stays in the header).
- Footer Product column + nav (desktop and mobile) updated for all 4 new routes. Sitemap priorities set.
Build verification
pytest 51/51 pass. Next 14.2.35 build clean (20 routes static at the end of Phase 6)./ at 115 kB First Load JS. /demo at 100 kB (client-side React for the persona toggle). Every other subpage under 97 kB.
v1.5 — Open-core + domain (2026-05-12)
Added
- Tier feature flag system —
account.get_tier()with 4 tiers (free/pro/team/enterprise) and 26 feature flags. Lock UI helpertier_lock_banner()for one-line gating. - Pricing landing page — 4-tier cards + 21-row feature comparison matrix + 8-question FAQ
- Settings → Plans & billing — current tier card, Stripe Customer Portal link, billing metadata
- Settings → Integrations — Slack / Teams / Discord webhook form (Team tier) + SSO row (Enterprise tier)
- PWA manifest — installable from browser with icons, shortcuts, brand colors
- Custom domain — mintforai.com live on Vercel
- Open-core docs — README now explicitly explains Logseq/Plausible/Cal.com pattern
- Vercel + Cloudflare DNS playbook — click-by-click for self-hosters
Changed
- Next.js bumped 14.2.5 → 14.2.35 (security patch)
metadataBaseset so OG images resolve correctly across all pathsthemeColormoved to viewport export (Next 14.2+ API)
v1.1 — Phase B foundation (2026-05-11)
Added — cloud + multi-provider scaffolding
- Cloud sync (
cloud/) — production-ready code for Supabase Auth + E2E encrypted sync - REST API (
api/server.py) — FastAPI server with auth, exports, leaderboard endpoints - Python SDK (
sdk/python/pulse_client.py) — programmatic access to your own pulse data - Browser extension (
browser-ext/) — Manifest V3 capture for ChatGPT, Claude.ai, Gemini, Perplexity - Cross-platform shim — foreground app + idle detection + notifications for Windows / macOS / Linux
- CSV + PDF export — full data export, monthly PDF reports via reportlab
- Slack / Teams / Discord integrations — themed daily digests, spend alerts, renewal reminders
Added — providers
providers/openai_parser.py— ChatGPT Plus + API + Team with current GPT-5/o3 pricingproviders/cursor_parser.py— Cursor IDE local state DB parserproviders/gemini_parser.py— Google AI Studio + Gemini app with current pricingproviders/copilot_parser.py— GitHub Copilot flat + GraphQL audit
Added — security + compliance
SECURITY.md— full threat model + encryption details + bug bounty plan- Audit log table (
audit_log) — all sensitive events tracked locally
Changed — UX polish
- Sub-action row no longer overlaps card (4px gap instead of -2px overlap)
- Streak chip glow radius reduced (no overlap with H1)
- Filter chips center-aligned with no leftover spacing from hidden radio circle
- Page header gets 8-12px breathing room before content
- Streamlit columns get explicit 1rem gap (was tight default)
- Top apps legend moved from bottom to header row
- ROI hero card moved to top of AI usage + Overview pages
- All Streamlit branding hidden (deploy button, viewer badges, footer)
Changed — performance
- Theme toggle no longer clears cache (2-3x faster switching)
- Smooth theme transitions on cards, tables, sidebar (180ms)
- Sidebar collapse → smooth slide animation (was snap)
v1.0 — initial public preview (2026-05)
New
- Theme toggle — sun/moon icon in sidebar, light + dark modes
- Subscription tracker — manual entry + Gmail-discovered receipts
- AI usage analytics — Claude Code logs auto-imported, equivalent API cost vs flat plan
- Activity tracking — foreground apps, idle-aware, auto-categorized
- Smart auto-detect — "monthly but not charged 60+ days = probably yearly or cancelled"
- Renewal alerts — Windows toast 3 days before bill
- Cost spike alerts — when today exceeds 3× your average
- Multi-currency — 30+ currencies, live ECB rates
- Plan ROI — see what your subscription saves vs API rates
- Streak tracker — consecutive days using AI (glow at 30+ days)
- Cancellation savings — track lifetime $ saved when canceling unused subs
- Smart suggestions — apps you use a lot but don't track as subscriptions
- Undo delete — 30-second window after deleting a subscription
- Backup + restore — auto daily, last 7 kept
- Leaderboard preview — coming-soon teaser with 5 categories
Coming next
- Cloud sync + mobile PWA (Pro)
- "Ask pulse" AI assistant — natural-language queries
- Cross-provider live: OpenAI, Cursor, Gemini, Copilot (Pro)
- Bank account auto-import (Plaid US, KBank/SCB TH)
- Receipt OCR
- Email weekly digest + push notifications (Pro)
- Friend leaderboard (5 categories, opt-in, aggregate metrics only)
Join the Pro waitlist for early access.