Prox OS Docs
Architecture

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-dev localhost iframes; see packages/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

GroupPrefixPlacementMeaning
app/appleft desktop folderPersonal work, data, and creative apps.
app-user/app-userright desktop folderIdentity, profile, visitor, notifications, shortcuts, display, and other user-specific surfaces.
app-shell/app-shellright desktop folderTarget group for shell-coupled apps that remain inside apps/os-shell. Not implemented in the current router yet.
app-dev/app-devbottom-right desktop folder in development; hidden in productionDeveloper-only local servers, docs, project graphs, and API explorers.
app-iframe/app-iframeleft desktop folder (Framed Apps)External and standalone iframe apps hosted inside managed shell windows.
app-os/app-osright desktop folderReusable 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

appIdTitleIconRouteEntry componentWindow
esmadrider-meesmadrider.meEs/app-iframe/esmadrider-meiframe dev http://localhost:3120/?mode=os-app, prod https://esmadrider.me/?mode=os-app960 x 720, min 640 x 480, resizable
projectsProjectsPr/app/projects@prox-os/os-apps/projects880 x 580, resizable
data-roomData RoomDa/app-user/data-room@prox-os/os-apps/data-room900 x 600, resizable
assetsAssetsAt/app/assets@prox-os/os-apps/assets920 x 620, resizable
automationsAutomationsAu/app-user/automations@prox-os/os-apps/automations840 x 560, resizable
systemSystemSy/app-os/system@prox-os/os-apps/system840 x 560, fixed resize
developer-architectureArchitectureNetwork/app-os/developer-architecture@prox-os/os-apps/architecture1100 x 720, min 760 x 520, resizable
api-workerAPI WorkerDevAPI/app-dev/api-workeriframe http://localhost:8787980 x 620, min 680 x 460, resizable
ui-workshopUI WorkshopDevUI/app-dev/ui-workshopiframe http://localhost:60061180 x 760, min 760 x 520, resizable
docsDocsDevDocs/app-dev/docsiframe http://localhost:3100/docs1120 x 740, min 720 x 500, resizable
nx-graphNx GraphDevGraph/app-dev/nx-graphiframe http://localhost:4211/projects1160 x 740, min 760 x 520, resizable
scalar-apiScalarDevScalar/app-dev/scalar-apiiframe http://localhost:8787/docs1120 x 740, min 720 x 500, resizable
shazamShazamSh/app/shazam@prox-os/os-apps/shazam860 x 580, resizable
momentsMomentsMm/app/moments@prox-os/os-apps/moments900 x 620, resizable
pianoPianoPi/app/piano@prox-os/os-apps/piano900 x 600, resizable
adminAdminAd/app-os/admin@prox-os/os-apps/admin900 x 620, resizable
monitorMonitorMo/app-os/monitor@prox-os/os-apps/monitor900 x 620, resizable
app-storeApp StoreAs/app-os/app-store@prox-os/os-apps/app-store940 x 640, resizable
deployDeployDp/app-os/deploy@prox-os/os-apps/deploy940 x 640, resizable
pricingPricingPr$/app-os/pricing@prox-os/os-apps/pricing1040 x 720, min 760 x 520, resizable
holaHolaHo/app-os/hola@prox-os/os-apps/hola760 x 560, min 620 x 460, resizable
dev-toolsDev ToolsDt/app-dev/dev-tools@prox-os/os-apps/developer-tools900 x 620, resizable
developer-route-mapRoute MapRm/app-dev/developer-route-map@prox-os/os-apps/developer-route-map980 x 680, resizable
communityCommunityCo/app-os/community@prox-os/os-apps/community920 x 620, resizable
keyboard-shortcutsKeyboard shortcutsKs/app-user/keyboard-shortcutsKeyboardShortcutsApp760 x 560, resizable
chatosChatOSCh/app/chatos@prox-os/os-apps/chatos900 x 640, resizable
notificationsNotificationsNo/app-user/notifications@prox-os/os-apps/notifications860 x 620, resizable
logsLogsLo/app-user/logs@prox-os/os-apps/activity-logs840 x 580, resizable
user-profileUser ProfileUp/app-user/user-profile@prox-os/os-apps/user-profile720 x 560, resizable
visitorVisitorVi/app-user/visitor@prox-os/os-apps/visitor760 x 540, resizable
resumeResumeRe/app/resume@prox-os/os-apps/resume780 x 640, resizable
display-optionsDisplay optionsDi/app-user/display-optionsDisplayOptionsApp600 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, description
  • category, accent, status, ownership
  • desktopPlacement, routeGroup, routePath
  • runtime.kind, runtime.module
  • window.defaultWidth, window.defaultHeight, window.resizable, optional window.maximizable
  • optional window.minWidth, window.minHeight
  • permissions

Future OsAppManifest should add (see also app-namespace-and-domain-strategy.md):

  • namespace / owner handle and mutable slug with aliases and redirect metadata
  • version
  • sourcePackage or sourceUrl
  • dataScopes
  • apiDependencies
  • capabilities
  • featureFlags
  • i18nNamespace
  • navigation for app-internal routes
  • lifecycle hooks for mount, suspend, resume, and close
  • security metadata 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:

  1. Shell receives an app open request.
  2. appRegistry validates the app and provides title, icon, route, permissions, and default window size.
  3. useShellStore.openApp creates or focuses a WindowInstance.
  4. WindowLayer renders AppWindow.
  5. AppRuntime reads the manifest, builds AppRuntimeContext, 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.

On this page