Somebody ran twelve impossible scenarios through my Roth conversion optimizer in seven minutes and then left with nothing. That’s the most useful thing I learned from finally sitting down and reading the tool’s usage log, and it’s why it’s now a Roth conversion calculator with IRMAA priced in, real state brackets for all fifty states, and the ability to tell you in plain English what your plan is actually doing.
The log covers roughly 190 solves across about 31 visitor sessions, which makes this the most-used of the five optimization tools I’ve put online. Almost everyone got a plan out of it. Two people got nothing at all, and the way they failed turned out to be the most interesting thing in the whole file — they weren’t defeated by a bug, they were defeated by an answer that was technically correct and completely useless.

“No feasible plan” is a terrible answer
Here’s the pattern I found in the log, and it showed up twice with two different people doing the identical dance. Enter your spending. Get told it’s infeasible. Flip to the “spend it down” mode to get something back. Flip return to your real question. Infeasible again. Repeat until you give up.
What those people were doing, by hand, one guess at a time, was searching for the largest annual spend their accounts could carry. And the maddening thing is that the tool already computes that number exactly — in about a tenth of a second — in the very mode they kept bouncing into. It just never thought to mention it.
Now when a plan doesn’t work, the solver quietly runs the spend-down model itself and answers with the number: $250,000 a year is more than these accounts can fund. The most they can support is $85,064 — $164,936 less. There’s a button to accept that figure and re-run. That’s the whole fix, and it’s maybe forty lines of code. Twenty-two dead runs in the log, and every one of them could have ended with an actual answer.
The tool now tells you what your plan is doing
The other thing the log showed was people running the same scenario fifteen, nineteen, twenty-six times in one sitting — same ages, same filing status, just nudging one input and watching a number move. They weren’t confused about the form. They were interrogating the answer, because the tool handed back a table and a chart and never said a word about what the plan actually did.
So now, under every result, there are four to six short notes in plain English. Things like “Your conversion window is ages 62–66 — nine tenths of the conversion happens in those five years”, or “It stops at the 22% bracket, and nineteen years sit right at that edge”, or “The brokerage runs dry at age 82, which is usually why conversions stop when they do.”
I want to be specific about how that works, because “the tool explains itself” is exactly the kind of claim that means an AI is writing your tax advice. It isn’t. It’s a fixed library of about twenty rules, each one a small function that looks at numbers the optimizer already produced, decides whether it has anything to say, and fills in a sentence template. Same inputs, same words, every time. Nothing calls a language model. A tax tool that improvises is a tax tool you can’t check, and I’d rather have twenty boring rules I can read than something clever I can’t.
And since people were clearly comparing scenarios by memory, every run now gets saved in your browser — rename them, load one back into the form, or put them side by side in a comparison table. It never leaves your machine, there’s no account, and your inputs come back when you return instead of dumping you on the sample again. (Twenty-odd fields, wiped on every refresh. I don’t know how I looked at that for as long as I did.)
Medicare surcharges, and why cliffs cost so much
This is the part I’d been putting off. IRMAA is the income-related surcharge on Medicare Part B and Part D premiums, and it has two properties that make it genuinely nasty for anyone converting: it’s a cliff rather than a phase-in, so one dollar over a threshold costs you the whole step for a whole year, and it reads the income you reported two years earlier. A conversion at 63 sets your premium at 65. Most people meet it after it’s too late to do anything about it.
Alongside it I added the 3.8% net investment income tax, which has a subtlety worth knowing: a Roth conversion is never subject to NIIT directly, because a distribution from a retirement plan isn’t investment income. But it does raise the income figure the test uses, so a big conversion can drag brokerage gains you were already realizing over the line. Modelling it as a flat surcharge on income would have taxed conversions the law doesn’t touch, so it’s modelled as the actual rule.
Both use 2026 figures and both sit under Advanced assumptions, switched off by default — a normal run should stay instant, and these turn the model into an integer program. If your plan would have tripped either one while they’re off, the notes under your result say so and point at the switches. On a $4.5M scenario I tested, the surcharges came to $120,120 over the horizon. The old model showed exactly zero of that.
The tell that it’s working is watching the optimizer park your income at exactly a threshold — $205,000, year after year, never a dollar over. That’s the solver refusing to buy a whole step for one dollar of conversion.
Now the humbling bit. I’d written in my own notes that this upgrade would mean “a few dozen binary variables, still sub-second.” It was about a hundred and sixty binaries, and one perfectly ordinary scenario — single filer, $2M IRA, a future tax rate that happened to sit right on top of the marginal conversion rate — ran for eighty-five seconds. When the wealth objective goes flat like that, the Medicare cliffs become the only thing separating one plan from another, and the solver has to search all of it. It took two rewrites of the formulation to get the typical case back to a third of a second, and I still capped the search at twelve seconds and made the tool admit when it hit the cap. (The best answer it had found after five seconds on that pathological case was $827 off the true optimum, on $6.57M. I’ll take that trade.)
Real state brackets — and the part I deliberately won’t ship
The tool used to model state tax as one flat rate you typed in. Now you can pick your state and get its real graduated brackets and standard deduction, prefilled and fully editable, for all fifty states and DC. The flat box is still there for anyone who just wants a rough number.
Here’s the engineering surprise. Graduated state brackets turned out to be free — they reuse the same bracket-filling machinery the federal side already had, the model stays a plain linear program, and California’s ten bands solve in five hundredths of a second. Compare that to the Medicare cliffs, which needed an integer program and a time budget. Smooth brackets are cheap; step functions are what costs you. That’s a lesson I’ll carry into the next model, and it’s the sort of thing you only learn by building both, which is more or less the theme of everything building this optimizer has taught me.
What I will not ship is the rest of state tax law. Whether your state exempts retirement income, how it treats Social Security, age-based deductions — those are exposed as switches you set yourself, defaulting to “everything is taxable.” That’s deliberate, and it’s the honest line. Those rules are precisely what decides the answer in a handful of states, they aren’t in any published bracket dataset, and me guessing them from secondary sources and putting a state’s name next to the guess would be worse than asking you to check. The tool names the states where it matters instead. County and city income taxes aren’t modelled anywhere either, and ten states have them — Maryland’s are large enough to change your answer on their own.
One more confession from this round. I couldn’t download the official state bracket workbook from my build machine, so I first pulled the numbers out of the published article instead. When I finally got the real spreadsheet and compared the two tables field by field, they matched everywhere except one: New Jersey’s 5.525% rate had come back rounded to 5.53%. One field out of fifty-one states. Reassuring — and still not a standard a tax table gets to be held to, so the whole table is generated from the Tax Foundation’s published workbook now, with a test that re-reads the spreadsheet and proves the committed numbers still match it.
What it still won’t do
It doesn’t model ACA premium subsidies, which for anyone retiring before 65 can be the single biggest hidden cost of a conversion in the gap years. It doesn’t do 0%-bracket capital gains harvesting. It uses one real rate of return for every account and a flat long-term capital gains rate. And every prefilled bracket in it is a starting point to check against your state’s own tables, not tax advice — I’m an operations research guy who has spent a lot of time inside this particular model, not your accountant.
What it does do, which most free calculators don’t, is solve for the conversion schedule rather than making you guess an amount and reporting the tax on it. You give it your balances, your spending and your assumptions; it finds the plan. If you want the reasoning behind that, I wrote up how much to convert to a Roth each year and the actual formulation in the linear program post. The spend-it-down side has its own home in a withdrawal rate calculator that draws down to zero.
It’s free, there’s no signup, and nothing you type leaves your browser except the numbers the solver needs. The log is what told me to build all of this, so if something about it still annoys you, run it a few times and I’ll probably see it.
Things that I use, like, and am affiliated with:
Mint Mobile offers great cell phone service for $15 flat, get $15 off using the link. Get discounted phones with service activation and no contract.
I never spend money before I check Mr Rebates or Rakuten to get cashbacks, rebates, discounts, coupons or cheaper gift cards.
