Manifest reference
Every field of symorva.config.json — types, defaults, ranges and formats — and every diagnostic the validator can report.
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
| Field | Type | Default | Constraint |
|---|---|---|---|
enabled | true | true | Only true |
e2ee | boolean | true | — |
tribes | boolean | true | — |
roles | array of owner, admin, moderator, member, guest | ["owner", "admin", "member"] | At least one |
joinApproval | boolean | false | — |
maxGroupSize | integer | 2000 | 2 to 10,000 |
Details: Chat & communities.
modules.meetings
| Field | Type | Default | Constraint |
|---|---|---|---|
enabled | true | true | Only true |
video | boolean | true | — |
screenShare | boolean | true | — |
slides | boolean | true | — |
recording | boolean | false | — |
maxParticipants | integer | 50 | 2 to 500 |
broadcast.enabled | boolean | false | — |
broadcast.maxAudience | integer | 1000 | 1 to 10,000 |
Details: Meetings & live rooms.
modules.aiStudio
| Field | Type | Default | Constraint |
|---|---|---|---|
enabled | boolean | false | — |
assistant | boolean | true | — |
imageGeneration | boolean | true | — |
shortDrama | boolean | false | — |
productAds | boolean | false | — |
chatContentAccess | none or member-grant | none | — |
Details: AI & creator studio.
modules.wallet
| Field | Type | Default | Constraint |
|---|---|---|---|
enabled | boolean | false | — |
keyProtection | tee | tee | Only tee |
payments | boolean | true | — |
memberBenefits | boolean | false | — |
networks | string array | [] | Each entry 2 to 32 characters |
Details: Wallets & assets.
modules.dapps
| Field | Type | Default | Constraint |
|---|---|---|---|
enabled | boolean | false | — |
directory | boolean | true | — |
allowlist | string array | [] | Each entry a valid URL |
Details: DApps & ecosystem.
modules.creatorEconomy
| Field | Type | Default | Constraint |
|---|---|---|---|
enabled | boolean | false | — |
tips | boolean | true | — |
remixRevenueShare.enabled | boolean | false | — |
remixRevenueShare.originalCreatorShareBps | integer | 3000 | 0 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.
- Schema. Types, required fields, ranges, formats and enumerations. If this pass fails, validation stops and reports only schema diagnostics.
- 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.
| Code | Raised for | Example message |
|---|---|---|
schema.invalid_type | Wrong type or a missing required field | Invalid input: expected string, received undefined |
schema.invalid_value | A value outside an enumeration or literal | Invalid input: expected 1 |
schema.invalid_format | A string that does not match its format | Use a 6-digit hex colour such as #6E5BFF. |
schema.too_small | Below a minimum length, size or value | Too small: expected array to have >=1 items |
schema.too_big | Above a maximum length, size or value | Too big: expected number to be <=500 |
Non-integers in integer fields are reported as schema.invalid_type with expected int.
Composition diagnostics
| Code | Level | Path | Message |
|---|---|---|---|
module.requires | error | modules.<id> | <Module> requires <Module>. Enable modules.<dependency>. |
service.media-required | error | sharedServices.media | Meetings are part of the foundation and need the real-time media service. |
service.ai-required | error | sharedServices.ai | AI & creator studio is enabled but the AI service is set to none. |
module.empty | warning | modules.aiStudio | AI & creator studio is enabled with every tool switched off. |
module.empty | warning | modules.creatorEconomy | Creator economy is enabled with tips and remix revenue sharing both off. |
privacy.ai-grant | info | modules.aiStudio.chatContentAccess | The assistant can only read a conversation after a member grants access on their device, and the grant can be revoked. |
privacy.e2ee-off | warning | modules.chat.e2ee | End-to-end encryption is off. Message content will be readable by the community server. |
meetings.large-room | info | modules.meetings.broadcast.maxAudience | Audiences above 500 use large-room mode. |
dapps.no-wallet | warning | modules.dapps | DApps are enabled without a wallet. |
wallet.no-networks | warning | modules.wallet.networks | The wallet is enabled but no networks are listed. |
platforms.duplicate | warning | platforms | Duplicate 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:
{
"$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.
| Template | Name | Default name | Colour | Enabled beyond the foundation |
|---|---|---|---|---|
dao | DAO & collective | Orbit Collective | #6E5BFF | AI studio, wallet with member benefits, DApps; join approval; broadcast up to 2,000 |
creator | Creators & AI studio | Creator Circle | #F2557A | AI studio with short dramas and product ads, wallet, creator economy with 30% remix share; broadcast up to 5,000 |
team | Independent team / OPC | Independent Guild | #14B8A6 | AI assistant; no tribes; roles owner, member, guest; join approval; recording on |
ecosystem | Web3 & DApp ecosystem | Nova Guild | #3B82F6 | Wallet, DApp directory; broadcast up to 10,000 |
Example names are illustrative; they do not refer to real communities.