Work · case study

Fiscal Compass

A retirement planner that solves for the earliest age you could stop working and still fund every year, with the arithmetic on show.

Year
2026
Role
Design and build
Stack
React, TypeScript, Mantine
AI
Assisted, heavily
Status
Live, sample household
Links
The dashboard for the fictional sample household

Outcome1,000 simulated market histories per plan, fifteen insight rules, seven stress tests, and no network calls.

Problem

The usual retirement calculator asks for four numbers and returns one. The interesting part is exactly what it throws away: taxes, debt payoffs falling off, college years, the pre-Medicare healthcare gap, and required distributions forcing money out at 75. I wanted a planner that kept all of that, ran on my own machine, and showed its working, so I could argue with it instead of trusting it.

Constraints

  • Local-first. No account, no server, no network calls. Balances live in the browser they were typed into.
  • Real numbers never ship. My own profile is gitignored, and the production build refuses to run while it exists.
  • Not financial advice. Every rule of thumb shows its math, and choosing products stays out of scope.

Design decisions

Solve for the age, not the balance

Most calculators answer “will I have enough?” with one balance at 65. Fiscal Compass answers the question people actually ask: the earliest age that still funds every year, across 1,000 simulated market histories, clearing an 85% bar.

Passed on · a single projected balance.

Success probability by retirement age for the sample household, crossing the 85% target at 56 and levelling off near 100%
What each extra year of work buys, as a curve of success probability.

Show the math

Every insight card names the guideline it measures against and shows the numbers behind it, so you can disagree on the merits. A tool that only reports problems trains you to ignore it, so the cards affirm good calls too. Not overpaying a 3% mortgage gets said out loud.

Passed on · a score or a traffic light.

The emergency-fund insight card: liquid savings, monthly spending, months covered and the gap to six months, above the guideline it measures against
Each finding carries the arithmetic it came from.

Stress tests, because worry is specific

The Monte Carlo says how often a plan works. Stress tests answer the question people lie awake with: what if this particular bad thing happens? A lost decade, a crash the year you retire, stagflation, a year out of work.

Passed on · asking people to read a probability distribution.

The stress-test table: seven scenarios, each with what happens, its outcome, the ending balance and the change from baseline
The sample plan against each shock, with its ending balance and change from baseline.

Two inflation rates

Official CPI indexes the tax code. It doesn’t index groceries. Tracking the two separately shows the squeeze one rate hides, and over fifty years a one-point gap is a different retirement.

Passed on · one inflation slider for everything.

Build notes

React 18, Vite and TypeScript, with Mantine components and CSS Modules. The projection engine is plain functions over the plan, so every screen, the Monte Carlo and the stress tests run the same arithmetic. Data lives in IndexedDB on the device, and the spending import reads bank CSVs in the browser without uploading them.

A Vitest suite of 234 tests across 10 files covers the tax engine, the projection and each insight rule. The one I’d point to guards frozen raises. A review found that a year out of work never froze a salary quoted as a premium over inflation, so pay came back as if nothing had happened: $301,575 instead of $281,388 on the sample household, and the raise-freeze insight priced a lost raise at $0. A test now fails on the old code.

Outcome

Live at fiscal-compass.nineafterten.com with a fictional sample household, so anyone can try it without typing in a thing. I learned to trust my own read of my situation. The first answer on paying off a loan early was sound in general and wrong for my household, and the plan is better because I argued the point.

What’s next

Roth conversions modeled year by year, IRMAA surcharges, state graduated brackets, and a glide path that de-risks the portfolio as retirement gets close.