Portal
Purpose
The Portal is the primary web interface for Platform Mesh. It is an Angular microfrontend shell built on the Luigi framework that composes IAM, Marketplace, and any custom extensions into a single, cohesive user experience.
The Portal acts as the orchestration layer for the entire Platform Mesh UI surface. Its responsibilities are:
- Workspace navigation — lets users traverse the kcp workspace hierarchy (root → org → account → namespace) with context-aware navigation nodes that update as the selected workspace changes
- Org / account / namespace management — surfaces CRUD operations for the main Platform Mesh entities, delegating rendering to embedded microfrontends
- Kubeconfig download — generates and serves a ready-to-use kubeconfig scoped to the current workspace
- Home dashboard — shows a summary of the current workspace context (owner, path, service bindings)
- Terminal-as-a-Service — an in-browser shell powered by xterm.js and a ttyd-based WebSocket backend, available when the
terminalfeature toggle is enabled - Microfrontend orchestration — loads and frames IAM UI, Marketplace UI, and any registered extension microfrontends inside Luigi iframes with shared authentication context
- Authentication shell — handles the OIDC / OAuth2 login flow via the Luigi OAuth2 plugin and forwards JWT tokens to all child microfrontends
Runtime role
It lets users onboard organizations, navigate accounts, and navigate the kcp workspace hierarchy. All routing is owned by Luigi, not the Angular router — Luigi handles deep links, iframe lifecycle, and context propagation to child microfrontends. Navigation nodes (accounts, namespaces, IAM, Marketplace, Terminal) are built dynamically in TypeScript service classes that implement Luigi's node configuration interfaces.
Every navigation node is scoped to a kcp workspace path (for example root:orgs:my-org:my-account). The backend derives the active workspace path from the authenticated user's context and injects it into the Luigi globalContext, making it available to all child microfrontends without additional round-trips.
Architecture
The Portal repository is a thin application. Most of its behavior comes from two layers of libraries: the generic OpenMFP portal libraries provide the shell, and the Platform Mesh portal libraries plug in the Platform Mesh–specific implementations.
Portal frontend (Angular) Portal backend (NestJS)
↓ ↓
@platform-mesh/portal-ui-lib @platform-mesh/portal-server-lib
↓ ↓
@openmfp/portal-ui-lib (Luigi shell) @openmfp/portal-server-lib (PortalModule)| Layer | Library | Role in the Portal |
|---|---|---|
| Frontend | Portal UI library (@platform-mesh/portal-ui-lib) | Provides the portal-options service implementations passed to providePortal() — navigation, header bar, node context processing, routing, and user profile — plus the generic UI web components |
| Backend | Portal server library (@platform-mesh/portal-server-lib) | Provides the providers passed to PortalModule.create() — authentication, request and portal context, account entity context, ContentConfiguration service providers, and the permissions proxy |
Repository
- github.com/platform-mesh/portal
- github.com/platform-mesh/portal-ui-lib
- github.com/platform-mesh/portal-server-lib
Related
- Portal UI library
- Portal server library
- Explore the example MSP
- IAM UI
- Marketplace
- virtual-workspaces — serves the aggregated
ContentConfigurationview the Portal renders from