Skip to content

Configuration

config.json is the one configuration source. The loader deep-merges it over defaults. server.name, server.owner.name, and server.url are required in the file itself; the URL must be a complete http:// or https:// URL. websocket.host must be a non-empty string and websocket.port must be 1–65535. Changing either listener setting requires a restart.

{
"server": {
"name": "My OriginChats",
"url": "https://chat.example.com",
"owner": {
"name": "sophie"
},
"icon": "https://example.com/icon.png",
"banner": "https://example.com/banner.png"
},
"websocket": {
"host": "127.0.0.1",
"port": 5613
}
}
Path Default Meaning
limits.post_content 2000 Maximum message content length
limits.search_results 30 Maximum search page size
limits.max_reactions_per_message 20 Reaction variety limit
limits.max_members 0 Advertised in the handshake; not enforced by the current join/auth path
websocket.host 127.0.0.1 HTTP/WebSocket bind host; IPv6 values are bracketed automatically
websocket.port 5613 HTTP/WebSocket listen port; takes effect on restart
rate_limiting.enabled true Enables persisted user timeouts; also gates timeout checks
rate_limiting.messages_per_minute 60 Reserved default; not read by the current rate-limit implementation
rate_limiting.burst_limit 10 Reserved default; not read by the current rate-limit implementation
rate_limiting.cooldown_seconds 30 Reserved default; not read by the current rate-limit implementation
embeds.enabled true Server-side link embed reconciliation
embeds.proxy_url Mistium proxy URL Fetch proxy prefix
welcome.enabled true Enable welcome message
welcome.channel welcome Welcome destination
welcome.message Welcome {username}! … Template; supports {username}
welcome.first_time_only true Only greet new accounts
modlog.enabled true Audit logging
Path Default
attachments.enabled true
attachments.storage local
attachments.max_size 104857600 (100 MiB)
attachments.allowed_types images, video, audio, PDF
attachments.max_attachments_per_user -1 (unlimited)
attachments.free_tier_max_expiration_days 7
attachments.permanent_expiration_days 365 (reserved; not read by the upload path)
attachments.permanent_tiers pro, max (advertised only)
attachments.uploads_per_minute 10
attachments.subscription_cache_ttl 300 (reserved; not read)

Compression defaults are present in configuration, but the current attachment upload/storage path does not read them or transform images.

For S3-compatible storage, configure endpoint, bucket, region, public URL, and presigned URL settings beneath attachments.s3. Credentials can be supplied through the existing R2_ or S3_ environment variables used by the storage helper; keep secrets out of committed JSON.

Automod defaults are present (blocked_words, timeout_seconds, case sensitivity, whole-word matching, and bypass_roles), but no current message handler reads or enforces them.

The defaults retain legacy DB.channels and DB.users entries, but runtime loaders use the selected database directory and conventional filenames. Do not introduce a second config file or depend on the repository working directory after use changes into the database directory.