Skip to content

Architecture

The substrate, mapped.

Programs at the top, substrate in the middle, adapters at the boundaries. Read top to bottom for the platform shape.

Principles

  1. 01

    Programs are first-class

    Each program owns its domain. The launcher is a composition of programs, not a single monolith.

  2. 02

    Substrate is shared

    Realtime, social, presence, app rail, notifications, messaging — common machinery.

  3. 03

    Adapters at boundaries

    Source adapters (Steam, Epic, GOG) sit at one boundary; federation adapters at another.

  4. 04

    Domain → state → action → execution

    Library's layering pattern. Other programs follow it where it fits.

  5. 05

    Engine packages are dependency-free

    Spatial engine is pure Dart and Flame, zero knowledge of host concerns.

The stack

SURFACE PROGRAMSLibraryMarketplaceEducationChatSocialStreamNewsAccountIntelligenceSpatialSUBSTRATENexus / RealtimeMessagingSocialPresenceNotificationsApp RailLive (coming)ADAPTERSSteamEpicGOGXboxEterniaBlueskyRSS / AtomEmulatorPLATFORM SERVICESKeycloak (auth)Centrifugo (realtime)flutter_secure_storagesqlite3LiveKit (voice)

Launch flow

Trace
User clicks Launch on a game tile
  → Library widget
  → ActionResolver (which CTA, which source, which path)
  → Source adapter (Steam / Epic / GOG / Eternia / manual / emulator)
  → Execution layer
  → Process spawns
  → Presence updates ("in game")
  → Notifications dispatch to friends
  → Centrifugo personal channel emits update

The spine pattern from Library, generalized where it fits

Substrate roster

NexusIn flight

The realtime substrate

Nexus is the umbrella for chat, presence, voice, streaming, and spatial — the realtime substrate that every program plugs into. Chunks A–I shipped; Chunk J is in active rewrite.

MessagingIn flight

DMs, channels, threads, broadcasts

Every conversation lane in one shell — DMs, server channels, threads, broadcast public channels. Rich content renderers for polls, tasks, embeds, and commerce flows.

SocialLive

Friends, profiles, presence

Friends, followers, blocks, profiles — native and federated Bluesky in the same panel. Three async lanes with distinct cache lifetimes so nothing blocks or goes stale.

App RailLive

The sidebar that learns

The left sidebar in the launcher ranks tile candidates from recency, frequency, unread, social, temporal, and day-profile signals. Pinning is a first-class action.

NotificationsLive

Local-first inbox

Notifications inbox with realtime synthesis, read-state, swipe-to-dismiss, deep-link routes, and native Windows toast bridging.

PresenceLive

Sticky, debounced, restored

Online / away / invisible state with batch lookups. Manual state is sticky; auto-transitions never clobber it. Server restores last-asserted state on reconnect.

LiveComing

Launcher-wide media session

Theater, floating, and mini modes for stream and media playback across the launcher. Design-stage — no implementation commits yet.