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 }}Defaults
Section titled “Defaults”| 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 |
Attachments
Section titled “Attachments”| 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
Section titled “Automod”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.
Database paths
Section titled “Database paths”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.
