Spreadsheet model · v0
Started in a spreadsheet
Before any code, I built the entire FIRE model in Google Sheets, Monte Carlo, Roth ladder, state tax. Three friends asked me to run their numbers, which confirmed it was worth shipping.
A friendly retirement-planning website with an AI assistant that reads your numbers and explains, in plain English, what to do next. Built solo, end to end.
A website where you enter your savings, income, and goals, and it tells you whether you're on track to retire early , and what to change if you're not. An AI assistant sits alongside the calculator and answers questions in plain English ("Did the market just dropping 20% break my plan?").
People who've started thinking seriously about financial independence but find spreadsheets intimidating, and experienced FIRE planners who want a single place to model scenarios and stress-test their assumptions without learning a new tool.
Before any code, I built the entire FIRE model in Google Sheets, Monte Carlo, Roth ladder, state tax. Three friends asked me to run their numbers, which confirmed it was worth shipping.
Ported the spreadsheet to a single 366KB
index.html. No React, no bundler, the
calculator needs to load instantly, work offline, and
be inspectable.
You: Market dropped 22%, should I panic?
Advisor: Your plan is still in the 84th percentile. Guardrail rule: hold withdrawals flat. Want me to model a 12-month spending freeze?
The chat advisor's system prompt rebuilds on every message and includes all 30+ calculator fields plus a diff of what just changed. The AI doesn't know you generally, it sees the spreadsheet you're looking at right now.
Free tier = full calculator. $9/mo Plan Optimizer = named plans, drift alerts, AI chat, FIRE Moves engine. Stripe Checkout + webhook + customer portal in Netlify Functions. No custom billing UI.
Built the supporting cast: 4 SEO posts (4% rule, Roth ladder, retire at 50, how much), methodology and comparison pages, beta-feedback flow, sitemap, PWA manifest, plus a GTM folder with launch checklists.
Most FIRE calculators are spreadsheets pretending to be web apps: they take a few inputs, run one simulation, and tell you "you'll be fine" or "you won't." I wanted a tool that behaved like an actual planner, Monte Carlo for sequence-of-returns risk, Roth ladder modeling for early retirees, Guyton-Klinger guardrails, US state tax, and a chat advisor that could see all 30+ inputs and tell you what to actually do when something drifts.
The bigger goal: prove I could ship a monetizable AI product end-to-end, from problem framing to Stripe webhooks to a Product Hunt launch checklist, without leaning on a team.
Market dropped 22%, should I panic?
Your plan is still in the 84th percentile of success paths because you saved 38% last year. The Guyton-Klinger guardrail says hold withdrawals flat; don't increase. Want me to model a 12-month spending freeze?
Built the entire FIRE plan in a Google Sheet first, Monte Carlo via 5,000 random-return paths, Roth ladder by year, state tax tables. Following my own rule: automation has to follow a proven manual workflow.
Ported the model to a single 366KB index.html. No
React, no bundler. Decision was deliberate, the calculator
needs to load instantly, work offline, and be inspectable.
Build steps would have been a tax with no payoff.
Added a side-panel advisor. The system prompt rebuilds on every
message and includes all 30+ calculator fields
plus a changedSinceLastMessage diff. The AI doesn't
"know" you generally, it sees the spreadsheet you're looking at
right now.
Free tier = full calculator. $9/mo Plan Optimizer = named plans, drift alerts, AI chat, FIRE Moves engine. Stripe Checkout + webhook + customer portal, all in Netlify Functions. No custom billing UI, let Stripe own the surface.
Built out the supporting cast: 4 long-form SEO posts (4% rule, Roth ladder, retire at 50, how much to retire), methodology page, comparison page, beta-feedback flow, sitemap, robots, PWA manifest, and a GTM folder with Reddit/HN/Twitter/PH launch checklists.
Early versions had Claude inventing return assumptions and savings rates that didn't match the calculator. The advisor sounded right but was operating on vibes.
Fixed by rebuilding the system prompt every message with the full live calculator state, and surfacing a changedSinceLastMessage diff so the model can react to what you just changed instead of reciting your average.
The single-page calculator is great for performance but terrible for SEO, Google needs a surface to rank against "FIRE calculator" queries.
Split the architecture: launch.html as the marketing landing page with the animated demo, index.html as the app itself, and blog/ as a static folder of long-form SEO posts. Each page gets its own meta tags and keyword target.
The webhook flow worked perfectly in test mode, then fell over the moment I tried to wire live keys because the live products didn't exist yet and the price IDs were hardcoded in the frontend.
Moved price IDs into Netlify env vars and added a startup check that fails loudly if env is missing. The lesson: any "magic ID" the frontend depends on belongs in environment, not source.
The chat feature is dead the moment credits run out, and there's no graceful fallback message, just a 500.
Currently soft-blocking deploy until credits are refilled, but the durable fix (queued for v2) is a circuit breaker that switches the chat panel to "Advisor offline, try again later" with a tiny rules-based summarizer in its place.
I wanted "you saved 38% less this month, your plan slipped 4%" alerts, but I had no database, no auth, no cron.
Drift detection runs entirely in localStorage with a monthly snapshot. Alerts surface in-app on next load. The full email-cron version (Supabase + Resend) is a v2 item, but the in-product version ships today with no infrastructure.
The FIRE Calculator went through three distinct shapes. Each version came from a real failure of the previous one, not from a roadmap.
Spreadsheet. Just for me. Confirmed I had a model worth shipping when three friends asked me to run it for their numbers.
Vanilla JS port. Got it in front of 10 people from r/financialindependence. The complaint was always the same: "ok, but what do I do with this?" That was the gap.
Added the Haiku chat rail to answer "what do I do." Added named plans, drift detection, FIRE Moves engine, blog, launch page, pricing. This is the version on hold for deploy.
Real support email, Stripe live products, Anthropic credits topped up, custom domain, then netlify deploy --prod. Goal: first 10 paying users.
If Anthropic credits run out, switch to a rules-based summarizer instead of returning a 500. Tiny model running locally as the backup.
"Show me the 'what if I take a 6-month sabbatical' scenario." Spec already written; the calculator gets an alternate-state mode driven by Claude.
Real accounts, real persistence, real alerts. The drift-detection logic is already done in-app; v2 just gives it a backend so it can email you the day your plan slips.
A higher-tier subscription where I (or a partnered CFP) review your plan once a quarter. Hidden until subscription growth justifies it.
Currently CSV / manual input only. Plaid is ~$1.50/user/month, gates behind paid tier when scale justifies it.