The founders picked a framework in year one. It made sense at the time — it was what they knew, there was a good tutorial, and the team could move fast. Three years later, you’re paying for that decision every day.
Maybe it’s a framework with a small hiring pool. Maybe it’s a language your engineers hate working in. Maybe it scaled fine to 10,000 users and now it’s groaning at 200,000. Maybe it’s a proprietary platform with a vendor whose roadmap has diverged from yours. Whatever the specific situation, the question is the same: do you stay, migrate, or rewrite?
This is a decision I’ve helped companies work through many times, and the answer is almost never what leadership wants to hear on first pass.
What “Wrong Stack” Actually Means
Before you can answer the question, you need to be precise about the problem. “Wrong stack” means different things, and those things have different solutions.
Wrong to hire for. Your framework has a small developer pool. You’re competing for a thin slice of the market. Interview-to-hire cycles are long and expensive. This is a real problem, but it’s a talent strategy problem more than a technology problem, and the solution might be training pipelines or adjusted sourcing before it’s a rewrite.
Wrong to scale. The framework’s performance characteristics don’t match your load patterns. This is a more technical problem, and the answer depends heavily on whether the constraint is the language runtime, the framework’s architecture, or how your application was built on top of it.
Wrong to maintain. Your engineers fight the tools every day. The framework’s idioms work against your patterns. Debugging is difficult. Onboarding new engineers takes months because the codebase is opaque. This is the most insidious form — it’s a slow tax on every hour of engineering time, and it compounds.
The wrong diagnosis leads to the wrong solution. I’ve seen companies do a full rewrite to address a hiring problem that could have been solved by changing their sourcing strategy. I’ve seen companies migrate frameworks to address a scaling problem that was actually in their database schema.
The Four Options
Stay the course with mitigation. Don’t underestimate this option. If the stack is “wrong” in a way that’s addressable — better tooling, better training, better documentation — staying has a real advantage: you don’t lose the institutional knowledge baked into your existing codebase. Frameworks that are annoying to work in can be improved. Your engineers know this codebase. That knowledge has value.
Incremental migration. You run two stacks simultaneously and migrate service by service, module by module. New features go on the new stack. Old features get migrated as you touch them. This is genuinely the right answer more often than companies want to admit, because it lets the business keep moving while the technology evolves.
The catch: incremental migration requires iron discipline. It’s easy to start and hard to finish. I’ve watched companies run two stacks in parallel for four years because the migration kept getting deprioritized in favor of features. If you go this route, you need a committed timeline, visible progress tracking, and someone accountable for driving it to completion.
Strangler fig replacement. A variant of incremental migration where you build the new system around the edges of the old one — handling new traffic on new infrastructure while legacy traffic still flows through the old system. You gradually reroute traffic until the old system can be decommissioned. This is particularly good for architectural shifts (e.g., moving from a monolith to services) because it lets you move at the seams rather than in the middle.
Full rewrite. This is the nuclear option, and it almost always goes wrong. The history of software engineering is littered with rewrites that took three times as long as estimated, shipped with fewer features than the system they replaced, and then lived in parallel with the old system for two years anyway because the business couldn’t afford to cut over. Netscape. The second version of Windows Vista. The list is long.
The reason rewrites fail isn’t lack of engineering skill — it’s that the old system contained years of accumulated business logic, edge cases, and implicit knowledge that wasn’t documented anywhere. You discover this during the rewrite when users report that something the new system does differently is actually wrong, and you spend six months recovering the original behavior.
Full rewrites are appropriate when the old system is genuinely unmaintainable — not “annoying” unmaintainable, but “we can’t debug it, we can’t test it, and we’re afraid to change it” unmaintainable. That bar is higher than most companies think.
How to Make the Decision
Map the actual cost of staying. Not abstract cost — real cost. How many engineer-hours per week are lost to the framework? What’s the recruiting premium for engineers who know this stack? What features can’t you build because of architectural constraints? Put a number on it.
Then map the cost of migrating. Migration isn’t free. You’ll run two systems. Engineers will split attention. There will be bugs at the seam. You’ll have a period of reduced feature velocity. For how long, and what’s the cost of that?
If the cost of staying exceeds the cost of migrating over a 24-month horizon, migrate. If it doesn’t, stay — and fix the things you can fix without migrating.
Whatever you decide, don’t let the conversation drag on. Technology decisions that stay in committee for six months are costing you the whole time the debate continues.
This is a decision I help companies work through regularly — framing the options, running the cost analysis, and building a migration plan that the business can actually execute. If you’re in this conversation and it keeps going in circles, let’s spend 15 minutes on it.
Related: When to Break Up Your Monolith | When to Replatform | How Much Technical Debt Is Too Much?
