May 19, 2026
Micro-frontends that don't collapse under their own weight
Eleven years in, I've seen most of the ways micro-frontend setups fail. Version-mismatch hell, shared-dependency traps, and the deploy story nobody owns. Here's what actually holds up.
Micro-frontends are sold as independence and bought as coupling. The pitch is "teams ship on their own cadence." The reality, if you're not careful, is a shared runtime where one team's React upgrade quietly breaks another team's bundle in production.
Three failure modes I plan around
- Version-mismatch hell — two MFEs assuming different versions of the same shared dependency at runtime. The fix isn't a stricter lockfile; it's deciding what is genuinely shared and isolating everything else.
- The orphaned deploy — independent deploys are great until nobody owns the routing layer that stitches them together. Routing is infrastructure, not an app concern.
- Shared-state leakage — global stores that turn "independent" frontends into a distributed monolith with extra steps.
The architecture I reach for
Route at the edge, not in a shell. Each frontend is a fully self-contained build with its own dependencies; the CDN decides which one answers a given path or host. No module federation, no shared shell, no cross-imports. It's less clever and far more durable — the platform behind this very site routes a dozen independent frontends through a single distribution exactly this way.
I built MFE at enterprise scale for a US Fortune 500 EdTech product, with teams of 10–50. The lessons that stuck weren't about frameworks. They were about boundaries.
Got an app stuck on localhost?
I take products from localhost to live, monitored production — and don’t disappear after handoff.
Get in touch →