Siddhant DevalAuthor
Senior Full-Stack Engineer·Oct 27, 2026·14 min read
CI/CD, Independent Deployments, and Observability
The point of micro-frontends is independent deployability. If your deployment pipeline for one MFE can block or break another team's release, you have not yet achieved the architecture. This article covers manifest-driven CDN deployments, 30-second rollbacks, and distributed error attribution across independently deployed apps.
Technical Series
Micro-Frontend Architecture
Part 9 of 9
CI/CD, Independent Deployments, and Observability
A micro-frontend is not a smaller app — it is a domain boundary enforced at the deployment layer. If you can't explain the business capability it owns, you haven't drawn the boundary yet.
Here is the test for whether you have actually achieved micro-frontend independence: the Checkout team deploys a new feature at 2pm on a Thursday. The Catalog team is in the middle of their own release at 2pm on the same Thursday. Do they interact at all?
If the answer is "yes, we need to coordinate release windows" — you have not achieved the architecture. You have built a distributed monolith: the runtime complexity of multiple deployments without the independence that justifies that complexity.
This final article is about making the answer "no" — at the pipeline level, at the deployment level, and at the observability level.
1. Pipeline Isolation: The Structural Rule
1.1 One Repository, One Pipeline, One Deployment Unit
The structural rule for independent CI/CD in a micro-frontend system is simple:
A CI/CD pipeline run for one remote must never be able to cause a pipeline run, a deployment, or a failure for another remote.
This rule has direct consequences for how you structure your pipelines:
yaml
1.2 Monorepo MFE CI with Affected Builds
When all remotes live in a monorepo, you achieve logical pipeline isolation using affected-build tooling — only rebuilding and redeploying what changed:
bash
yaml
Crucial Requirement
In a monorepo, modifications to shared packages (design tokens, event schemas, type utilities) are tracked as dependencies. If
@example/design-tokens changes, Nx affected automatically rebuilds all remotes that depend on it. This is the correct behavior — a design token change should rebuild all consumers.2. Manifest-Driven Deployment
2.1 The Two-File Deployment Strategy
From Part 4, the manifest-based deployment strategy separates the versioned chunk from the pointer file:
Deploying a new version:
- Upload new versioned chunks to
/checkout/1.2.5/— long TTL, no invalidation needed - Update
mf-manifest.jsonto point to1.2.5— short TTL, CDN invalidation triggered - The next user page load fetches the new manifest → loads
1.2.5chunks
Rolling back from
1.2.5 to 1.2.3:- Update
mf-manifest.jsonto point back to1.2.3— CDN invalidation triggered - Done. 30 seconds. No rebuild. No redeployment of chunks.

Expand
2.2 The Manifest Update Script
bash
3. Local Development Environment Parity
3.1 The Local Dev Problem
In a polyrepo MFE system, a developer working on the Checkout remote needs to see it composed with the shell and other remotes. Options:
-
Start all remotes locally — requires cloning 4 repositories, running 4 dev servers, and maintaining them in sync. This is the setup that takes 30 minutes to explain to a new engineer.
-
Use staging remotes, override only the remote you're developing — you run only the Checkout remote locally; the shell points to staging for all other remotes. This is the correct approach.
3.2 The Local Override Pattern
javascript
bash
Pro Tip & Optimization
Publish the local override environment variable names in your team's engineering docs on day one. This single pattern eliminates the most common onboarding friction in any MFE system: "how do I run this locally?"
4. Observability: Distributed Error Attribution
4.1 The Attribution Problem
In a monolith, an error in production has a clear owner: the commit history points to the last change, and one team is responsible for the entire codebase. In a micro-frontend system with 5 independently deployed remotes, an error in the composed application has five possible owners.
Without deliberate error tagging, a Sentry alert that reads
TypeError: Cannot read properties of undefined (reading 'cart') requires manual investigation of 5 separate deployment histories to identify which remote deployed the regression and when.4.2 Error Attribution Tags
Every error reported from a remote must carry two identifying tags:
typescript
With these tags, Sentry (or Datadog, or any platform) allows filtering:
The
remote.version tag turns a 3-hour debugging session into a 3-minute attribution.4.3 Health Check Endpoints for Remote Availability
typescript
typescript
4.4 Deployment Strategies Comparison

Expand
5. Putting It Together: The Production Topology
Crucial Requirement
The App Shell is deployed with a full rebuild when its code changes. But because the shell uses manifest URLs (not hardcoded remote chunk URLs), remotes can deploy without triggering a shell rebuild. The shell's deployment frequency should trend toward rare — if the shell is deploying multiple times per week, business logic is leaking into it.
Summary
| Concept | Rule |
|---|---|
| Pipeline isolation | One CI/CD pipeline per remote; failure in one must not block any other |
| Affected builds | Nx/Turborepo affected achieves logical isolation inside a monorepo |
| Versioned chunks | Immutable, long TTL (1 year), never overwritten |
| Manifest file | Short TTL (60s), updated on every deploy and rollback |
| Rollback | Update mf-manifest.json — 30 seconds, no rebuild |
| Error attribution | Every error tagged with remote.name and remote.version |
| Health checks | Shell monitors all remote manifest URLs at startup — alert before user impact |
| Local dev override | LOCAL_REMOTE_<NAME>=http://localhost:<port> — document on day one |
Series Complete
This concludes the Micro-Frontend Architecture series. Starting from a decision framework that tells you when MFEs earn their complexity (Part 1), through the bundler foundation that makes Module Federation mechanical (Part 2), through federation configuration, advanced manifests, App Shell design, cross-app state, testing strategy, style isolation, and finally operational independence — you now have the complete mental model and implementation vocabulary for a production-grade MFE system.
Recommended Next Step: The most commonly requested topic not covered in this series is the Strangler Fig migration — how to extract bounded contexts from an existing React monolith into micro-frontends without a big-bang rewrite. This is the path most teams actually take. If this would be valuable to you, reach out or subscribe for updates.
References
Research & Synthesis Note
This article was developed with AI-assisted deep search, specification cross-referencing, and technical research synthesis.
#Micro-Frontends#CI/CD#Observability#CDN#Module Federation#Deployments#Sentry
Technical Series
Micro-Frontend Architecture
Part 9 of 9