SymorvaDocs

Quickstart

Create a community manifest from a template, validate it, and resolve it into a deployment plan with the symorva CLI.

This guide takes you from an empty directory to a validated manifest and a deployment plan. It uses the symorva CLI that ships with @symorva/sdk. Every output shown below is real output from the current developer-preview build.

The SDK is in developer preview and is distributed to design partners by the Symorva team; it is not published to a public package registry. Contact the team for access. Once the package is installed in your project, the symorva command is available.

Create a manifest from a template

Run init in an empty directory. Without options it uses the dao template and writes symorva.config.json.

symorva init
Created symorva.config.json from the dao template.
Next: symorva validate && symorva plan

Choose another starting point with --template (dao, creator, team or ecosystem) and name your community with --name. The name is turned into a stable slug for community.id:

symorva init --template creator --name "Lumen Studio"

init refuses to overwrite an existing file unless you pass --force.

Read what was generated

The template writes only the fields it needs; everything else takes its default during validation. Short arrays are shown on one line here.

symorva.config.json
{
  "$schema": "./node_modules/@symorva/sdk/schema/community.v1.json",
  "schemaVersion": 1,
  "community": {
    "id": "orbit-collective",
    "name": "Orbit Collective",
    "template": "dao",
    "locales": ["en"]
  },
  "brand": {
    "primaryColor": "#6E5BFF",
    "theme": "system"
  },
  "platforms": ["ios", "android-apk", "macos", "windows"],
  "deployment": {
    "mode": "self-hosted",
    "region": "asia-southeast"
  },
  "modules": {
    "chat": {
      "e2ee": true,
      "tribes": true,
      "roles": ["owner", "admin", "moderator", "member"],
      "joinApproval": true
    },
    "meetings": {
      "broadcast": { "enabled": true, "maxAudience": 2000 }
    },
    "aiStudio": { "enabled": true, "assistant": true, "imageGeneration": true },
    "wallet": { "enabled": true, "memberBenefits": true, "networks": ["bnb-chain", "base"] },
    "dapps": { "enabled": true }
  }
}

The $schema reference gives editors completion and inline validation. Network identifiers and the region in templates are placeholders to edit; they do not indicate where Symorva runs or which networks a wallet is deployed on. "Orbit Collective" is an example name.

Validate

symorva validate
✓ Orbit Collective (orbit-collective) — 5 modules, 4 platforms
  info  Audiences above 500 use large-room mode: speakers stay on real-time media, listeners receive a low-latency stream. (modules.meetings.broadcast.maxAudience · meetings.large-room)

Validation runs in two passes: the schema (shapes, ranges, formats) and the composition rules between modules, shared services and platforms. The summary line counts enabled modules and platforms. Each diagnostic ends with its JSON path and stable code. This info note is expected — the template sets a broadcast audience of 2,000, which is above the large-room threshold of 500.

Plan the deployment

symorva plan
Orbit Collective
navigation  Community · Meetings · AI Studio · Wallet · DApps

Your deployment
  Community server     Accounts, identity, community structure, roles and module host.
  Admin console        Operator console for members, content, modules and settings.
  Data stores          Relational database, cache, object storage and message queue, owned by the operator.
  Messaging service    Message routing, sync, groups, tribes and membership. Runs in the operator's environment.
  Meeting service      Room lifecycle, scheduling, permissions and invitations. Media flows through the shared real-time media service.
  Studio service       Projects, prompts, generated assets and publishing rules. Inference runs on the shared AI service.
  Wallet service       Balances, transfers, payment records and benefit rules. Sensitive key operations run inside a trusted execution environment.
  Directory service    Listings, categories, allowlists and partner configuration managed by the operator.

Shared services
  Real-time media                  used by Meetings & live rooms · metered in participant-minutes, broadcast-viewer-minutes
  AI inference & generation        used by AI & creator studio · metered in ai-tokens, images, video-seconds
  Resource metering & settlement   records usage for the services above

Clients
  iOS          Signed iOS build for App Store or TestFlight
  Android APK  Signed Android APK
  macOS        Notarised macOS app
  Windows      Signed Windows installer

Notes
  info  Audiences above 500 use large-room mode: speakers stay on real-time media, listeners receive a low-latency stream. (modules.meetings.broadcast.maxAudience · meetings.large-room)

The plan separates what you own (Your deployment) from what you connect to (Shared services). Every enabled module adds one owned component; only meetings and the AI studio consume shared services here. The navigation line is the tab order of the generated app.

See a composition error

Turn off the shared AI service while the AI studio is still enabled:

symorva.config.json (excerpt)
{
  "sharedServices": { "ai": "none" }
}
symorva validate
✗ symorva.config.json is invalid
  error AI & creator studio is enabled but the AI service is set to none. (sharedServices.ai · service.ai-required)
  info  Audiences above 500 use large-room mode: speakers stay on real-time media, listeners receive a low-latency stream. (modules.meetings.broadcast.maxAudience · meetings.large-room)

The command exits with status 1, so it can gate a CI job. Either disable modules.aiStudio or restore sharedServices.ai to symorva. All diagnostic codes are listed in the Manifest reference.

Use the plan in tooling

plan --json prints the same plan as structured data:

symorva plan --json
{
  "ok": true,
  "plan": {
    "community": { "id": "orbit-collective", "name": "Orbit Collective" },
    "modules": ["chat", "meetings", "aiStudio", "wallet", "dapps"],
    "owned": [
      {
        "id": "community-server",
        "name": "Community server",
        "description": "Accounts, identity, community structure, roles and module host.",
        "source": "core"
      }
    ],
    "shared": [
      {
        "id": "media",
        "name": "Real-time media",
        "usedBy": ["meetings"],
        "meteredUnits": ["participant-minutes", "broadcast-viewer-minutes"]
      }
    ],
    "clients": [
      {
        "platform": "ios",
        "name": "iOS",
        "artifact": "Signed iOS build for App Store or TestFlight",
        "family": "mobile"
      }
    ],
    "navigation": ["Community", "Meetings", "AI Studio", "Wallet", "DApps"],
    "privacy": [
      {
        "module": "chat",
        "protection": "Message content is encrypted on the sender's device and decrypted only on authorised recipient devices."
      }
    ],
    "diagnostics": [
      {
        "level": "info",
        "code": "meetings.large-room",
        "path": "modules.meetings.broadcast.maxAudience",
        "message": "Audiences above 500 use large-room mode: speakers stay on real-time media, listeners receive a low-latency stream."
      }
    ]
  }
}

Arrays are abbreviated to their first entry and short arrays are shown on one line. When the manifest is invalid, the output is { "ok": false, "diagnostics": [...] } and the exit status is 1.

Next steps

On this page