config.json reference
Orbit is configured at runtime by config.json. It is fetched on startup, deep-merged over the
built-in defaults, then the app renders — so you can re-point or rebrand without rebuilding.
- Source of truth:
public/config.json(copied into the build). - Served at:
/app/config.json. - Edit live: the service worker serves it network-first, so editing the deployed file takes effect on the next reload — no rebuild.
Merge rules: objects merge key-by-key; arrays and scalars replace wholesale.
Options
| Key | Type | What it does |
|---|---|---|
server.url |
string | WebSocket URL of the IRCv3 server. |
server.guestIdent |
string | Ident for guests (not logged in) — e.g. Foo!Invité@…. Folded to ASCII (IRC idents are [A-Za-z0-9._-], so Invité→Invite). Logged-in members use their own nick as the ident. |
startup.channels |
string[] | Channels auto-joined (first = active). A ?channel= URL param overrides. |
branding.name |
string | App/network name — UI, tab title, notifications, PWA install prompt, and CTCP VERSION. |
branding.icon |
string | Logo/icon — connect screen, browser favicon, desktop + push notifications, PWA. |
branding.url |
string | Homepage (used in CTCP VERSION/SOURCE). |
branding.tagline / taglineEm / subtitle |
string | Connect-screen copy. |
branding.projectUrl |
string | Orbit project/source link (Settings → About). |
turnstile.enabled |
bool | Render the anti-bot challenge inline (Cloudflare Turnstile). false = show the server's verification step as a link, no Cloudflare script. Whether a challenge is required is decided server-side. |
turnstile.sitekey |
string | Public Turnstile site key. |
report.service |
string | Services pseudo-client that receives reports (e.g. ReportServ) — not blocked by a +n staff channel. Empty = fall back to report.target. |
report.target |
string | Channel that reports are sent to when report.service is empty. |
defaults.theme |
string | light · dark · yomirc · yomirc-dark. |
defaults.compact / sound / hideJoinQuit / clock24 |
bool | Preset new-user prefs. |
defaults.lang |
string | Force the UI language (en, fr, de, es, it, tr, ru, ne, pt-BR, pt-PT). Empty = auto-detect from the browser. |
features.push |
bool | Web Push notifications — the Settings row and the re-subscribe-on-connect. |
features.imageUpload |
bool | Composer image button and paste / drag-drop upload. |
features.register |
bool | Account self-service: the "Create account" button, the "Forgot password" link, and their FAQ entries. |
plugins |
string[] | Plugin script URLs loaded at startup. See Plugins. |
defaults.*only seed a user's preferences the first time — once someone changes a setting, it's stored in their browser and the config no longer overrides it.
Languages
The UI ships fully translated in 10 languages — English, French, German, Spanish,
Italian, Turkish, Russian, Nepali, and Brazilian + European Portuguese. Orbit
auto-detects the visitor's browser language; pin a default with defaults.lang (users
can still switch in Settings). The bundled plugins are localized too — see
Plugins.
Example
{
"server": { "url": "wss://irc.example.org/ws/", "guestIdent": "Guest" },
"startup": { "channels": ["#lobby", "#help"] },
"branding": { "name": "ExampleChat", "icon": "https://example.org/logo.svg", "tagline": "Chat with", "taglineEm": "everyone." },
"turnstile":{ "enabled": false, "sitekey": "" },
"report": { "service": "ReportServ", "target": "#staff" },
"defaults": { "theme": "dark", "compact": true, "lang": "" },
"features": { "push": true, "imageUpload": true, "register": false },
"plugins": []
}