3-Year Action Plan
3 consecutive years · select any start
Year-by-Year Summary
▼
click to collapse
Balance Trajectories
Personal Information
If ages look wrong, use Export tab → Reset All Data to clear cached values
Key Variables (Global Defaults)
Total return (price + dividends) — overridable per year range
Dividend yield on brokerage/securities account only
Interest on cash balance (e.g. HYSA rate)
Brokerage only — retirement accounts (IRA/Roth) always reinvest internally. If paid out: brokerage price growth = Growth Rate − Dividend Rate. If reinvested: dividends stay in brokerage, no separate cash income.
Applies when dividends are paid out. Ordinary = regular income rates; Qualified = 0/15/20% preferential LTCG rates
e.g. 3 = 3% annual increase
Annual Social Security cost-of-living adjustment
Default annual wage & self-employment income growth. Overridable by year range in Override Tables. SOY entries always take priority.
e.g. 30 = 30% of security sale proceeds is taxable gain
Minimum cash balance to maintain
Social Security
Age benefits begin (62–70)
At start age
9999 = indefinite
IRA, RMDs & Medicare
—
Auto: age 73 if born 1951–1959, age 75 if born 1960+ (SECURE 2.0)
—
Auto: age 73 if born 1951–1959, age 75 if born 1960+ (SECURE 2.0)
Balance split equally to zero by this year. 9999 = not applicable
MEDICARE / IRMAA
0 = off · 1 = Base tier (~$218K) · 2 = Tier 1 (~$274K) · 3 = Tier 2 (~$342K) · 4 = Tier 3 (~$410K) · 5 = Tier 4 (~$750K). Converts IRA→Roth to stay below ceiling.
Stay this far below the tier limit
Sets IRMAA surcharge for plan year 1 (2-yr lookback)
Sets IRMAA surcharge for plan year 2 (2-yr lookback)
Employee Inputs — Person 1
e.g. 6 = 6% — global default
9999 = ongoing
1099/consulting end year · 9999 = ongoing
Employee Inputs — Person 2
9999 = ongoing
Starting Balances
All balances are entered on the Start of Year tab. The model starts with zero for any year not entered. Go there to enter your actual opening balances for 2026.
Start of Year Entry — Click any year row to enter actual balances and income for that year.
Entered values override the projection for that year and all subsequent years resume from those balances.
Rows highlighted green have data entered.
Overview — All Years
Edit Year
Click a year in the table above to edit it.
Override any variable for a specific year range — enter only the fields you want to change and leave the rest blank.
Last matching row wins when ranges overlap, so you can layer a narrow range on top of a wider one.
Use 9999 as End Year to mean "forever." Changes take effect immediately.
▶
Spending & Taxes
Lock in spending amounts, tax funding, or deductions for specific years
Spending
Override the amount of spending and/or the amount withheld for taxes for one or more years. Spending will increase from this amount the following year unless reset.
| Spend Amount ($) | Pct Change (%) | Tax Override ($) | Start Year | End Year |
|---|
Tax Deductions
Enter itemized deductions when they exceed the standard deduction — mortgage interest, charitable contributions, SALT (fed capped at $10K), large medical expenses. Model uses whichever is higher.
| Fed Itemized ($) | CA Itemized ($) blank = CA standard | Start Year | End Year | Notes |
|---|
▶
Roth Conversion Strategy
Control IRA-to-Roth conversions and Medicare income targeting
IRMAA Level Target
Sets the Medicare IRMAA tier ceiling for a year range — the model converts IRA to Roth to stay just below that tier's income threshold. Level 0 = off, 1 = Base (~$218K), 2 = Tier 1 (~$274K), up to 5. Fill mode (F) fills toward the next tier; Roth mode (R) draws Roth to avoid exceeding it.
| IRMAA Level (0–5) 1=Base·2=Tier1·3=Tier2… | Fill Mode (F/R) | Start Year | End Year | Notes |
|---|
Income Level (ACA / Pre-Medicare)
Sets a MAGI ceiling before Medicare kicks in — useful for staying below ACA subsidy cliffs or bracket ceilings. Converts IRA to Roth up to but not above this target. Ignored once IRMAA target is active.
| MAGI Target ($) | Start Year | End Year | Notes |
|---|
Tax Bracket Fill
Converts IRA → Roth to fill up to the top of your current tax bracket. The model finds which bracket your existing income falls in and fills to that ceiling minus headroom — only if IRA funds are available. Draws from the larger IRA first. IRMAA and Income Level take priority when active in the same year — a warning is shown if they overlap.
| T Fill | Headroom ($) | Start Year | End Year | Notes |
|---|
▶
Portfolio & Accounts
Growth rates, funding order, cash floor, HSA deposits
Growth Rate
Override the portfolio growth rate for a specific year range. Enter as a percentage — e.g. 5 = 5%, −15 = down 15%. Useful for modeling a down-market sequence or a conservative early-retirement period.
| Growth Rate (%) | Start Year | End Year | Notes |
|---|
Wage Growth Rate
Override the annual wage & self-employment income growth rate for a year range. Useful for modeling career stages — e.g. 6% during rapid advancement, 3% at mid-career, 2% near retirement. SOY entries always take priority over this rate.
| Growth (%) | Start Year | End Year | Notes |
|---|
Funding Order
Controls whether the waterfall draws from Securities or IRA first at Step 3 (after SS/RMDs/wages). Default is Securities. Switch to IRA to accelerate IRA drawdown in specific years.
| Choice | Start Year | End Year | Notes |
|---|
Cash Floor
Override the minimum cash balance for a year range. Useful for periods with known large cash needs — the waterfall will draw from other accounts to maintain this floor.
| Cash Floor ($) | Start Year | End Year | Notes |
|---|
HSA Deposits
Schedule annual HSA contributions by year range. Only applies while enrolled in an HSA-eligible high-deductible health plan.
| Annual Deposit ($) | Start Year | End Year |
|---|
State Tax Override
Override the state for tax purposes for a year range — useful for a move to a tax-free state (enter "NONE") or to a different supported state. Currently supported: CA, NONE (no state tax). Future: NY, TX, FL, etc.
| State | Start Year | End Year | Notes |
|---|
—
Complete Year-by-Year Cash Flow
Tax Breakdown by Year
Effective & Marginal Rates
Tax Detail Table
| Year | Ages | AGI | Deduction | Taxable Inc | Fed Ord | LTCG/QDI | CA State | Total Tax | Eff % | Marginal | Blended | Prior MAGI | IRMAA Surcharge | Medicare Part B | IRMAA Tier |
|---|
All Account Balances
Net Worth vs Annual Taxes
Social Security — Gross & Taxable
RMDs Over Time
Roth Balances & Conversions
Funding Waterfall Use
Tax Table Settings
Each year uses exact brackets entered. Years between defined years use the prior year's table.
How fast tax brackets grow each year. Default 2.5% matches historical IRS CPI-W adjustments. Use 0% only as a stress-test (frozen brackets overstate long-term taxes).
How fast IRMAA thresholds and surcharges grow. Default 2.0% matches historical SSA adjustment pace. Use 0% to stress-test frozen Medicare surcharges.
Each November: Click + Add, enter the new year, then fill in updated IRS brackets from irs.gov/newsroom and IRMAA thresholds from cms.gov. Prior year tables are preserved exactly and used for historical calculations.
Tax Brackets —
FEDERAL ORDINARY INCOME
FEDERAL LTCG / QUALIFIED DIVIDENDS
FEDERAL STANDARD DEDUCTION
CA ORDINARY INCOME
IRMAA Thresholds (same for all filing statuses)
MAGI threshold where each tier begins. Surcharge is additional annual cost per person above standard Part B premium.
TIER
MAGI ABOVE ($)
SURCHARGE/YR/PERSON
Projected Values Preview
Shows thresholds for any projection year, using defined tables then inflating beyond the last one.
☁ GitHub Sync
Connect a private GitHub repository to automatically back up your data and access it from any device or browser. How to create a token →
One-time setup — follow these steps exactly:
Step 1 — Create a GitHub account
Go to github.com and sign up for a free account if you don't have one.
Step 2 — Create a private repository
Click the + icon (top right) → New repository.
• Name it anything, e.g.
• ⚠️ Under visibility, select Private (not Public — this app will reject public repos)
• Leave all other options at defaults and click Create repository
Step 3 — Create a Personal Access Token
Click your profile photo (top right) → Settings.
Scroll to the very bottom of the left sidebar → click Developer settings.
Click Personal access tokens → Tokens (classic) → Generate new token (classic).
• Note: type a name like
• Expiration: set to No expiration
• Scopes: check the repo checkbox (first one in the list)
• Scroll down and click Generate token
• ⚠️ Copy the token immediately — GitHub only shows it once
Step 4 — Connect below
Paste your GitHub username, repository name, and token into the fields below, then click Connect & Verify.
Step 1 — Create a GitHub account
Go to github.com and sign up for a free account if you don't have one.
Step 2 — Create a private repository
Click the + icon (top right) → New repository.
• Name it anything, e.g.
my-retirement-data• ⚠️ Under visibility, select Private (not Public — this app will reject public repos)
• Leave all other options at defaults and click Create repository
Step 3 — Create a Personal Access Token
Click your profile photo (top right) → Settings.
Scroll to the very bottom of the left sidebar → click Developer settings.
Click Personal access tokens → Tokens (classic) → Generate new token (classic).
• Note: type a name like
retirement-model• Expiration: set to No expiration
• Scopes: check the repo checkbox (first one in the list)
• Scroll down and click Generate token
• ⚠️ Copy the token immediately — GitHub only shows it once
Step 4 — Connect below
Paste your GitHub username, repository name, and token into the fields below, then click Connect & Verify.
Manual Backup
Export or import a JSON snapshot. Useful for sharing data, moving to a new version of the file, or keeping an offline backup.
📄 Print Report
Opens a print-ready report in a new tab. Use File → Print → Save as PDF to save it.
Clear Data
Reset everything to defaults. This cannot be undone — export first if you want to keep your data.
Data & Privacy
How to fully remove this data
- Use ⚠ Reset All Data above to wipe values (recommended)
- Or: Browser Settings → Clear Browsing Data → Cached/Site Data
- Or: DevTools (F12) → Application → Local Storage → delete the key shown below
Loading…