Back to Blog
Technology
February 2, 2026
5 min read
908 words

We Stopped Micro-Frontends—Monoliths Are Just Better

We sliced our UI into 30 independent apps. It was supposed to decouple our teams. Instead, it decoupled our user experience and multiplied our build times. Here is why we glued it all back together.

We Stopped Micro-Frontends—Monoliths Are Just Better

In 2020, Micro-Frontends were the architectural silver bullet. The promise was seductive: allow different teams to deploy different parts of the UI independently. The Checkout Team could ship React 18 while the User Profile team was still on React 16. No more merge conflicts. Total autonomy.

We bought the hype. We used Module Federation. We had a shell application and 15 "remotes." We had a team dedicated to the "Platform Shell." We felt like Netflix.

Two years later, we had a fragmented user experience, a bloated browser payload, and a CI/CD pipeline that took 45 minutes to confirm that a button color change didn't break the world. We stopped. We moved back to a Modular Monolith. And everything got better.

The False Promise of "Autonomy"

The core selling point of Micro-Frontends (MFE) is organizational, not technical. It's Conway's Law applied to the browser. "If we have independent teams, we should have independent deployables."

But the browser is not a backend. In a microservices backend, services talk over HTTP. They share nothing but a contract. In a frontend, everything shares the same Window object, the same DOM, the same Event Loop, and the same user attention span.

The Dependency Hell

We thought we could let teams choose their own dependencies. Team A wanted Lodash 4. Team B wanted Lodash 3. Team C wanted to try SolidJS.

The result? The user downloaded three versions of Lodash and two different UI frameworks. Our bundle size ballooned to 4MB. The "Time to Interactive" on mobile devices plummeted.

So, we enforced "Shared Dependencies." We forced everyone to use the same React version. But if we are forcing shared dependencies, aren't we just building a distributed monolith with extra steps? Yes. Yes we were.

The User Experience Fragmentation

Users don't care about your org chart. They care about a cohesive application.

With MFEs, maintaining a consistent UI/UX was a nightmare.

  • The Flicker: Navigating from the "Catalog" MFE to the "Checkout" MFE often caused a subtle full-page reload or a layout shift because the CSS was loaded lazily.
  • The State Gap: Sharing state between MFEs is hard. We used a global event bus / custom window events. It was fragile. Data synchronization bugs were rampant. "I updated my avatar in the Profile MFE, why is it old in the Header MFE?"
  • The Style Drift: Despite a shared design system package, slight version mismatches meant buttons looked slightly different on different pages. The app felt cobbled together.

The Developer Experience Tax

Proponents say MFEs make development faster. "You only run your slice!"

In practice, it made it slower.

1. "It works on my machine" 2.0

To run the app locally, a developer had to either:
a) Run the Shell + their MFE (and mock everything else).
b) Run the Shell + ALL MFEs (requires 32GB RAM and sounds like a jet engine).
c) Run the Shell pointing to "Dev" environments for other MFEs (network latency madness).

Debugging a cross-boundary issue was torture. You had to link multiple packages, restart multiple dev servers, and hope the hot-module-reloading didn't crash (it always crashed).

2. The Version Matrix

We spent more time managing `package.json` peerDependencies than writing features. "Oh, the Navigation bar is broken because the Shell updated its router, but the Dashboard MFE is using the old router hooks."

The Return to the Monolith

We decided to unify. We moved everything back into a single Next.js Turbrepo.

The migration was surprisingly easy because we had already enforced strict boundaries (the one good thing MFEs taught us).

The "Modular Monolith" Architecture

We didn't go back to spaghetti code. We kept the organizational split, but without the deployment split.


/apps
  /web ( The Monolith )
/packages
  /feature-catalog (Owned by Team A)
  /feature-checkout (Owned by Team B)
  /feature-profile  (Owned by Team C)
  /design-system    (Shared)
    

Each feature is a workspace package. It exports its pages and components. The main app imports them.

Benefits We Saw Immediately:

  1. Instant Builds: Turborepo caches local tasks. We build only what changed. But we deploy together.
  2. Shared State is Easy: It's just React Context or a single Redux store. No window events. No duplication.
  3. Single Bundle: Webpack/Turbopack can tree-shake across the entire application. Duplicate dependencies vanished. Site speed improved by 40%.
  4. Atomic Commits: You can change a button in the Design System and update all usages in all features in a SINGLE Pull Request. No more "Release Design System v2, then wait for Team A to upgrade, then Team B..."

When might Micro-Frontends actually work?

I am not saying they are never useful. They are useful if:

  • You are literally Google or AWS, with 5,000 engineers and completely distinct products (Console vs Gmail) that just happen to share a navbar.
  • You are integrating a legacy AngularJS app inside a new React app (the "Strangler Fig" pattern).
  • You have zero need for shared state or tight integration between pages.

But for 99% of companies? You are adding accidental complexity to solve a social problem that could be solved with better folder structures and code owners.

Conclusion

We confused "Deployment Independence" with "Development Velocity." They are not the same. In fact, they are often inversely correlated.

By moving back to a Monolith, we regained our velocity. We stopped debugging webpack. We stopped managing versions. We started shipping features again.

If you are a startup or even a scale-up considering Micro-Frontends: Don't. Buy a bigger build server. Use a monorepo tool like Nx or Turbo. Keep your sanity.

Tags:TechnologyTutorialGuide
X

Written by XQA Team

Our team of experts delivers insights on technology, business, and design. We are dedicated to helping you build better products and scale your business.