BurnRate is a free, local-first subscription tracker and spending analyzer. It helps track recurring subscriptions, free trials, upcoming renewals, category spend, cancellation savings, budget goals, and behaviour change — all without a backend, account, database, or API key.
- Monthly and yearly burn-rate dashboard
- Category breakdown chart and upcoming renewal timeline
- Inline subscription add/edit/delete workflow
- Free trial countdowns with urgency indicators and browser notifications
- Rule-based smart insights
- What-if cancellation simulator
- Trends panel (v3) — monthly burn history (24-month retention) with a 12-month forecast at your current rate
- Smarter alternatives (v3) — surfaces cheaper bundles (Apple One, Disney Trio, Game Pass Ultimate, etc.) and overlap warnings (multiple video streamers, redundant AI subs)
- Pending cancellations (v3) — schedule a cancel-on date; BurnRate auto-cancels on boot with a 7-day undo
- Savings ledger (v3) — running tally of monthly/annualized savings since your first cancellation
- Popular Services quick-picker (30+ pre-filled common subscriptions)
- Command palette via
Cmd+K/Ctrl+K(or the⌘Kheader button) - Paste-charges importer (v3) — paste a bank statement / email / receipts block; BurnRate parses charges client-side and proposes subscriptions to add
- Monthly budget cap with thermometer (green / amber / red / over)
- Annual cancellation savings goal with progress card and target date
- 22 ISO 4217 currencies with bundled FX rates (snapshot date documented in Settings)
- Per-subscription native currency + base-currency conversion on every total
- Editable per-currency FX overrides; no external API is called
- Optional passphrase lock (PBKDF2 + AES-GCM 256, WebCrypto)
- Lock screen on app boot when enabled; configurable auto-lock idle minutes
- Sync and share links remain cleartext — explicit warnings on generation
- CSV export and import (round-trips subscriptions, trials, budget, ledger, and theme)
- ICS calendar export — drop renewals and trial-end dates into Google / Apple / Outlook
.burnfile backup- Sync link — a
#sync=...URL that round-trips your full state across devices (full restore). v3 emitsBR2.payloads with preferences + currencies;BR1.payloads still decode. - Public share link — a
/s/<payload>URL with a dynamic OG image showing your monthly burn (read-only, notes stripped) - Shareable summary card with PNG download
- Installable on phone or desktop — works offline once visited
- App-shell cached by a service worker; install button appears when supported
- Skip-to-content link
- Keyboard-driven command palette
- Mobile-first responsive layout (375px and up)
- Dark and light themes
- Next.js 16 (App Router) on Vercel (no static export)
- TypeScript (strict)
- Tailwind CSS
- Recharts
- html2canvas (PNG share card)
lz-string(URL-encoded sync payloads)- Browser
localStorage+ service worker cache
npm ci
npm run devThen open http://localhost:3000.
To regenerate PWA icons after editing the source SVG:
node scripts/generate-pwa-icons.mjsnpm test # vitest, ~190 tests
npm run typecheck
npm run build- Visit BurnRate in a Chromium-based browser (desktop Chrome / Edge, Android Chrome) or a modern Safari.
- Look for the Install button in the header (visible when
beforeinstallpromptfires) or use the browser's "Install app" menu. - Once installed, BurnRate runs in standalone mode and works offline.
- Sync link (
/#sync=...): full data restore including subscriptions, trials, and budget. Anyone with the URL can see your data — don't share it. The destination prompts you to Merge, Replace, or Cancel. - Public share link (
/s/<payload>): read-only summary page. Notes are stripped before encoding. The page isnoindex. The OG image is generated dynamically at/s/<payload>/opengraph-image.
BurnRate stores all data in your browser's localStorage (plus an IndexedDB store for monthly snapshots since v3). There is no server-side storage, account, telemetry, or paid API.
When you generate a sync or share link, the entire payload is encoded into the URL fragment (sync) or path (share). URL fragments are not sent to the server. Path segments for share links ARE sent to the server when the link is opened — the server only uses the payload to render the read-only page and returns the OG image.
When the passphrase lock is enabled (v3): local storage values are encrypted with WebCrypto AES-GCM. Sync and share links remain cleartext — the receiving device couldn't decrypt them otherwise. Settings shows the warning prominently when you generate either type of link.