App Manifests
Source: docs/architecture/manifests.md
App Manifests
Every Korporus app has a manifest — a JSON file that tells the shell how to find and render the app.
Schema
{
"id": "my-app",
"name": "My Application",
"icon": "/manifests/my-app-icon.svg",
"version": "1.0.0",
"remoteEntry": "/apps/my-app/remoteEntry.js",
"slots": {
"titlebar": "my-app-titlebar",
"main": "my-app-main",
"settings": "my-app-settings"
}
}Fields
| Field | Type | Required | Description |
|---|---|---|---|
id |
string | Yes | Unique identifier, kebab-case (e.g. "my-app") |
name |
string | Yes | Human-readable display name |
icon |
string | Yes | URL to the app icon (SVG recommended) |
version |
string | Yes | Semver version string |
remoteEntry |
string | Yes | URL to the Module Federation remote entry |
slots |
object | Yes | Map of slot names to custom element tag names |
Slot Names
The slots object uses these keys:
titlebar— Header bar componentmain— Primary content componentsettings— Settings/search sidebar component (optional but the key must exist)
At least one slot must be defined.
Where Manifests Live
In the Shell
The shell serves manifests from apps/shell/public/manifests/. Each app gets its own JSON file and icon SVG.
In the App
Each app also has an app-manifest.json in its package root. This is used for standalone development and documentation — the shell doesn't read it directly.
Dev vs Production URLs
In development, the devManifestRewritePlugin in the shell's Vite config rewrites the remoteEntry field to point at the app's MF manifest on its own dev server. See Module Federation for details.
In production, manifests use relative URLs that resolve against the container's single origin.