SymorvaDocs
SDK & APIs

Manifest reference

Every field of symorva.config.json — types, defaults, ranges and formats — and every diagnostic the validator can report.

Developer preview· Interface published, subject to change

The community manifest is a JSON document, conventionally named symorva.config.json. One manifest describes one community: its identity, brand, modules, platforms, deployment and shared-service connections. This page mirrors schema version 1 as implemented in @symorva/sdk 0.1.0.

Fields with a default may be omitted; the validator applies defaults before checking composition rules. Fields without a default are required.

Top level

Prop

Type

community

Prop

Type

Locale tags must match a two- or three-letter lowercase language subtag followed by optional subtags of 2 to 8 letters or digits — en, zh-Hans, pt-BR. EN is rejected.

brand

Prop

Type

modules

Each key is optional. An omitted module takes its defaults: chat and meetings are always enabled; the four optional modules are disabled.

modules.chat

FieldTypeDefaultConstraint
enabledtruetrueOnly true
e2eebooleantrue—
tribesbooleantrue—
rolesarray of owner, admin, moderator, member, guest["owner", "admin", "member"]At least one
joinApprovalbooleanfalse—
maxGroupSizeinteger20002 to 10,000

Details: Chat & communities.

modules.meetings

FieldTypeDefaultConstraint
enabledtruetrueOnly true
videobooleantrue—
screenSharebooleantrue—
slidesbooleantrue—
recordingbooleanfalse—
maxParticipantsinteger502 to 500
broadcast.enabledbooleanfalse—
broadcast.maxAudienceinteger10001 to 10,000

Details: Meetings & live rooms.

modules.aiStudio

FieldTypeDefaultConstraint
enabledbooleanfalse—
assistantbooleantrue—
imageGenerationbooleantrue—
shortDramabooleanfalse—
productAdsbooleanfalse—
chatContentAccessnone or member-grantnone—

Details: AI & creator studio.

modules.wallet

FieldTypeDefaultConstraint
enabledbooleanfalse—
keyProtectionteeteeOnly tee
paymentsbooleantrue—
memberBenefitsbooleanfalse—
networksstring array[]Each entry 2 to 32 characters

Details: Wallets & assets.

modules.dapps

FieldTypeDefaultConstraint
enabledbooleanfalse—
directorybooleantrue—
allowliststring array[]Each entry a valid URL

Details: DApps & ecosystem.

modules.creatorEconomy

FieldTypeDefaultConstraint
enabledbooleanfalse—
tipsbooleantrue—
remixRevenueShare.enabledbooleanfalse—
remixRevenueShare.originalCreatorShareBpsinteger30000 to 10,000 basis points

Details: Creator economy.

platforms

An array of platform targets, at least one: ios, android-apk, macos, windows. Duplicates are allowed by the schema, reported as platforms.duplicate, and built once. See Multi-platform delivery.

deployment

Prop

Type

sharedServices

Prop

Type

A partial object is completed with defaults: { "ai": "none" } resolves to media: "symorva", ai: "none", metering: "symorva".

Validation behaviour

Validation runs in two passes.

  1. Schema. Types, required fields, ranges, formats and enumerations. If this pass fails, validation stops and reports only schema diagnostics.
  2. Composition. Rules between modules, shared services and platforms. All rules run and all findings are reported together.

Every object in the manifest is strict: a key the schema does not define is an error (schema.unrecognized_keys) rather than being dropped, so a misspelt key such as e2e instead of e2ee is reported with its path. The $schema reference lets your editor flag it while you type.

Diagnostics

Schema diagnostics

Schema findings are always errors. Their code is schema. followed by the issue type; their path points at the offending field, with array indices as path segments.

CodeRaised forExample message
schema.invalid_typeWrong type or a missing required fieldInvalid input: expected string, received undefined
schema.invalid_valueA value outside an enumeration or literalInvalid input: expected 1
schema.invalid_formatA string that does not match its formatUse a 6-digit hex colour such as #6E5BFF.
schema.too_smallBelow a minimum length, size or valueToo small: expected array to have >=1 items
schema.too_bigAbove a maximum length, size or valueToo big: expected number to be <=500

Non-integers in integer fields are reported as schema.invalid_type with expected int.

Composition diagnostics

CodeLevelPathMessage
module.requireserrormodules.<id><Module> requires <Module>. Enable modules.<dependency>.
service.media-requirederrorsharedServices.mediaMeetings are part of the foundation and need the real-time media service.
service.ai-requirederrorsharedServices.aiAI & creator studio is enabled but the AI service is set to none.
module.emptywarningmodules.aiStudioAI & creator studio is enabled with every tool switched off.
module.emptywarningmodules.creatorEconomyCreator economy is enabled with tips and remix revenue sharing both off.
privacy.ai-grantinfomodules.aiStudio.chatContentAccessThe assistant can only read a conversation after a member grants access on their device, and the grant can be revoked.
privacy.e2ee-offwarningmodules.chat.e2eeEnd-to-end encryption is off. Message content will be readable by the community server.
meetings.large-roominfomodules.meetings.broadcast.maxAudienceAudiences above 500 use large-room mode.
dapps.no-walletwarningmodules.dappsDApps are enabled without a wallet.
wallet.no-networkswarningmodules.wallet.networksThe wallet is enabled but no networks are listed.
platforms.duplicatewarningplatformsDuplicate platforms: <list>.

Messages are abbreviated in this table; codes and paths are stable and are what tooling should match on.

Complete example

Every field, set explicitly:

symorva.config.json
{
  "$schema": "./node_modules/@symorva/sdk/schema/community.v1.json",
  "schemaVersion": 1,
  "community": {
    "id": "orbit-collective",
    "name": "Orbit Collective",
    "template": "dao",
    "description": "A collective building shared tools in the open.",
    "locales": ["en", "zh-Hans"]
  },
  "brand": {
    "primaryColor": "#6E5BFF",
    "accentColor": "#8C78FF",
    "appIcon": "assets/app-icon.png",
    "theme": "system"
  },
  "modules": {
    "chat": {
      "enabled": true,
      "e2ee": true,
      "tribes": true,
      "roles": ["owner", "admin", "moderator", "member"],
      "joinApproval": true,
      "maxGroupSize": 2000
    },
    "meetings": {
      "enabled": true,
      "video": true,
      "screenShare": true,
      "slides": true,
      "recording": false,
      "maxParticipants": 50,
      "broadcast": { "enabled": true, "maxAudience": 2000 }
    },
    "aiStudio": {
      "enabled": true,
      "assistant": true,
      "imageGeneration": true,
      "shortDrama": false,
      "productAds": false,
      "chatContentAccess": "member-grant"
    },
    "wallet": {
      "enabled": true,
      "keyProtection": "tee",
      "payments": true,
      "memberBenefits": true,
      "networks": ["network-a", "network-b"]
    },
    "dapps": {
      "enabled": true,
      "directory": true,
      "allowlist": ["https://app.partner.example"]
    },
    "creatorEconomy": {
      "enabled": false,
      "tips": true,
      "remixRevenueShare": { "enabled": false, "originalCreatorShareBps": 3000 }
    }
  },
  "platforms": ["ios", "android-apk", "macos", "windows"],
  "deployment": {
    "mode": "self-hosted",
    "region": "eu-central",
    "domain": "community.orbit.example"
  },
  "sharedServices": {
    "media": "symorva",
    "ai": "symorva",
    "metering": "symorva"
  }
}

Templates

symorva init --template <id> and templateManifest(id) produce these starting points. All four target every platform, deploy in self-hosted mode and ship English.

TemplateNameDefault nameColourEnabled beyond the foundation
daoDAO & collectiveOrbit Collective#6E5BFFAI studio, wallet with member benefits, DApps; join approval; broadcast up to 2,000
creatorCreators & AI studioCreator Circle#F2557AAI studio with short dramas and product ads, wallet, creator economy with 30% remix share; broadcast up to 5,000
teamIndependent team / OPCIndependent Guild#14B8A6AI assistant; no tribes; roles owner, member, guest; join approval; recording on
ecosystemWeb3 & DApp ecosystemNova Guild#3B82F6Wallet, DApp directory; broadcast up to 10,000

Example names are illustrative; they do not refer to real communities.

On this page