Loading…
Loading…
Service Management Platform is a production-focused software project built by Sadam Hussain using React, TypeScript, Micro Frontends, and related technologies.
Enterprise micro-frontend platform for aviation operations: one shell, independent domain teams deploying through Webpack Module Federation, shared design system, governed releases. Outcome: independent teams shipping to one shell without breaking each other.
Tech Stack
Status
Production Ready
Type
Enterprise platform
Architected and implemented an enterprise Micro Frontend (MFE) platform using Webpack Module Federation, enabling multiple domain-based teams to independently build, test, and deploy features without compromising platform integrity.
Designed and owned the shell application architecture, including dynamic route registration, centralized authentication flows, shared UI components, and runtime dependency resolution across independently deployed MFEs.
Established Monorepo-based development for shared libraries, design system tokens, and utility packages, ensuring version consistency, reuse, and governance across all consuming teams.
Led integration of Sabre REST APIs and GraphQL endpoints using Apollo Client with normalized caching, enabling real-time service and booking workflows across mission-critical aviation operations.
Defined and enforced state management standards using Redux Toolkit for global application state, RTK Query for server state synchronization, and SWR for lightweight data fetching in isolated MFE contexts.
Developed 50+ reusable, accessible TypeScript components using Material UI and Tailwind CSS, adhering to WCAG / AODA accessibility standards with automated a11y testing in CI.
Implemented React Hook Form with Zod schema validation across all user input flows, creating a type-safe form architecture that ensures consistency, usability, and high data integrity across the platform.
Optimized application performance through Webpack code splitting at the MFE boundary, lazy loading of remote modules, and intelligent caching strategies for shared vendor bundles.
Defined and implemented a comprehensive automated testing strategy with Jest for unit tests, React Testing Library for component integration testing, and Cypress for E2E workflows covering cross-MFE user journeys.
Enabled safe and reliable deployments through feature flags for progressive rollout, backward-compatible module contracts, and CI/CD automation using GitHub Actions and Docker with environment-specific configurations.
The Service Management Platform runs aviation operations at Universal Weather: flight services, ground handling, and booking workflows in one unified shell. Independent domain teams build and deploy their modules on their own cadence through Webpack Module Federation, while the shell owns routing, auth, shared state, and the design system. Independence for teams, one coherent product for users.
This isn't a simple single-page application with code splitting. It's a distributed frontend architecture where independently built, tested, and deployed modules compose at runtime into a unified platform. The shell application acts as the orchestration layer, managing cross-cutting concerns like authentication, routing, shared state, and design consistency so that domain teams can focus purely on their business logic.
The platform serves aviation professionals who coordinate real-time flight services, ground handling, and booking operations - workflows where reliability and data accuracy are non-negotiable.
Universal Weather's frontend had grown to the point where a single monolithic React application couldn't support the velocity of multiple engineering teams working across different aviation service domains. Deployments became bottlenecks - one team's release blocked another's. Shared code created implicit coupling, and conflicting PR merges slowed everyone down.
The core problem: A monolithic frontend architecture created deployment coupling between teams that had no business-logic dependency on each other. A ground handling team's feature release shouldn't require coordination with the booking team's sprint cycle.
Stakeholder perspective:
Constraints that shaped the architecture:
The key architectural decision was using Webpack Module Federation for runtime (not build-time) composition. The alternative - building all MFEs into a single bundle at deploy time - would have reintroduced the deployment coupling we were trying to eliminate. With runtime federation, the shell loads MFE bundles from their individual CDN endpoints at page load. Each MFE is a separate Webpack build that declares what it exposes and what it expects the host to provide. The shell resolves shared dependencies (React, Redux, the design system) at runtime, ensuring only one copy of each shared library loads regardless of how many MFEs are active.
Why Module Federation over iframes or Web Components: Iframes provide strong isolation but terrible performance (separate document context, no shared state, duplicated resource loading) and break accessibility continuity. Web Components would require wrapping React components in custom elements, adding complexity without clear benefit since all MFEs use the same framework. Module Federation provides the right balance - runtime code isolation with shared dependency resolution and native React interop.
The shell enforces platform standards programmatically:
This governance model means that even if a team makes poor architectural choices within their MFE, the blast radius is contained.
Cross-MFE communication uses a pub/sub event bus provided by the shell. When a booking is created in the booking MFE, it publishes a domain event that the service coordination MFE subscribes to for updating its view. This loose coupling avoids direct MFE-to-MFE dependencies while enabling the coordinated workflows that aviation operations require. Redux state is used for cross-cutting concerns (user session, notifications), while domain-specific state stays encapsulated within each MFE's local store.
WCAG/AODA compliance isn't treated as a testing phase - it's a component library constraint. Every component in the shared library is built with accessibility as a first-class requirement:
The most architecturally complex challenge was making Webpack Module Federation work reliably in a production enterprise environment with independent domain teams deploying on their own schedules.
The Problem: Module Federation's documentation covers simple cases - one host, one remote, shared React. The real-world complexity emerges when you have multiple remotes with different deployment schedules, shared state that needs to be consistent across all modules, and version mismatches between shared dependencies that need to be resolved gracefully at runtime.
Key Challenges Solved:
Shared Dependency Version Resolution: When MFE-A ships with React 18.2.0 and MFE-B ships with React 18.3.0, Module Federation needs to decide which version to use. The shell's Webpack configuration defines strict version ranges for critical shared dependencies, and the singleton: true flag ensures only one instance loads. The shell's version always wins, and MFE teams are required to keep their shared dependencies within the shell's declared range - enforced via CI checks in the monorepo.
Dynamic Remote Loading with Fallbacks: Remotes are loaded dynamically based on a runtime manifest (not hardcoded in Webpack config). If a remote MFE fails to load (CDN issue, deployment in progress), the shell renders a graceful fallback UI for that module while keeping the rest of the platform functional. This was critical for availability - a single team's deployment issue shouldn't degrade the entire platform.
Cross-MFE State Consistency: Redux Toolkit state is owned by the shell and provided to MFEs via a shared store. But MFEs also have local state for domain-specific concerns. The challenge was establishing clear boundaries - what belongs in the shared store (user session, permissions, notifications) versus what stays local (form state, in-progress workflows). The convention is enforced through typed slice interfaces: MFEs can read from shared slices but can only dispatch to their own domain slices.
Hot Module Replacement Across Boundaries: Development experience matters. Getting HMR to work across module federation boundaries (editing code in a remote MFE and seeing it update in the shell during development) required custom Webpack dev server configuration with proxy rules that route remote module requests to the correct team's local dev server.
Why this matters: Most Module Federation examples are proof-of-concepts. Making it production-ready for enterprise aviation software required solving problems that the library doesn't address out of the box - version governance, graceful degradation, state boundaries, and developer experience across team boundaries.
Challenge: Five teams deploying independently created version drift risk for shared dependencies like React and Redux.
Approach: Established a monorepo-managed shared dependency policy with version ranges enforced by CI. The shell's Webpack configuration uses singleton: true with strict version constraints, and automated checks block MFE deployments that violate the range.
Why: Runtime version mismatches cause subtle, hard-to-debug issues (hooks breaking, context not propagating). Catching these at build time is significantly cheaper than debugging in production.
Challenge: Aviation operations require real-time data consistency - a booking created in one module must be immediately visible in related service coordination views owned by a different team. Approach: Implemented a shell-provided event bus for domain events combined with Apollo Client's normalized cache sharing. When one MFE writes data, Apollo's cache updates propagate to all MFEs reading from the same cache, and domain events notify MFEs that may need to trigger additional queries. Why: Direct MFE-to-MFE dependencies would defeat the purpose of the architecture. The event bus + shared cache approach maintains loose coupling while ensuring data consistency.
Challenge: Ensuring consistent accessibility compliance across independent teams with varying a11y expertise. Approach: Baked accessibility into the shared component library so that using the standard components automatically produces WCAG-compliant markup. Added automated a11y scanning (axe-core) to CI pipelines that gates PRs. MFEs that use custom markup outside the component library must pass additional review. Why: Documentation and guidelines are insufficient for consistent compliance. Accessibility needs to be the path of least resistance - using the provided components should be easier than building custom ones.
Challenge: Deploying a new version of the shell without breaking existing MFE deployments that haven't been updated yet. Approach: Versioned the shell's module contracts and implemented a deprecation cycle. New shell versions maintain backward compatibility with the previous contract version for a defined period, and CI flags MFEs still using deprecated contracts. Why: In a distributed architecture, you can't coordinate simultaneous updates across all teams. The shell must evolve without forcing all consumers to update in lockstep.
The Service Management Platform was a masterclass in architectural discipline over technological novelty. Micro Frontends are fundamentally a governance problem, not a technology problem. Webpack Module Federation provides the mechanism, but the real work is in defining contracts, enforcing standards, and establishing boundaries that let teams move fast without breaking each other.
Patterns I'd reuse:
What I'd reconsider:
Trade-offs acknowledged: