YAPFT — Household Financial Lifecycle Planner

Yet Another Personal Finance Tool · Working plan
Summary
Legacy wealth (today's $, plan as set)
This year
Flags
A/B — vs pinned baseline

§1 Inputs

Grouped by subsystem: each person's own operations first, then the children, the fixtures (house, cars), then the shared plan — location & taxes, the LLC, retirement, and end-of-life. Controls appear and disappear as the toggles that govern them change. Every control drives the full lifecycle model; save or restore the whole configuration from the Settings tab.
Input panels
Less-common levers: inheritance, second home, custodial accounts, sell & rent, Roth conversions, survivorship & LTC.
Person 1 — LLC owner
Job & pay
401k — this job's plan
Roth IRA
Inheritance
Person 2
Job & pay
401k — this job's plan
Roth IRA
Children
Per-child savings & college
House & mortgage
Cars
Other debts — student loans, cards, personal
Financial goals — save-for targets
Life events — sabbaticals, side income, windfalls
Location & taxes
LLC / side business
Retirement & savings — shared
Withdrawals
Constraints — floors the plan must never breach
Roth strategy
HSA
Social Security
Survivorship & end of life

§2 Verdict — total annual burden

Federal income tax (best of standard vs. itemized) + self-employment tax + state income tax + property tax, at the snapshot year selected above. Mortgage principal isn't a tax; it's excluded.
State A
State B
Delta (A − B)

§2B Filing day — refund or bill

Withholding is a prepayment, not the bill. A refund means you prepaid too much (an interest-free loan to the IRS); a balance due means you prepaid too little — either way the liability itself didn't change. Auto mode estimates withholding via the W-4 percentage method for a single MFJ job; two-earner households systematically under-withhold on default W-4s, so uncheck auto and plug in real paystub numbers when you have them.
State A — filing estimate
State B — filing estimate

§2B2 Lifetime refund / owed

The snapshot above, extended down the whole timeline using a lifetime withholding model: W-4 percentage method on wages, the default 10% on 401k distributions, and nothing on Roth conversions — which is exactly how conversion years produce surprise bills. Positive = refund, negative = owed at filing.

§3 Itemized vs. standard — the crossover

Mortgage interest front-loads: year 1 is the peak, then it decays every year while the standard deduction is flat (and inflation-indexed upward — held constant here). At some loan year your itemized total drops below $32,200 and standard wins. Extra payments accelerate that crossover — you save real interest but retire the deduction sooner.

§4 House price sweet spot

Federal tax saved by itemizing instead of taking standard, as a function of purchase price (year-1 snapshot, current rate/term/down). The knee of each curve is the price where itemizing starts beating standard — below it, mortgage interest and property tax are partially “wasted” inside the standard deduction; above it, each marginal $1 of interest or property tax returns only your marginal rate (~$0.22–0.24 federal). Bigger deductions always cost more than they save — the knee just marks where they start returning anything at all.

§5 Rate × term matrix (X = , Y = 15/20/30 + extra payments)

Total interest paid over the life of the loan, in $k, at the current price and down payment. Second line: payoff time / year-1 interest deduction. Click a cell to load it into the worksheet.

§6 Side business — what a dollar of profit actually keeps

Profit comes in two input modes (§1): the margin model (profit = opex × m / (1 − m)) or direct revenue − deductible expenses. Sole-prop profit picks up SE tax (15.3% on 92.35%), a 20% QBI deduction federally, and state income tax; an S-corp election swaps SE tax for payroll tax on a reasonable salary only — the distribution escapes it — at the cost of ~$1,500/yr of admin and a smaller QBI base. The Solo 401k employer share is a deduction W-2 employees simply don't have: up to 20% of net earnings (25% of salary under an S-corp) pre-tax into E1's retirement balance, on top of the W-2 401k limit. Each state's annual report/franchise fee is baked in (from $0 up to California's $820 franchise floor). The Yes/No LLC toggle in §1 zeroes the whole module.
This business, year 1
Quarterly estimated taxes

§6B Profit ladder — sole prop vs. S-corp at each level

The same household, with the business at different profit levels. "Keep" is the after-tax residue of the marginal business dollar stack — SE/payroll tax, federal at your marginal rate net of QBI, and state income tax. The S-corp column prices the whole election honestly: payroll tax on a reasonable salary (60% of profit, $35k floor), ~$1,500/yr admin, and the QBI base it gives up.

§7 Charitable giving — does it move the needle?

2026 rules: non-itemizers get up to $2,000 (MFJ) above the standard deduction; itemizers face a new 0.5%-of-AGI floor (first ~$1,000 of giving at this income deducts nothing). MA separately allows a charitable deduction against its 5% tax regardless of federal itemizing. The chart shows total burden vs. giving level; the readout shows your true after-tax cost per dollar donated at the current setting.

§2C Monthly cash flow

Gross to net to what's left after the house, at any year of the plan — scrub the slider or jump to an event. 401k deferrals come off the top pre-tax (income tax only — FICA still takes its cut). 529 contributions come out post-tax. Mortgage P&I (including your extra payments) and property tax then come off net pay. The §2 verdict, filing estimate, and the §2D budget below all follow the same snapshot (it's the same control as §1's deduction snapshot).
State A — monthly
State B — monthly

§2C2 Where the month goes — waterfall, Sankey, treemap

The same snapshot month as the cards above, drawn three ways, all framed like a real paystub: taxes and pre-tax withholdings (traditional 401k, HSA) come off gross first, and everything else is budgeted from net pay. The waterfall steps gross down through taxes and pre-tax savings to a net-pay bar, then through the budget stations to the surplus on the right (red if the month runs a deficit). The Sankey traces the flows — income streams merging into gross, taxes and pre-tax savings leaving first, then net pay splitting through housing and the budget categories down to individual line items; post-tax savings (Roth IRA, 529s, custodial) correctly draw from net. The treemap shows every dollar as area, grouped by destination. Scrub the snapshot year or click an event chip to watch the mix change.

§2D Monthly budget — where the discretionary goes

Percentages apply to the budget base: the discretionary figure from §2C minus car payments, debt payments, and child care — the fixed obligations come off the top, then the categories split what's left. Whatever isn't spent lands in a basis-tracked brokerage that compounds at the return set below — dividends are taxed as they arrive, gains only when a withdrawal actually realizes them (0% or 15%), and low-income years harvest gains tax-free — feeding the §10 net worth stack as its own band. Child care is per kid on each child's own clock (birth to age 13, CPI-inflated). Each category carries a FIXED/FLEX chip: FIXED marks a real fixed cost (insurance premiums default to FIXED) that the §2E goal optimizer will never trim; FLEX categories are fair game. The chip only governs the optimizer — every category spends identically in the model.
Budget settings
Spending categories
Surplus & retirement shape
State A — budget
State B — budget

§2E Financial goals — can the plan reach them?

Each goal from §1 is a future outflow paid from the savings account: one-time (a wedding in 3 years, a down payment in 5) or yearly (a standing vacation budget). Cards show the price at the target date, the level monthly saving that reaches it at your savings return, and whether the plan as configured actually covers it — verified against the simulated savings balance year by year, not just today's surplus. The optimizer trims the §2D spending categories (most-flexible first, never below half their setting) until every goal fits, then applies the result to the sliders. Categories marked FIXED in §2D — real fixed costs like insurance premiums or a set grocery budget — are never touched; tap a category's FIXED/FLEX chip to change its status.
Adjusts the §2D categories; undo by moving them back or reloading a saved file.

§9 Lifetime monthly cash flow — working years into retirement

Net after-tax take-home minus mortgage P&I and property tax, stacked: employment income in steel, retirement income in gold. Housing is charged against employment income first, overflow against retirement income. Watch three events: the mortgage payoff cliff (P&I vanishes), each earner's retirement (steel shrinks, gold appears), and the 529 contribution years ending. Everything recalculates from every other control on this page.

§9B Where every dollar goes

Gross monthly income stacked into its destinations, year by year: taxes, retirement contributions, kids, housing, cars, living, other (charity/ACA/fees), and surplus on top. Watch payments end — each car loan, the mortgage payoff, 529 contributions stopping — and their freed dollars widen the surplus band. Follows the §9 state selector.

§8 Retirement engine — 401k × 2 + Roth IRAs + 529

Each earner gets a 401k with its own balance and return; contributions flow in from the §1 deferral slider while that earner works. IRAs are modeled as Roth — at this income with a workplace plan, a traditional IRA is nondeductible anyway, so Roth (front door or backdoor) is the sensible default. Each IRA has its own balance, return, and contribution, on its owner's age clock. Withdrawals skim a fixed % of each account's remaining balance every year: the pot never runs dry, but a lean year pays out less. Custodial (UTMA) accounts trade the 529's restrictions for taxable growth under the kiddie tax (modeled — first $1,350 of each kid's annual gains free, next $1,350 at 10%, the rest at your marginal rate, paid from the account); the money is the child's property from the first deposit and leaves household net worth at 18. Each child runs the same schedule (CTC to 16, contributions to 17, college 18–21) offset by the born-in sliders in §1. "Today's $" deflates everything by the §1 inflation slider.
Accounts at owner's retirement
Combined pot & withdrawals
529 — per child at 18

§8B Withdrawal sequencing — which draw order wins

The same spending target sourced four ways, each a full re-simulation of your plan: proportional skims every account evenly; traditional-first spends the tax-deferred tank while brackets are low and leaves the Roth compounding untouched (and shrinks the balance future RMDs are sized against); Roth-first burns the tax-free space early — usually the costliest order, shown so the price is visible; smart re-decides every year: traditional fills the standard deduction and 10/12% brackets (RMDs and fill-to-bracket conversions claim that space first), taxable brokerage covers the rest while the 0%-LTCG window does its work, traditional above the cheap brackets only if needed, Roth last. A bracket-filling heuristic, not an optimizer — on some plan shapes a fixed order still wins, and the table shows it honestly. RMD floors are enforced in every order, and Roth conversions run on top of whichever you pick. Real retirement spending is held constant across the four sims — under a %-of-income budget each comparison run is pinned to your current order's realized spending path, so an order that grosses up income (big RMDs, Roth draws) can't win or lose by changing how much you consume; the ranking measures tax location only. Applies under the fixed-% rule once both earners are retired.

§8C Roth conversion plan — gap-year autopilot

The §1 conversion modes size one rule for every year; this scanner builds the plan those rules approximate. It re-runs your timeline with conversions off, finds the gap years — both retired, traditional balance still under the RMD start age, Social Security not yet flowing — and sizes each year individually: fill ordinary income to the top of the 22% bracket, but never cross the next IRMAA MAGI tier once the two-year lookback is armed (age 63+), and never over the ACA 400% FPL subsidy cliff while anyone buys pre-65 coverage and the subsidy is still alive ($1k of margin; income already past the cliff has no subsidy to lose). The schedule is then re-simulated and priced in legacy wealth against converting nothing. Apply plan writes the schedule into the plan and switches conversion sizing to "Planned" — the manual modes stay selectable without losing it, and the schedule saves and loads with your parameters.

§10 Net worth through retirement

Home equity + both 401ks + Roth IRAs + 529s + custodial, stacked through the end of retirement, with the dashed line reading the right axis: the house's share of total net worth. Retirement/529/custodial balances are state-agnostic, but the savings band is built from each state's budget surplus — so this chart follows the §9 state selector. Appreciation compounds the assessed value, which also raises property tax every year in §2/§9 — the house gets more valuable and more expensive to hold simultaneously. The 529 band ramps to 18, drains through the college years, and any residual keeps compounding (up to $35k can roll to the kid's Roth IRA).

§11 Trusts & the estate layer

Three trust flavors, honestly priced. A revocable living trust keeps assets titled and organized so the handoff (death, incapacity) skips probate — but the IRS sees straight through it: zero tax delta, its value is administrative. A credit-shelter (bypass) trust attacks the real tax at this wealth level: state estate tax. Each spouse gets an exemption (MA: $2M, use-it-or-lose-it, not portable); leaving everything outright to the survivor wastes the first spouse's exemption — the bypass trust preserves it, doubling the shelter. And a standing warning on non-grantor irrevocable trusts for income: trust brackets are compressed — 37% federal at roughly $16k of retained income — so income-shifting into one almost always raises tax at this level.
State A — estate at end of plan
State B — estate at end of plan

§12 Optimizer — retained-wealth DOE

A design-of-experiments sweep over the levers that change tax efficiency without changing your lifestyle: which state you live in (all 50 + DC screened first, top candidates get the full sweep), Roth conversion sizing, extra mortgage payments, and the credit-shelter election. The mortgage term is held at your §1 setting — a 15-year note isn't always attainable, and sweeping it drowned out the levers you can actually pull. Income, spending percentages, deferral, and withdrawal rate stay fixed too. Objective: end-of-plan net worth in today's dollars, minus state estate tax (legacy wealth). Click a row to load it into the worksheet.
Not run yet.

§12B Goal-seek — solve a lever for a target

The inverse of the whole worksheet: pick an output, a target value, and one lever, and a bisection search finds the lever setting that hits the target (if it's reachable inside the slider's range). Apply the result to load it into the plan.

§12D When can I afford it? — the earliest feasible year for a purchase

Enter a financed purchase — a second home, a boat, a sabbatical priced as a lump — and this finds the earliest plan year it stays inside your constraints (savings never underwater, plus any emergency-fund / disposable-income floor set in §1). The purchase injects as a second house: down payment out of savings at the buy year, its own mortgage, all-in carrying cost (% of value), appreciating equity. A "no" carries the shortfall — the gap you'd have to close. Deterministic path only: a feasible year is not a safe year (that's §13's funded %).

§12C Next best moves — ranked by actual dollar impact

Not generic advice: each candidate move is re-simulated against your exact plan and priced in end-of-plan legacy wealth (today's $), year-1 tax, and year-1 monthly surplus. Moves that don't apply to your situation are skipped; moves that cost more than they earn rank at the bottom. Click APPLY to load a move into the worksheet (everything stays reversible — nothing is saved until you save).
Not run yet.

§13B Stress — job loss

Zero out an earner's income for a window of months — wages, 401k deferrals, and employer match all stop; the budget keeps drawing whatever it draws. The callout below prices the event against the same plan without it.

§13C Term life — how much coverage does the plan imply?

For each earner: if they died next year, what's the smallest term-life payout (deposited to savings at death) that keeps the survivor's budget funded through the whole plan? Sized by bisection against the survivor simulation — spousal rollover, single filing brackets, reduced Social Security, all included. This funds the survivor's spending as configured; it does not restore the two-earner legacy number.

§14 Offshore — the honest aisle

§13 Risk — Monte Carlo & sensitivity

Flat returns are the baseline; Monte Carlo re-runs the same plan hundreds to thousands of times with real market variation (one correlated draw per year across every account) and reports what fraction of runs stays funded — with a 95% confidence interval, because a funded % is itself a sample: at 250 runs it carries roughly ±5pp of sampling noise, at 10,000 under ±1pp. A 250-run pass keeps the score live as you move sliders; pick a larger Runs count and press the button for the tighter answer (batches run in chunks — or in parallel workers when served over http — so the page never freezes, and any input change cancels and restarts). Random (normal) draws each year independently; History blocks replays contiguous runs of actual S&P annual returns (1928–2024, standardized then scaled by your σ) — bad decades arrive as decades, so sequence-of-returns risk survives instead of being shuffled away. History mode is the harder test; a plan that holds ≥90% there has earned it. A nonzero seed replays the exact same market draws every run — freeze the randomness to compare plan edits apples-to-apples. The crash-at-retirement toggle asks the deterministic worst-case question Monte Carlo only answers statistically: a 2008-sized drop landing exactly the year you retire, priced against the base path in the card below. The tornado perturbs each lever one at a time and ranks how hard each swings legacy wealth — it tells you which sliders deserve your attention.
Not run yet.
Not run yet.

§15 Compare — two plans side by side

Put two vault plans next to each other: a metric delta table and a real-net-worth overlay, each side a full deterministic lifetime simulation. Slot A defaults to the working plan; either slot can be any saved plan (Settings → Plan vault). Comparing never touches the working copy — the target plan is applied silently to a snapshot, simulated, and the working copy restored before anything paints. This is a different tool from the cockpit's A/B pin, which tracks the working plan against a pinned snapshot of itself.

Settings — save & load

The entire configuration — every §1 input plus every assumption below — as a single JSON file. Download to keep or share a scenario; upload to restore one exactly. The session also autosaves to this browser's local storage on every change and restores when you return — the file is still the export/share format.

PRO Plan vault — saved plans

Keep several named plans — a base plan and the what-ifs — and switch between them. A plan is an explicit snapshot of the full configuration (the same object the JSON download writes), stored in this browser's local storage; the working copy above stays autosaved and separate. Loading a plan replaces the working copy after a confirm. The active plan's name shows next to the app title, with a * when the working copy has diverged.

PRO Plan history — automatic restore points

The "I broke my plan and don't know what I touched" fix: an automatic snapshot on the first change of each day, plus manual checkpoints, stored in this browser (yapft-history, capped at 40 snapshots / ~2 MB, oldest automatics evicted first). Diff vs now lists exactly which settings differ; Restore checkpoints the current state first, so restoring is itself undoable.

PRO License

The Pro features above (plan vault, history, compare, PDF export) run on an offline license key: an Ed25519 signature verified on this machine against a public key baked into the app — no account, no server check, no phone-home, and the key never leaves your browser (yapft-license). Everything that existed before the Pro tier is free forever and never passes through this gate. If a key lapses, your saved plans and history remain listed, loadable, restorable, and exportable — only creating new Pro artifacts locks.

REF Strategy recipes — shareable plan modules

A recipe is a small declarative JSON module encoding a strategy — a set of §1 input values, assumption overrides, and life events — that can be shared and applied without touching your personal numbers. Recipes are never code: nothing in one is executed, every value is checked against a whitelist, and nothing applies until the preview below lists every change it would make (old → new). Revert undoes the last apply exactly. Format spec and examples: docs/recipes/FORMAT.md.

REF Export current plan as a recipe

Share a strategy without sharing your finances. Only inputs changed from the built-in defaults export; personal dollar amounts, balances, and names (wages, 401k balances, goal names…) stay out unless you opt in. Changed assumptions and life events export as their own sections. The result downloads as JSON and loads into the preview above so you can see exactly what it carries.

REF Document

Doc No.YAPFT-001
RevB
Filing StatusMFJ
Std Deduction$32,200
SALT Cap$40,400
Sheet1 of 1
MFJ · TY2026 (OBBBA) · Taxes + cash flow + retirement + net worth + estate · two-state comparison · Monte Carlo. Std deduction and SALT cap cells track the editable assumptions below.

REF Assumptions — model constants

The numbers the whole model runs on — statutory limits, rates, thresholds, and fees, loaded at their TY2026 (OBBBA) defaults. Every field is editable: change one and the entire worksheet recalculates. Edited values are highlighted, saved in the parameter JSON download, and restored on upload. Percent fields take whole percents (5 = 5%).
Resets every constant below to the built-in TY2026 values. Inputs (§1) are untouched.

REF Fine print — how the model works

FEDERAL TY2026 (OBBBA): MFJ std deduction (indexed) · brackets indexed · SALT cap per current law: +1%/yr through 2029, unindexed $10,000 from 2030 · mortgage interest + PMI deductible on acquisition debt up to the cap (prorated) · PMI auto 0.6% of balance while LTV > 80%, appreciation counts toward escape · CTC per child (indexed), −$50 per $1k MAGI over the threshold (unindexed, as in law) · addl Medicare over threshold (unindexed) · SE tax to wage base + Medicare; LLC owned by Person 1 · QBI, thresholds indexed, no-W-2 phase-out · charitable: AGI floor itemizing, above-the-line otherwise · 401k limit/person; deferral per earner per job · employer match per job, tiered: tier-1 rate on pay up to a % ceiling, tier-2 rate on the band above it, optional annual $ cap (indexed), matched on actual deferral (total-limit interaction ignored) · up to 5 sequential jobs per earner, month-granular: each phase has wages (nominal at its first month; raises compound on job anniversaries), deferral, plan return, and match; phases start and optionally end at an age+month, jobs after the first toggle on/off, uncovered months are gaps (no wages, no contributions; the balance keeps compounding at the most recent plan's return), overlapping phases resolve later-start-wins with no fall-back, and the statutory deferral limit is prorated across same-year plans · IRA limit/person as Roth (traditional nondeductible here; assume backdoor if over MAGI limits) · RMDs per SECURE 2.0, Uniform Lifetime Table, per traditional 401k, max(skim, RMD); Roth exempt; current-year balance approximation · Roth conversions: retirement→RMD window, proportional, ordinary income · Social Security 85% federally taxable, COLA = inflation; auto mode estimates the household benefit from the modeled wage history — real covered wages (CPI-deflated, wage-base-capped) plus assumed pre-plan years at the year-1 real wage from age 22, top 35 → AIME → PIA bend points (editable), claim-age adjustment (5/9%/mo reduction, 8%/yr delayed credit to 70), household = P1 + max(P2, 50% spousal; spousal takes the early reduction but no delayed credit) · NIIT: 3.8% on dividends + realized gains above the unindexed MAGI threshold ($250k MFJ / $200k single / 2×$200k unmarried partners), MAGI approximated as AGI + that income · AMT: parallel calculation adding back SALT and the standard deduction (mortgage interest, charity, medical, QBI survive), 26/28% rates, exemption with 50% phase-out; the excess over regular tax lands in the federal bill · Medicare from 65: Part B+D per person plus IRMAA surcharges tiered on current-year MAGI (real IRMAA looks back two years) · dependent-care FSA: up to $7,500 excluded from income tax and FICA while both earn and kids are in care; CDCTC at 20% on expenses past it, caps reduced by FSA dollars · kiddie tax: first tier free, second tier @10%, rest @ parents' marginal (indexed, realized annually, paid from account; LTCG rates simplified to ordinary).

STATE: MA flat rate + Fair Share surtax over threshold (indexed); exemption + FICA-paid deduction (capped); taxes 401k/IRA distributions and conversions; SS exempt; 529 deduction capped/return · NH: no wage tax, I&D repealed 2025 · VT (2025 figs, indexed): 3.35–8.75% MFJ brackets, $14,850 std + $5,100/person exemption, SS taxed above $75k AGI (phased from $65k), 3%-of-AGI minimum over $150k, 5% charitable credit (first $20k), 10% VHEIP 529 credit (first $2,500/kid) · ME (2025 figs, indexed): 5.8/6.75/7.15% MFJ brackets, federal-matching std deduction + $5,150/person exemption, SS fully exempt, pension deduction $48,216/person on 401k/IRA distributions (phaseout >$250k AGI modeled linearly to $350k) · LLC annual report fees per state (editable above) · State withholding auto-estimate applies to State A only.

LIFECYCLE: up to five children, child 1 born at plan start + its own offset, each later child offset from the previous, all per Children section; CTC to 16, 529/custodial contributions to 17, 529 spent 18–21, custodial exits household NW at 18 · withdrawals = % of remaining balance per retired account · home appreciation drives equity and property tax · home maintenance: editable % of value per year (default 1%) charged monthly while owning, primary + second home; renters exempt · job-loss stress: zeroes the chosen earner's months in the window — wages, deferral, and match scale with months worked · term-life sizing: bisection for the smallest death-year payout keeping the survivor sim's savings non-negative, worst-case death next year, rounded up to $25k · goal-seek: bisection over one lever's slider range; assumes the output is monotonic in the lever · autosave: full parameter set + assumptions to browser localStorage on every change, restored on load; the JSON file remains the export format.

ESTATE/TRUST: federal exemption $15M/person (not binding); state exemptions editable above, non-portable; schedules approximated; credit shelter modeled as 2× exemption at second death; revocable trust = grantor trust, no tax effect; non-grantor trust income brackets compressed (37% ≈ $16k) — shown as warning, not modeled as a strategy.

BUDGET/CASH: eight spending categories (groceries, utilities, transport, medical, auto/life/home insurance, misc), each with a % and a fixed-$ setting; %s apply to the budget base (discretionary minus car/debt payments and child care) · child care: fixed $/mo per kid from birth to age 13, CPI-inflated, charged off the top like a loan payment · charity subtracted from cash flow; surplus compounds in a basis-tracked brokerage: a dividend slice (1.8%) taxed annually at 15% (0% in low-income years), the rest unrealized until withdrawals sell proportionally (15%/0%), and years under the 0%-LTCG ceiling harvest gains — stepping basis up to the bracket top for free · HSA: family limit (indexed), above-the-line fed+state, tax-free skim in retirement (assumed medical; FICA exemption via cafeteria plan not modeled) · ACA gap: retired pre-65, benchmark premium/person, 2026 post-enhancement rules with the 400% FPL subsidy cliff (9.5% cap) — conversions and subsidies compete for MAGI · QCD: from age 71, charity ≤ withdrawals routed AGI-free (assumes 401k→IRA rollover; $108k/person limit not binding) · Conversions: fixed $ or fill-to-bracket-top (12/22/24), sized per year; cliff-aware modes fill the 22% bracket but stop under the next IRMAA MAGI tier from age 63, or under the 400% FPL ACA cliff while anyone is retired pre-65 — note these caps are year-local: converting less leaves a bigger traditional balance, and the RMDs it forces later can land in higher IRMAA tiers anyway (§8B and the tornado show the net) · Downsize: sale at E1 retirement, 6% costs, §121 $500k shield, 15% LTCG on excess, proceeds → savings, rent thereafter · Tuition: per kid ages 18–21, inflates CPI+2pts, 529 first then cash; at $0 the 529 simply holds · Monte Carlo: see the MONTE CARLO paragraph below · Inheritance: income-tax-free lump (today's $, inflated to receipt year), routed to savings or mortgage-first; stepped-up basis assumed · Cars: up to five amortized loans (payments end at term; freed payment reabsorbed by surplus, fully so in fixed-budget mode), values depreciate 12%/yr and sit in net worth · Other debts: up to five fixed-payment lines (balance, rate, payment/mo) charged against the budget like car loans; remaining balances net against net worth; a payment below monthly interest never amortizes — the balance grows · Financial goals: up to five named targets, one-time (paid from savings at the target year, today's $ CPI-inflated) or yearly (recurring from the start year to end of plan); required-saving figures use FV-of-annuity math at the after-drag savings return; the §2E budget optimizer trims spending categories (flexibility-weighted, floor = half the current setting, FIXED-locked categories excluded; insurance lines lock by default) until the simulated savings balance covers every goal · Rent-then-buy: pre-purchase years pay rent (today's $, CPI-inflated) with no property tax or equity; the down payment exits savings at the appreciated purchase-year price and the mortgage schedule starts at the buy year (inheritance→mortgage routing applies only once the loan exists) · Budget modes: % of base (post-housing, post-car) or fixed $ inflated at CPI; negative surplus = under budget, drains savings · Lifetime withholding model: W-4 pct method on wages, 10% on 401k distributions, none on conversions — refund chart and era suggestions built from it.

SURVIVOR: spousal rollover merges accounts, SS ×0.67, filing single thereafter (single brackets/std exact; state exemptions and bracket widths halved as approximation) · Catch-ups at 50 and 60–63 (indexed); forced Roth above the wage floor (SECURE 2.0); Roth-split slider routes base deferral (taxed at entry, no RMD) · Guardrails: real target = rate × pool at first withdrawal; ±20% rate bands trigger ∓10% spending steps; RMD floors still enforced · LTC: final N years, CPI+2 inflation, deductible medical above 7.5% AGI · Spending smile: ×1.1 first 10 retirement yrs, ×0.9 next 10, ×0.8 after · 2nd home: bought at appreciated price, down from savings, interest deductible under the COMBINED acquisition cap (balance-based approximation), property tax at State rate into SALT, equity in NW · Savings rate = (401k both types + IRA + HSA + 529 + custodial + positive surplus)/gross · Standard-of-living ratios = real living spend vs year 1 · Offshore section is educational; FEIE illustration assumes E1's wages fully qualify.

FILING & STATES: all 50 states + DC — MA/NH/VT/ME and NY with bespoke detail, everything else via a filing-status-aware engine rebuilt from each state's own published TY2026 schedules: its actual single AND married-filing-jointly brackets (so doubled, separate-MFJ, and same-schedule marriage-penalty states are each represented, not assumed to double), per-status standard deductions, personal AND dependent exemptions or credits, high-income phase-outs and deduction addbacks, and retirement/senior rules (full exclusions, per-person caps, AFAGI age deductions, Social-Security interactions). NY is bespoke for its tax-benefit recapture; validated case-by-case against published tables for CA/CO/IL/MD/NC/NJ/NY/OH/PA/VA (36 checks in test/states.test.js, sourced in docs/state-validation.md). Still not modeled: city income taxes (NYC/Yonkers, Ohio/Alabama municipalities), state AMTs, AGI-phased standard deductions (AL), federal-income-tax deductibility (AL/LA/MO/MT/OR), most narrow state credits, and partial Social-Security taxation for under-65 filers in a few states · estate tax schedules for the 13 jurisdictions that levy one · unmarried-partners mode files two real returns (E1 HoH with kids/house-share/business, E2 single), shared costs split by income share, each with their own SALT and $750k caps; the wedding-year slider switches to a joint return at year N · withdrawal draw order (both retired, fixed-% rule): proportional, traditional-first, Roth-first, or smart, RMD floors always enforced; the §8B comparison holds real spending constant — under a %-of-income budget the three alternate-order sims are pinned to the current order's realized real spending path (fixed-$ budgets are already order-invariant), so legacy deltas reflect tax location, not consumption response · smart order, one ordered pass per year (no search): tier 1 draws traditional up to the standard deduction + top of the 12% bracket for that year's filing status (CPI-indexed; RMDs already forced out count first, and fill-to-bracket Roth conversions claim the headroom before discretionary draws), tier 2 sells taxable brokerage (gains through the basis tracking, 0% whenever the LTCG window is open), tier 3 traditional above the cheap brackets, tier 4 Roth — known simplifications: tiering keys on federal ordinary brackets only (state tax, IRMAA, and NIIT are still priced in the resulting year but don't steer the tiers), no multi-year lookahead or lifetime optimization, no asset-location advice; those are future iterations.

MONTE CARLO: each path re-runs the full lifecycle sim with one standardized shock per year, correlated across every account (a single equity-style factor — no bond/inflation stochastics, no fat tails or regime switching) and scaled by the σ slider. Draw modes: iid samples each year's shock independently from a normal — clean statistics, but it shuffles away sequence-of-returns clustering; history blocks replays contiguous windows of standardized 1928–2024 S&P annual returns, preserving how bad decades arrive as decades (at the cost of only ~97 distinct starting points, so paths reuse history). Funded % = share of paths whose savings never go negative; it is a sample proportion, so the readout carries a binomial 95% confidence interval of ±1.96·√(p(1−p)/n) — about ±5pp at 250 runs, ±1.9pp at 1,000, ±0.6pp at 10,000; run more paths when two plans differ by less than the interval. The fan chart shows per-year 10/25/50/75/90th percentiles of real net worth across paths (pointwise percentiles, not sample trajectories — no single path traces a band). Randomness: mulberry32 PRNG, one independent stream per path keyed by (seed, path index), so results are identical whether paths run chunked on the main thread or split across workers; seed 0 draws a fresh session seed per page load, a nonzero seed reproduces the exact funded % and fan chart across reloads. A 250-run pass auto-refreshes after input changes; bigger batches run on demand, chunked (or on http(s), fanned out to web workers) with cancel-on-input.

SRR CRASH STRESS TEST: one extra deterministic lifecycle sim with a crafted shock vector — zero everywhere except the crash window, which starts the first year both earners are retired (the later of the two retirement ages). The crash-year shock is −(drop + 7) percentage points on every account's return, where 7% is a nominal reference equity return, so a typical ~7%-return account returns ≈ −drop% that year; each recovery year applies half the shock. The card prices the crash path against the base path in end-of-plan legacy wealth (today's $) and counts underwater budget years. Limits: a single deterministic path, not a distribution; the shock hits every account's return uniformly (equities-style — no bond allocation, glidepath, or interest-rate modeling); crash timing is fixed at retirement, the classic worst case for sequence-of-returns risk but not the only one.

TERMINAL WEALTH GOAL — DIE WITH ZERO: Perkins' Die With Zero argument: an unspent estate is life energy earned and never used, so unless bequests are the goal, the optimum is to spend the wealth down to a small safety margin. The toggle never mutates the plan; it runs a solver and presents a suggestion. Lever: retirement spending in this model is the budget target, not the withdrawal rate — the %-of-base budget can never overspend (surplus ≥ 0 by construction), so the solver works on the fixed-$ budget scale, bisecting one multiplier across the eight categories (≤ 25 iterations) at the current withdrawal settings until the plan just satisfies two constraints: minimum real spendable assets (401k + IRA + HSA + brokerage, pre-estate-tax — at near-zero terminal wealth estate tax is moot, and the house isn't spendable without selling it) over the final decade ≥ the safety floor, and savings never negative in any year — the LTC tail lives in that final decade, so a plan that dips underwater at 82 and recovers on paper fails. The floor (default 2× the final year's annual spending, editable) exists because the deterministic path is roughly the median: a plan tuned to end at literal $0 fails about half of Monte Carlo paths, which is why the card re-measures the funded % at the solved spending level — every dollar of buffer spent is a dollar not absorbing a bad return sequence. APPLY writes the solved level to the actual budget category levers (switching the budget to Fixed $ if needed). Honest limits: a %-of-balance (or guardrail) withdrawal rule cannot annuitize the pool to zero — pushing the rate up mostly prepays tax and moves assets to the lower-return taxable account (the sim prices this; it destroys far more than it unlocks), so a residue usually remains and the card reports it. The textbook die-with-zero instrument — converting the estate into a lifetime annuity — is not modeled and is the natural next step.

CONSTRAINTS: the plan is checked against a set of floors it must never breach, distinct from targets it should hit. Solvency (the savings account never goes negative in any year) is always on — it is the same feasibility test the goal, die-with-zero, and insurance-sizing solvers use. Two more are user-settable and default to off: an emergency fund (liquid savings ≥ N months of that year's spending, every year) and a disposable-income floor (real monthly surplus ≥ a set amount, in working years). Each constraint reports not just pass/fail but the tightest year, the amount required vs. on hand, and the shortfall; when several are breached the binding one (the worst relative slack) is named. A constraint is a floor, not a goal: setting a 6-month emergency fund does not make the plan save toward it — it flags the years the plan would fall below it. Because the two optional constraints default off, turning them on is the only thing that changes a plan's feasibility verdict.

WHEN CAN I AFFORD IT (§12D): a financed purchase (price, down %, rate, term, all-in carrying cost %, appreciation %) is injected into the plan as a second house at a candidate year — down payment out of savings at the buy year, its own mortgage P&I, carrying cost as a flat % of the appreciating value, appreciating equity into net worth. "Feasible" means the constraint set (§1) holds every year the purchase is held: it is a floor test against your constraints, not a prediction. The solver bisects for a candidate earliest year, then confirms it against a full year-by-year scan and never returns a bisection root the scan would beat — if the scan finds an earlier feasible year it reports the plan non-monotone and shows a window that can close (a purchase affordable at 45 can be infeasible at 70 once wages stop). In this engine feasibility is monotone in the buy year in practice (savings compound, so a later year means a bigger buffer), so the window rarely closes, but the guard is there. A "no" always carries the shortfall in the closest year — a number you can act on. The deterministic path is used: a feasible year is not a safe year — funded % under market variation is §13's job. Not modeled: rent-vs-buy, property-specific tax beyond the flat carrying cost, more than three purchases.

WHEN SHOULD I? — TIMING OPTIMIZER (§13): once §12 has the feasible years, this ranks them by one of four objectives and returns the whole curve, not just the winner. Max legacy (terminal wealth after estate tax, today's $) and Max lifetime spending usually favour buying late — the down payment stays invested longer. Min lifetime tax often favours buying early — draining the taxable brokerage sooner cuts years of dividend/gains/NIIT drag. Max funded % runs Monte Carlo (100 seeded paths per candidate year, a fixed seed so the recommendation replays across clicks), because a feasible year on the deterministic path is not a safe year. The objectives genuinely disagree — the point is not that one is right, it is that you must choose which question you're asking. The most important output is the flat flag: if the best and worst feasible years land within 2% of each other (or, for funded %, within the ±5pp Monte-Carlo noise floor at 100 paths), the tool reports a window and says timing barely matters — a solver that reports false precision is worse than no solver, because the user acts on it. Compute is capped at 400 lifecycle sims: past that the year granularity coarsens to 2 then 5 and the readout says so, rather than freezing the tab or returning a coarse answer as though it were exact.

ROTH CONVERSION PLAN (§8C): the autopilot scans a conversions-off run of the plan for gap years — both earners retired, a traditional balance still under the RMD start age, and Social Security not yet flowing (SS from the first retired year means no quiet-bracket window, and the card says so) — then sizes every eligible pre-RMD year individually: convert up to the top of the 22% bracket (ordinary income measured as wages + taxable withdrawals + 85% of SS, same stack as the engine's fill-to-bracket modes), capped by the distance to the next IRMAA MAGI tier from age 63 (IRMAA prices this year's MAGI into Medicare premiums two years later, so the lookback arms two years before 65) and by the ACA 400% FPL cliff with $1k of margin while any retiree is pre-65 — but only when baseline income sits under the cliff: a household already past 400% FPL has no subsidy left to lose, so the cliff doesn't bind there. Post-SS years stay in the schedule with the benefit income shrinking their headroom — the taper the acceptance chart shows — and the schedule ends when RMDs take over. The schedule is scored by re-simulating it (legacy wealth vs converting nothing); a negative delta suggests nothing. Applied schedules are nominal per-year dollars stored with the parameters and re-capped by the engine at the eligible balance. Staleness detection: an applied schedule is a snapshot of the plan at apply time, so while one is active every recalc re-derives what the scanner would now suggest and compares year by year — material drift (any year off by more than 5% or $2k, or years added/removed) surfaces a nudge with the legacy delta of re-deriving and a one-click re-apply; the applied schedule's own run is also asserted against the three ceilings the scanner sizes with (top of the 22% bracket, the next IRMAA tier from 63, the ACA 400% FPL cliff, same wages + taxable withdrawals + 85%-of-SS income stack) and a breach escalates the wording with the offending year. Nothing is ever auto-mutated — nudge and one click only; if the re-derived plan is now empty or unprofitable, the one click removes the stale schedule instead. Honest limits: each year is sized against the baseline path, not jointly optimized — no lifetime-tax search, no state-tax-aware sizing, no heir-bracket modeling; it is the bracket/cliff heuristic made year-aware.

LIFE EVENTS: user-defined cash-flow events (up to 20 on the card, 50 in the model), evaluated in one additive pass per simulated year — they compose with, and never replace, the built-in kid/college/second-home/downsize/inheritance machinery. Three kinds: expense — a recurring outflow charged against that year's cash flow (pre-tax spending, so it shrinks the budget base and the surplus), or, when funded from savings, sold out of the taxable brokerage through the same basis-tracked machinery as goals (realized gains taxed honestly); income — a recurring inflow that, when marked ordinary income, stacks into the year's return through the full tax engine (federal brackets, state tax, credits, IRMAA and ACA MAGI — so it prices marginally, not at a flat rate; no FICA, like retirement distributions), or lands tax-free straight in savings; windfall — a one-time inflow to taxable savings, income-tax-free at receipt, compounding thereafter. Amounts are today's $ (optionally held nominal); start is a plan year or either earner's age; duration in years, windfalls always one. Diamond markers on the §10 net-worth chart flag every active event year. Not modeled in v1: conditional triggers ("when kid 1 turns 18…"), funding from retirement accounts, and any per-event tax treatment beyond the ordinary-income/tax-free flag (no capital-gain events).

STRATEGY RECIPES: shareable plan modules are declarative JSON only — whitelisted §1 input values, assumption-registry overrides, and life events; no recipe code is ever executed and no recipe string is ever rendered as HTML. Validation rejects unknown top-level keys and prototype-pollution keys outright, skips unknown section keys with a per-key warning (forward compatibility), and caps string and list sizes; the preview diff lists every change before anything applies, and revert restores the exact pre-apply state (one level). Applied recipes are recorded with the saved parameters and disclosed here.

COMPARE (§15): each side is one full deterministic lifetime simulation (no Monte Carlo shocks) of a saved plan or the working plan, run off a plain-data snapshot exactly the way the Monte Carlo workers run theirs. The target plan is applied to the global state silently and synchronously — no recalculation, no chart redraw, no autosave — flattened, and the working copy restored in a finally, so a failure mid-swap can never leave the wrong plan in your session; an isolation assertion re-checks the working copy after every compare. Delta metrics use the cockpit's own formulas: legacy = terminal net worth minus estate tax in today's dollars, lifetime tax = the sum of every simulated year's total tax, goal funding = the savings balance surviving through each goal's horizon. Auto-Social-Security plans re-derive their benefit estimate from each side's own wage history.

PLAN VAULT: saved plans are explicit named snapshots of the full configuration — the exact object the JSON download writes (single serialization path; a saved-then-reloaded plan is byte-identical to a file export at save time). They live only in this browser's localStorage (yapft-plans): no cloud, no account, nothing leaves the machine. The autosaved working copy is a separate layer — loading a plan overwrites it (after a confirm), saving never touches it. If browser storage is full, the vault operation fails with a message and the working copy is unaffected. Deleting all plans is its own control with its own confirm; clearing the autosave never touches the vault.

PLAN HISTORY: automatic restore points for the working copy — at most one snapshot per calendar day, triggered by the first change of the day that actually differs from the newest snapshot (no-op saves never snapshot) and storing the pre-edit state, so the day's snapshot preserves yesterday's end state before today's edits pile up; plus manual checkpoints with optional labels. Snapshots are the same full-configuration object the JSON download writes (single serialization path), stored only in this browser's localStorage (yapft-history). Caps: 40 snapshots and ~2 MB serialized, evicting oldest automatics first — manual checkpoints outlive automatics until only manuals remain — because history must never be the reason a save fails. Restore always checkpoints the pre-restore state first ("before restore"), so restore is itself undoable. History tracks the working copy only; vault plans are their own explicit layer.

PDF EXPORT: "Export PDF" assembles a print-only report — plan name, verdict summary and snapshot-year tax cards (the cockpit's own values, cloned, never recomputed), the headline charts captured at 2× resolution, a grouped key-inputs summary, edited-assumption deltas, this methodology text, and a disclaimer — and hands it to the browser's print engine (window.print() → "save as PDF"). No PDF library: the browser already does pagination and vector text, so the document stays searchable and copyable. The Monte Carlo fan is included when a batch has completed this session and omitted with a note otherwise. Nothing is uploaded anywhere; the report is built and printed entirely on this machine.

PRO TIER & LICENSE: four features are Pro — the plan vault, plan history, compare, and PDF export; during the alpha they are free and badged as such. Everything else in the app is free forever and structurally cannot be gated (features outside the Pro registry never reach the license check's false branch). The license is a signed key verified offline: an Ed25519 signature checked against an embedded public key via WebCrypto on this machine — the app makes zero network requests it didn't make before, holds no accounts, and sends nothing anywhere. A missing or expired key locks only the creation of new Pro artifacts (save-as, new checkpoints, compare runs, PDF export); existing vault plans stay listed, loadable, and JSON-exportable, and history stays restorable — your data is never hostage to a key.

NOT MODELED: city/municipal income taxes (NYC/Yonkers, Ohio & Alabama cities), state AMTs, narrow state credits beyond the personal/dependent/senior exemptions and credits now in the engine, AGI-phased standard deductions (AL), federal-income-tax deductibility (AL/LA/MO/MT/OR), partial Social-Security taxation for under-65 filers in a few states, VT property-tax income adjustment, MA senior circuit breaker, sequence-of-returns risk beyond Monte Carlo and the §13 crash stress test, 20% top LTCG rate. Planning sketch, not tax advice.

Planning sketch, not tax advice · save/load, statutory constants, and full fine print: Settings.
Built by Ben Kahan · source at github.com/bkahan/yapft