SymorvaDocs
Architecture

Architecture overview

Four layers — community apps, the operator's deployment, Symorva foundation modules and shared services — with the request flows and boundaries between them.

Symorva separates what a community owns from what it shares. The community's apps, accounts, messages and records belong to the operator and run in the operator's environment. Shared services handle workloads that benefit from scale — real-time media, AI inference, metering — and receive only what each request needs.

01 · Community appsOperator-branded clients built from one manifest
iOSAndroid APKmacOSWindows
02 · Your deploymentRuns in, and belongs to, the operator's environment
Community serverAdmin consoleModule servicesData stores
03 · Symorva foundationReusable modules, enabled per community
E2EE chatMeetingsAI studioWallet + TEEDAppsCreator economy
04 · Shared servicesConnected as configured, metered per community
Real-time mediaAI inference & generationMetering & settlement
Dependency lines describe service calls, not custody: chat plaintext and wallet keys are never handed to the shared layer.

The diagram shows the module design. Chat end-to-end encryption and TEE key protection for wallets are in developer preview; see Status & roadmap for what runs today in the reference deployment.

The four layers

1. Community apps

Native clients for iOS, Android (APK), macOS and Windows. Each build carries the operator's identity — name, icon, colours, theme, locales — and the navigation of its enabled modules, all generated from the manifest. Platform UI stays native: SwiftUI on Apple platforms and Jetpack Compose on Android, over a shared headless core that owns product state and rules. See Multi-platform delivery.

2. The operator's deployment

Everything that stores community data. It always contains:

ComponentResponsibility
Community serverAccounts, identity, community structure, roles and module host
Admin consoleOperator console for members, content, modules and settings
Data storesRelational database, cache, object storage and message queue

Each enabled module adds its own service: the messaging service (chat), meeting service (meetings), studio service (AI studio), wallet service (wallet), directory service (DApps) and rewards service (creator economy). See Community deployment.

3. Symorva foundation modules

The reusable module implementations, wire contracts and composition rules that Symorva maintains and versions. Layer 3 is what Symorva ships; layer 2 is where it runs. The SDK's module catalog is the single source of truth for module metadata — the validator, the planner, the CLI and these docs all read from it.

4. Shared services

ServiceWhat it providesMetered in
Real-time mediaLow-latency audio and video for rooms, plus a low-latency streaming edge for large audiencesparticipant-minutes, broadcast-viewer-minutes
AI inference & generationModel gateway for chat, image and video generation with per-community quotasai-tokens, images, video-seconds
Resource metering & settlementUsage records for shared services and settlement of creator revenuesettled-payouts

See Shared services.

Request and data flows

Sending a message

  1. The sender's app encrypts the message content on the device when modules.chat.e2ee is on.
  2. The app submits the message to the messaging service in the operator's deployment. The service applies membership and policy checks — for example mutes and bans — before delivery.
  3. The messaging service routes and stores the message and pushes it to recipients' devices, where authorised devices decrypt it.

No shared service is involved. Chat has no metered units.

Joining a meeting

  1. The app asks the meeting service to join a room.
  2. The meeting service checks the member's permission and returns a short-lived, room-scoped media credential.
  3. The app connects to the shared real-time media service with that credential. In large-room mode, speakers stay on real-time media and listeners receive a signed playback address on the streaming edge.
  4. The media service records participant-minutes and viewer-minutes against the community.

The media service never receives the member directory or chat history — only the credential and the media.

Using the AI studio

  1. The member starts a request in the app — a prompt, an image to generate, a project step.
  2. The studio service in the operator's deployment checks permissions, publishing rules and quota, and forwards the request to the shared AI service.
  3. The AI service runs inference and returns the result; the studio service stores the project and generated assets in the operator's data stores.

Chat content is never sent unless the member has granted the assistant access to a conversation from their own device. See AI & creator studio.

Moving value

  1. The member prepares a transfer or payment in the app and confirms it.
  2. The wallet service in the operator's deployment validates the request against its rules and records it.
  3. Signing runs in a protected key boundary, never in the business API. In the module design that boundary is a trusted execution environment.

Wallet operations do not touch shared services. Creator payouts settle through the community's wallet service; the metering service records them.

What crosses each boundary

BoundaryCrossesDoes not cross
App → operator deploymentAuthenticated API calls, message envelopes (ciphertext when E2EE is on), media uploads, confirmed payment commandsDevice private keys; plaintext of encrypted messages
Operator deployment → real-time mediaRoom-scoped short-lived credentials, media streams encrypted in transitMember directory, chat history, wallet data
Operator deployment → AI serviceThe inputs a member or operator submits for a request, community identifier, quota contextChat content without an explicit member grant; contact lists
Shared services → meteringUsage records: community, module, unit, quantity, time windowContent of any kind
Symorva → operator deploymentVersioned module releases and schema migrations—
Operator deployment → SymorvaUsage records for shared services onlyMember data, message data, wallet data

Design principles

These principles come from the reference deployment and carry over unchanged:

  • Separate failure domains. The messaging core and the business services are deployed and upgraded independently and communicate over a stable internal network, so one can be rolled back without the other.
  • Configuration outside the code. Deployments track example configuration contracts; real secrets, certificates and signing material live only in the operator's secret store.
  • Clients are build artifacts. Apps are produced per environment from central configuration; they are not long-running services.
  • Explicit schema ownership. A new database is initialised once from a published baseline; after that, only managed, versioned migrations change it, and they run before a service starts.
  • Native UI, shared rules. Platform agreement is tested at product interfaces and reference states, not forced through a shared renderer.
  • A brand may change presentation, not invariants. The manifest can change identity, presentation, copy and enabled modules. It cannot change the business rules of conversations, messages, relationships or communities.

On this page