Changelog
What we ship, when. Updated on every release.
v0.21.0
- Every screen that models your financial independence — the Independence journey, the Roadmap, the Retirement Lab, and the dashboard — now computes "the assets your plan draws from" the same way: your net worth minus the equity in any home marked Primary Residence (rental and investment properties still count). Previously each screen had its own version of this rule, and they could disagree by millions on the same data. The Accounts banner and the methodology page state the one rule.
- The Retirement Lab’s stress-test tab could tell you that you had already reached your FIRE number when you were still slightly short of it — it treated "every modelled path gets there within about half a year" as "you are there today". It now compares today’s portfolio against the same target the simulation actually runs with.
- If the AI Advisor form had a problem — for example a required field that was hidden inside a collapsed section — pressing the generate button previously did nothing at all, with no message. It now tells you exactly which fields need attention, opens the sections containing them, and takes you to the first one.
- Long Chat replies used to stop abruptly mid-sentence with no indication anything was cut. Replies now have far more room, and on the rare occasion one is still cut short, it says so and invites you to ask for the rest. Chat also renders formatting properly (bold, lists) instead of showing raw asterisks, and tax figures are now framed to the current date with the same cite-or-refuse standard the Advisor uses.
- Importing a planner file now flags any row whose name matches something you already have — even when the amounts differ — showing both amounts so you can decide. Previously a row with the same name but a different balance could slip through and quietly double-count an account or an income stream.
- The Zakat calculator’s reserve metal prices (used when a live price is unavailable) had fallen far behind the market, which understated the Nisab threshold by roughly half. They now reflect verified current prices, and the calculator states when it is using a reserve price rather than a live one.
- The Benchmarks page now shows the survey it cites: net-worth brackets are the Federal Reserve’s 2022 Survey of Consumer Finances and income brackets are 2023 Census data, each labelled with its own vintage. FX rates also refresh themselves during long sessions instead of only at sign-in.
- Security housekeeping: all high-severity advisories in the app’s production dependencies have been resolved, and the biometric lock now records diagnostic detail whenever it locks unexpectedly, so a re-lock that shouldn’t have happened can be traced.
v0.20.0
- If you had recorded beneficiaries on the Estate page and then generated the lawyer-facing estate summary, it could show “None recorded” for beneficiaries — even though you had entered them. Two separate places were tracking beneficiary designations without either one knowing about the other. There is now one record, and anything you had already entered has been carried across automatically.
- The sample dataset used to explore the app with realistic numbers now fills in every section — including Insurance, Beneficiaries, Giving, Family, Pensions, Alerts, and Rules — across six currencies. Previously several sections had no sample data, so there was no way to see what they looked like before entering your own.
v0.19.0
- The Invest page now shows a balance for investment accounts that don’t have individual holdings recorded, instead of “No holdings yet” — which it previously showed even when the account held real money.
- VAT treatment can now be set per category — standard rate, zero-rated, or exempt — for your own expenses, rather than one flat rate applied to everything. Every category still defaults to the standard rate until you change it, so nothing in your existing totals changes unless you set it yourself.
- Biometric unlock now stays unlocked across tabs and after reopening the app, for as long as your idle-timeout window allows. Previously it reset the moment you opened a new tab, so switching tabs meant unlocking all over again. It still locks after your device has been idle, and after the browser fully restarts.
- Signed-in sessions older than 30 days are now retired automatically (previously 90), and you can remove a single session yourself from the list instead of only revoking every session at once.
v0.18.0
- The VAT export is now labelled “VAT estimate” rather than “VAT return” — it was never a submission-ready return, and the old name could be read as one.
v0.17.0
- Adding an asset or liability from inside the AI Advisor no longer crashes the page.
- When the shared price service can’t refresh, the app now says so instead of quietly reporting success — previously a failed price refresh looked identical to “not fetched yet,” and gain/loss figures could get stuck reading zero.
- Chat and the AI Advisor now say plainly when on-device AI mode can’t run inside the hosted app, instead of reporting it as “not reachable at localhost” — wording that read like a fault on your own device rather than a mode this app can’t offer online.
- The Estate page’s beneficiary checklist now correctly recognises the account types this app’s users actually hold — pensions, GIAs, and similar accounts. It previously matched only against US-style account types and could show no eligible accounts even when several existed.
- Beneficiary guidance now names the account types and institutions relevant outside the US, rather than 401(k)/IRA-style examples, and the claim that naming a beneficiary “overrides your will” has been softened to reflect that this depends on your jurisdiction.
- An ISIN (the code identifying a specific investment) is now checked for a valid format when entered, rather than accepted as any 12-character string.
- The list of countries you can record as “where you’ve worked” for pensions no longer reuses the will-drafting jurisdiction list — it’s now a plain, worldwide country list.
- Accounts — including ones brought in through a planner import — can now be edited and deleted directly from the Accounts page. Previously the only place to fix or remove one was the Net Worth page.
v0.16.0
- Cloud sync was silently rejecting part of your profile — including every FIRE planning assumption — so it never reached your cloud copy, even though sync otherwise looked like it was working normally. If you were relying on cloud sync as a backup, your profile was not among the data actually being backed up until this was fixed. The underlying sync rules are now deployed and checked automatically as part of every release, so a gap like this can’t go unnoticed again.
- Anyone whose investment preference was set to UCITS or Sharia-compliant could not save Settings at all — every attempt failed with no indication of what was wrong. This is fixed for both options.
- Net worth benchmarks previously compared your net worth, converted into your base currency, directly against wealth brackets stated in US dollars — inflating or deflating your percentile for anyone not on a US-dollar base. The comparison is now currency-consistent.
- The FIRE target behind your Roadmap number previously came from a fixed figure set once during onboarding, with no way to edit it afterward. It now tracks your actual monthly expenses, the same figure used everywhere else in the app.
- Saving in twelve places across the app — including Insurance, Alerts, Remittance, Family, Giving, Couples, and Estate — now tells you which field needs attention when a save doesn’t go through. Previously nothing happened and no message appeared, so a failed save looked identical to a successful one.
- Insurance, Giving, Family, joint Couples goals, and Estate digital assets and emergency contacts can now be edited in place. Previously the only way to correct one of these was to delete it and re-enter it from scratch.
v0.15.0
- Google sign-in on mobile is fixed. Three separate issues were compounding: the sign-in page could fail to load at all, a saved passkey could be rejected even when it was the correct one, and a signed-in user landing back on the login page saw it loop instead of continuing through. All three are corrected — sign-in should now be a single tap that lands you on your dashboard and keeps you there.
- The “A new version is ready” banner’s Refresh button now actually reloads the app. It previously did nothing when clicked.
- Gross rental yield is now calculated using only the value of property that actually produces rental income, rather than dividing by the value of all property you hold — which understated the yield by roughly half for anyone with a mix of rental and non-rental property.
v0.14.0
- Importing a PDF statement now shows a review step before anything is saved — the extracted transactions appear for you to check, edit, or remove, matching the CSV guided import. Cancelling adds nothing to your data.
- Large multi-page PDF statements that were too big to parse in one pass now import reliably — the statement is split on line boundaries and parsed in pieces.
- Monthly reports render formatted on screen instead of showing raw markdown characters.
- The AI advisor’s memory no longer accumulates duplicate or stale facts — near-identical facts are collapsed into one, and a superseded volatile figure (such as an out-of-date savings rate) is dropped rather than left to contradict the current one.
- Recent transactions on the dashboard show each amount in its own currency instead of relabelling it as your base currency — a £100 charge no longer reads as “$100”.
- Exporting VAT no longer crashes when a transaction has no category.
- The net-worth composition donut no longer blanks out when a holding is in a currency without an available rate.
- The dashboard’s anomaly and cashflow cards now show a clear “unavailable” state when their data cannot load, instead of a false “all caught up” or an endless loading skeleton.
- On-device AI (the fully in-browser WebGPU mode) now labels itself as on-device instead of showing the cloud provider’s name — the privacy signal matches what actually runs.
- A render error on one screen now shows a recoverable message with a retry inside the app, instead of dropping you out of the whole app. Error screens no longer surface raw internal error text.
- When the shared AI model is rate-limited or busy, AI insights and the advisor no longer wait out a provider backoff of roughly 30 seconds inside the request — they stop within a bounded timeout and show a clear “unavailable — try again” state.
v0.13.0
- A redesigned Home: net worth in your reporting currency with a 30-day change and one factual attribution line, a five-chip KPI strip (period change, FX impact, market impact, cash and invested share), and a composition-by-currency board that expands to item level. On a 1440×900 desktop the primary view fits without scrolling. The FX-versus-market split and per-currency sparklines build from snapshots recorded from today forward, showing “—” until enough history exists.
- The primary navigation is now five destinations: Home, Accounts, Budget, Invest, FX. Everything else moved under “More” — nothing was removed, and every page keeps its address.
- New Accounts destination: a dense, sortable table of your assets and liabilities — account, type, currency, native amount, ≈ reporting conversion, 30-day change, and trend; two-line cards on mobile. Per-account change and trend accrue from today forward and show “—” until at least two data points exist.
- New FX destination: every currency you hold, paired against your reporting currency — the current cross-rate, recent change, a sparkline, your held exposure, and a factual line on how currency moves changed your net worth. Rate history accrues one point per day of app use, forward-only: change figures and sparklines appear once at least two days are recorded, and are never backfilled. Pegged pairs (AED and SAR to USD) carry a quiet “pegged” badge.
- Budget is now a neutral current-month grid: Category, Spent, Typical, and a signed difference. “Typical” is the set budget converted to a monthly figure where one exists, otherwise the median of the last three months with data — never fabricated, “—” until enough months exist. Over or under is stated as a plain fact, not colored as an alarm.
- New Invest destination: a display-only read of the holdings managed in Portfolio, with a “Boglehead alignment” figure (0–100) — a measurement of how the current mix compares to an illustrative target allocation, with a full “How is this computed?” disclosure. Allocation drift is shown neutrally, there are no trade or rebalance controls, and the page carries a persistent informational disclaimer.
- Reporting currency: a display currency independent of your base. Every money surface shows the native amount with its ≈ conversion alongside, and a tooltip states the rate used and when it was fetched. Egyptian pound (EGP) joins the currency list, and onboarding now asks for a base currency up front.
- Desktop power layer: Cmd/Ctrl+K opens the command palette (five destinations, reporting currency, jump to an account); “g” then h / a / b / i / f jumps between destinations; right-clicking an amount offers copy and view-history actions; hovering an FX figure shows the rate and its as-of time — an indicative fallback rate is never presented as live. Mobile is unchanged.
- One net worth everywhere. Dashboard, milestones, couples, benchmarks, projections, and the AI advisor all read the same canonical figure — portfolio market value included, superseded lump entries excluded. Six surfaces previously computed it independently and could disagree. The dense-view tile that excludes home equity is now labeled “Liquid net worth”.
- Bond ETFs count as bonds. Funds recorded under the ETF type (AGGG, BND, SGOV, VAGE, the SPDR Portfolio bond series, and more, including exchange-suffixed listings) now land in the bond allocation of the diversification measurement instead of reading as 0% bonds.
- The advisor’s Monte Carlo projection starts from the same canonical net worth its report states — portfolio value included, superseded entries no longer double-counted. The projection remains a set of probabilistic ranges, not a prediction.
- Chart honesty: the net-worth trend axis uses compact labels that no longer clip, and its legend reads “Total assets” / “Net worth” instead of raw data keys. FX change labels state the true span when daily data is sparse (“+0.42% (5d)”) rather than implying a 24-hour move.
- Product analytics on the new surfaces record only a route name, a keyboard chord, or a three-letter currency code — never amounts, balances, or personal data — and only when analytics consent is on.
- All new motion completes within 400ms and is disabled when the system reduced-motion preference is set.
v0.12.0
- Net worth no longer double-counts crypto that was recorded both as a manual asset and as a portfolio holding — the two now reconcile to one figure, the way stocks and ETFs already did. If you tracked crypto both ways, your total corrects to the accurate, non-duplicated amount.
- Amounts now follow each currency’s own convention: zero-decimal currencies like Japanese yen show as whole numbers (¥1,000, not ¥1,000.00), and three-decimal Gulf currencies (BHD, KWD, OMR) show their full precision.
- The net-worth breakdown (“what drove your change”) no longer invents a gain or loss after you switch base currency. Snapshots recorded in a different currency are set aside instead of subtracted as if they matched the new one.
- VAT tracker reads descriptions like “incl VAT 5%” and “20% off, incl VAT” correctly — a rate is no longer captured as a fixed amount, and a non-VAT discount is no longer treated as the VAT rate.
- When a device copies your data up to cloud sync for the first time, a change you made on another device at the same moment is no longer at risk of being overwritten — the upload now defers to whichever copy is newer at the instant it writes.
- Turning off cloud sync now truly keeps new data on your device. An edit still waiting to upload when you switch sync off is no longer sent, and a leftover upload queue from an earlier session won’t sync on your next sign-in while sync stays off.
- Deleting your account is now sealed across every open tab, so a second tab can’t re-save data after the wipe. If the server-side deletion doesn’t confirm, the app returns to normal use instead of staying half-locked.
- A mistyped birthdate at the under-18 age check now signs you out rather than clearing your local data.
- Category rules and alert thresholds no longer re-stamp their edit time on every page load, so a real change made on one device isn’t overwritten by simply opening the app on another.
- When the password vault auto-locks after 30 minutes idle, its encryption key is now fully cleared — closing a gap where the vault’s own data could still be decrypted in the background until the page was reloaded.
- Retirement-simulator endpoints now require sign-in, are rate-limited, and bound their inputs, closing an anonymous compute-abuse path.
- Further security hardening: links in account emails are always built from the app’s own address rather than a request header, and the feedback endpoints are rate-limited per account.
- Restored the visual-regression and premium-tool test gates so pre-merge checks reliably catch marketing-page and gated-feature regressions again.
v0.11.0
- Two-factor authentication (TOTP) is available on every account — optional and strongly recommended. Compatible with any authenticator app; enable it anytime from Settings.
- Major security pass: closed 5 of 7 Critical, 4 of 9 High, and 14 additional findings from a hostile self-audit. Full status in SECURITY_AUDIT.md.
- Server-side token verification now checks revocation immediately — “Revoke other sessions” takes effect at the next request, not 1 hour later.
- Stripe checkout binds customers by verified user id only; eliminates billing-portal-by-email-collision risk.
- /api/subscribe rate-limited at 5/min/IP to prevent provider-cost abuse.
- Production builds fail fast if Firebase env vars are missing — no more silent dev-mode fallthroughs.
- 1136 unit tests passing (was 856 due to a pre-existing localStorage shim bug — fixed); 26/26 authenticated E2E green.
- VAT tracker stayed on the previous quarter past midnight on quarter boundaries.
- Stale dev-mode bypass could leak into production builds in two non-auth code paths — both now hard-gated.
v0.10.0
- AI Privacy Mode: Cloud (Gemini), Local (Ollama), or Local-only — server-enforced.
- Optional password-protected vault with PBKDF2 + 30-min auto-lock.
- AI usage analytics dashboard in Settings.
- 7-post blog at /blog covering FIRE, Sharia-compliant investing, expat finance.
- Comparison pages: vs Mint, vs YNAB, vs Personal Capital.
- Free Zakat calculator + UAE tax guide landing pages.
- CSV / PDF data export from Settings → Data Rights.
- Code-split dashboard widgets and AI advisor — ~30-40% smaller initial bundle.
- AI flow cache + transaction summarizer — estimated 60-80% token reduction.
- Sentry/PostHog scrub layer; AI input sanitization against prompt injection.
- TypeScript at maximum strictness; 260 unit tests passing.
v0.9.0
- Reliability: error boundaries, status page, feedback widget.
- Observability: Sentry + PostHog with DNT-respecting, PII-scrubbing capture.
- Feature flag system with localStorage overrides.
- Changelog popover with unread badge.
v0.8.0
- AI Advisor powered by Claude for personalized guidance.
- Voice input across quick-add flows.
- Command palette and global search upgrades.
v0.7.0
- Bank-connection framework scaffolded (Plaid + Lean) — automated account feeds targeted for early 2027; manual and statement import available today.
- Background price updates for tracked holdings.
v0.6.0
- Zakat calculator with Nisab thresholds and multi-asset support.
- Expat mode: multi-currency net worth, tax-residency guidance.
- FX rate caching and freshness indicator in header.
v0.5.0
- FIRE variants: Lean, Fat, Coast, Barista projections.
- Retirement and RMD simulators, Monte Carlo scenario planning.
- Tax-loss harvesting and year-end tax tool.
v0.4.0
- Estate, insurance, and family modules.
- Couples mode for shared financial planning.
- Giving + Goals tracking.
v0.3.0
- Portfolio, crypto, and property tracking.
- Debt and cash management with payoff calculators.
- Benchmarks and performance reports.
v0.2.0
- Dashboard, net worth, income/expenses.
- Budget envelopes and alerts.
- PWA install, offline shell.
v0.1.0
- Initial release: Firebase auth, settings, onboarding tour.