App Registry
The **composed** shell registry is the runtime source of truth for route group, window defaults, ownership, permissions, runtime kind, and desktop placement. Pu
Source Files
- Composed registry:
apps/os-shell/src/apps/registry.ts - Platform iframe templates:
packages/app-registry(esmadrider-me,/app-devlocalhost iframes; seepackages/app-registry/README.md) - App runtime host:
apps/os-shell/src/apps/AppRuntime.tsx - Local app component map:
apps/os-shell/src/apps/localAppComponents.tsx - Types:
apps/os-shell/src/apps/types.ts - Routes:
apps/os-shell/src/router.tsx
The composed shell registry is the runtime source of truth for route group, window defaults, ownership, permissions, runtime kind, and desktop placement. Pure iframe registration data for non–os-apps bundles lives in @prox-os/app-registry and is merged in registry.ts.
The App Store catalog is intentionally broader than the runtime registry. It may display available apps, incubating apps, concepts, templates, Spaces, data source ideas, and AI workflows. Only entries with a real registered runtimeAppId should open through the shell. Roadmap entries must stay visibly labeled as prototype, incubating, coming soon, concept, experimental, or roadmap.
Route Groups
| Group | Prefix | Placement | Meaning |
|---|---|---|---|
app | /app | left desktop folder | Personal work, data, and creative apps. |
app-user | /app-user | right desktop folder | Identity, profile, visitor, notifications, shortcuts, display, and other user-specific surfaces. |
app-shell | /app-shell | right desktop folder | Target group for shell-coupled apps that remain inside apps/os-shell. Not implemented in the current router yet. |
app-dev | /app-dev | bottom-right desktop folder in development; hidden in production | Developer-only local servers, docs, project graphs, and API explorers. |
app-iframe | /app-iframe | left desktop folder (Framed Apps) | External and standalone iframe apps hosted inside managed shell windows. |
app-os | /app-os | right desktop folder | Reusable OS, official team, community, and platform operations apps that can move toward packages/os-apps. |
The router defines normal OS app routes plus /website variants for /app, /app-user, /app-dev, /app-iframe, and /app-os. ViewMode maps normal routes to OS mode and /website routes to single-app website mode. True fullscreen app Spaces are addressed through /spaces/:spaceId instead of website-mode suffixes.
True OS fullscreen is no longer represented by those app-route suffixes. A fullscreen app lives in a dedicated Space and uses /spaces/:spaceId as the shell-level route. Refreshing a stale Space URL gracefully falls back to the default desktop when the in-memory Space no longer exists.
Current Apps
| appId | Title | Icon | Route | Entry component | Window |
|---|---|---|---|---|---|
esmadrider-me | esmadrider.me | Es | /app-iframe/esmadrider-me | iframe dev http://localhost:3120/?mode=os-app, prod https://esmadrider.me/?mode=os-app | 960 x 720, min 640 x 480, resizable |
projects | Projects | Pr | /app/projects | @prox-os/os-apps/projects | 880 x 580, resizable |
data-room | Data Room | Da | /app-user/data-room | @prox-os/os-apps/data-room | 900 x 600, resizable |
assets | Assets | At | /app/assets | @prox-os/os-apps/assets | 920 x 620, resizable |
automations | Automations | Au | /app-user/automations | @prox-os/os-apps/automations | 840 x 560, resizable |
system | System | Sy | /app-os/system | @prox-os/os-apps/system | 840 x 560, fixed resize |
developer-architecture | Architecture | Network | /app-os/developer-architecture | @prox-os/os-apps/architecture | 1100 x 720, min 760 x 520, resizable |
api-worker | API Worker | DevAPI | /app-dev/api-worker | iframe http://localhost:8787 | 980 x 620, min 680 x 460, resizable |
ui-workshop | UI Workshop | DevUI | /app-dev/ui-workshop | iframe http://localhost:6006 | 1180 x 760, min 760 x 520, resizable |
docs | Docs | DevDocs | /app-dev/docs | iframe http://localhost:3100/docs | 1120 x 740, min 720 x 500, resizable |
nx-graph | Nx Graph | DevGraph | /app-dev/nx-graph | iframe http://localhost:4211/projects | 1160 x 740, min 760 x 520, resizable |
scalar-api | Scalar | DevScalar | /app-dev/scalar-api | iframe http://localhost:8787/docs | 1120 x 740, min 720 x 500, resizable |
shazam | Shazam | Sh | /app/shazam | @prox-os/os-apps/shazam | 860 x 580, resizable |
moments | Moments | Mm | /app/moments | @prox-os/os-apps/moments | 900 x 620, resizable |
piano | Piano | Pi | /app/piano | @prox-os/os-apps/piano | 900 x 600, resizable |
admin | Admin | Ad | /app-os/admin | @prox-os/os-apps/admin | 900 x 620, resizable |
monitor | Monitor | Mo | /app-os/monitor | @prox-os/os-apps/monitor | 900 x 620, resizable |
app-store | App Store | As | /app-os/app-store | @prox-os/os-apps/app-store | 940 x 640, resizable |
deploy | Deploy | Dp | /app-os/deploy | @prox-os/os-apps/deploy | 940 x 640, resizable |
pricing | Pricing | Pr$ | /app-os/pricing | @prox-os/os-apps/pricing | 1040 x 720, min 760 x 520, resizable |
hola | Hola | Ho | /app-os/hola | @prox-os/os-apps/hola | 760 x 560, min 620 x 460, resizable |
dev-tools | Dev Tools | Dt | /app-dev/dev-tools | @prox-os/os-apps/developer-tools | 900 x 620, resizable |
developer-route-map | Route Map | Rm | /app-dev/developer-route-map | @prox-os/os-apps/developer-route-map | 980 x 680, resizable |
community | Community | Co | /app-os/community | @prox-os/os-apps/community | 920 x 620, resizable |
keyboard-shortcuts | Keyboard shortcuts | Ks | /app-user/keyboard-shortcuts | KeyboardShortcutsApp | 760 x 560, resizable |
chatos | ChatOS | Ch | /app/chatos | @prox-os/os-apps/chatos | 900 x 640, resizable |
notifications | Notifications | No | /app-user/notifications | @prox-os/os-apps/notifications | 860 x 620, resizable |
logs | Logs | Lo | /app-user/logs | @prox-os/os-apps/activity-logs | 840 x 580, resizable |
user-profile | User Profile | Up | /app-user/user-profile | @prox-os/os-apps/user-profile | 720 x 560, resizable |
visitor | Visitor | Vi | /app-user/visitor | @prox-os/os-apps/visitor | 760 x 540, resizable |
resume | Resume | Re | /app/resume | @prox-os/os-apps/resume | 780 x 640, resizable |
display-options | Display options | Di | /app-user/display-options | DisplayOptionsApp | 600 x 640, fixed resize, fixed maximize |
Most non-core apps now use runtime.kind: "os-package" and are imported from @prox-os/os-apps. The /app-dev localhost iframe apps use runtime.kind: "iframe" with templates in @prox-os/app-registry (devOnly: true; omitted from the composed registry in production builds). esmadrider-me is the first production-oriented external iframe under /app-iframe (template packages/app-registry/src/manifests/esmadrider-me.ts). Dev Tools consumes development diagnostics through AppRuntimeContext. Keyboard shortcuts and Display options remain runtime.kind: "local-module" shell control apps.
App ids should use kebab-case without dots or other punctuation.
Future Manifest Shape
The current ShellAppManifest already includes:
id,title,shortTitle,icon,descriptioncategory,accent,status,ownershipdesktopPlacement,routeGroup,routePathruntime.kind,runtime.modulewindow.defaultWidth,window.defaultHeight,window.resizable, optionalwindow.maximizable- optional
window.minWidth,window.minHeight permissions
Future OsAppManifest should add (see also app-namespace-and-domain-strategy.md):
namespace/ owner handle and mutableslugwithaliasesand redirect metadataversionsourcePackageorsourceUrldataScopesapiDependenciescapabilitiesfeatureFlagsi18nNamespacenavigationfor app-internal routeslifecyclehooks for mount, suspend, resume, and closesecuritymetadata for sandboxing and external links
The first external package target is packages/os-apps, exposed through runtime.kind: "os-package". New reusable official apps should export a manifest from @prox-os/os-apps first, then be imported into the shell registry.
Relationship To Window Manager
The registry describes what can be opened. The window manager decides what is open now.
Flow:
- Shell receives an app open request.
appRegistryvalidates the app and provides title, icon, route, permissions, and default window size.useShellStore.openAppcreates or focuses aWindowInstance.WindowLayerrendersAppWindow.AppRuntimereads the manifest, buildsAppRuntimeContext, and delegates local component lookup to the app renderer map.
The window manager should not hardcode app UI. It should only use registry metadata needed for window creation and presentation.
Local app renderers are centralized in apps/os-shell/src/apps/localAppComponents.tsx as a static renderer map. Package apps are imported there as a bridge while AppRuntime.tsx stays focused on runtime context and iframe hosting.