Orbit gives IRC the interface you'd expect from a chat app today: reactions, replies, typing, read-markers, history and push, all in the browser. https://orbit.tchatou.fr
Find a file
2026-06-20 08:05:33 +00:00
.forgejo chore: project credibility bundle — CONTRIBUTING/CODE_OF_CONDUCT/SECURITY/issue+PR templates, .editorconfig, CHANGELOG; add plugin-bus & mode-parsing tests; replace ineffective try/catch plugin slots with a real error boundary (fixes lint, actually isolates plugin render errors) 2026-06-20 07:31:04 +00:00
docs feat: text-size control (Appearance), Orbit.apiVersion for plugins, and remove dangling privacy/advanced settings labels 2026-06-20 07:51:03 +00:00
plugin-template docs: describe the compiled-plugin path generically (externalized-React model) 2026-06-20 05:59:39 +00:00
public feat: Ctrl/⌘-K quick switcher — fuzzy-jump to any channel, DM or person, or join a channel by name (keyboard-navigable command palette); pure result builder with tests, i18n in 10 languages 2026-06-20 08:05:33 +00:00
src feat: Ctrl/⌘-K quick switcher — fuzzy-jump to any channel, DM or person, or join a channel by name (keyboard-navigable command palette); pure result builder with tests, i18n in 10 languages 2026-06-20 08:05:33 +00:00
tools bot: remove standalone orbit-gitbot daemon (superseded by the Django orbitbot management command) 2026-06-18 23:21:13 +00:00
.editorconfig chore: project credibility bundle — CONTRIBUTING/CODE_OF_CONDUCT/SECURITY/issue+PR templates, .editorconfig, CHANGELOG; add plugin-bus & mode-parsing tests; replace ineffective try/catch plugin slots with a real error boundary (fixes lint, actually isolates plugin render errors) 2026-06-20 07:31:04 +00:00
.gitignore Initial commit — Orbit, a modern pluggable IRCv3 web client 2026-06-18 19:49:50 +00:00
.woodpecker.yml Add Woodpecker CI + vitest test suite; fix lint (dead duplicate CHGHOST/SETNAME cases, escapes) and right-size rules 2026-06-18 21:23:53 +00:00
CHANGELOG.md chore: project credibility bundle — CONTRIBUTING/CODE_OF_CONDUCT/SECURITY/issue+PR templates, .editorconfig, CHANGELOG; add plugin-bus & mode-parsing tests; replace ineffective try/catch plugin slots with a real error boundary (fixes lint, actually isolates plugin render errors) 2026-06-20 07:31:04 +00:00
CODE_OF_CONDUCT.md chore: project credibility bundle — CONTRIBUTING/CODE_OF_CONDUCT/SECURITY/issue+PR templates, .editorconfig, CHANGELOG; add plugin-bus & mode-parsing tests; replace ineffective try/catch plugin slots with a real error boundary (fixes lint, actually isolates plugin render errors) 2026-06-20 07:31:04 +00:00
CONFIG.md feat(plugins): webchat-style operator-controlled plugin system — window.Orbit (plugin/on/emit/state/irc/themes/storage/addUi), config plugins[], HTM render, composer_button slot, demo plugin + docs/PLUGINS.md 2026-06-20 05:01:20 +00:00
CONTRIBUTING.md chore: project credibility bundle — CONTRIBUTING/CODE_OF_CONDUCT/SECURITY/issue+PR templates, .editorconfig, CHANGELOG; add plugin-bus & mode-parsing tests; replace ineffective try/catch plugin slots with a real error boundary (fixes lint, actually isolates plugin render errors) 2026-06-20 07:31:04 +00:00
deploy.sh Add CI status badge + pull-based deploy.sh (test+build gated, with rollback backup) 2026-06-18 21:30:33 +00:00
eslint.config.js feat(plugins): compiled-plugin support — expose React/ReactDOM/jsx-runtime/Fragment as externalization targets, add settings_section slot (addSettingsSection) wired into Settings, + plugin-template/ (Vite build with React externalized) and docs 2026-06-20 05:42:02 +00:00
index.html app: use the Orbit project icon as the favicon / apple-touch-icon / PWA manifest icon 2026-06-20 03:41:30 +00:00
LICENSE Add AGPL-3.0 license 2026-06-18 21:12:31 +00:00
package-lock.json feat(plugins): webchat-style operator-controlled plugin system — window.Orbit (plugin/on/emit/state/irc/themes/storage/addUi), config plugins[], HTM render, composer_button slot, demo plugin + docs/PLUGINS.md 2026-06-20 05:01:20 +00:00
package.json feat(plugins): webchat-style operator-controlled plugin system — window.Orbit (plugin/on/emit/state/irc/themes/storage/addUi), config plugins[], HTM render, composer_button slot, demo plugin + docs/PLUGINS.md 2026-06-20 05:01:20 +00:00
README.md docs: link the hosted documentation site (orbit.tchatou.fr/docs) from the README — header link + Documentation index + config/deploy/plugins point to the docs site 2026-06-20 06:26:32 +00:00
SECURITY.md chore: project credibility bundle — CONTRIBUTING/CODE_OF_CONDUCT/SECURITY/issue+PR templates, .editorconfig, CHANGELOG; add plugin-bus & mode-parsing tests; replace ineffective try/catch plugin slots with a real error boundary (fixes lint, actually isolates plugin render errors) 2026-06-20 07:31:04 +00:00
tsconfig.app.json Initial commit — Orbit, a modern pluggable IRCv3 web client 2026-06-18 19:49:50 +00:00
tsconfig.json Initial commit — Orbit, a modern pluggable IRCv3 web client 2026-06-18 19:49:50 +00:00
tsconfig.node.json Initial commit — Orbit, a modern pluggable IRCv3 web client 2026-06-18 19:49:50 +00:00
vite.config.ts settings: add About section (app version/build/commit injected at build, AGPL source/project links); bump version to 1.0.0 2026-06-20 02:58:33 +00:00

Orbit logo

Orbit

A modern, pluggable IRCv3 web client. TypeScript · React · Vite · zustand — installable as a PWA, re-brandable without a rebuild.

status: work in progress license: AGPL-3.0 IRCv3 PWA TypeScript i18n

Live demo · Documentation · Project page · License

Orbit screenshot

Orbit is a bespoke IRCv3 web client built from scratch — no wrappers, no bridge. It speaks modern IRCv3 directly over a WebSocket and presents it as a polished, app-like chat experience: rich messages, reactions, replies, history, web push, themes and full internationalization. It powers tchatou.fr in production and can be re-pointed at any IRCv3 network and fully re-branded by editing a single runtime config.json — no rebuild required.

🚧 Status

Work in progress. Orbit is under active development. It runs in production, but the UI, config keys and internal APIs are still evolving and may change without notice between commits. Bug reports and contributions are welcome.

Features

  • Real IRCv3 — negotiates 25 capabilities: chat history, message redaction (edit/delete), multiline, reactions, replies, account registration & SASL, server-time, away/typing, web push, and more.
  • Rich composer — bold/italic/underline + mIRC colours, emoji picker, :emoji: / @nick / /command tab-completion, multiline, image upload (paste & drag-drop), and per-channel drafts.
  • Conversations — channels & DMs, member list with roles, whois/profile panels, friends with online alerts, channel admin (modes, bans, topic), link/image/YouTube unfurling.
  • Installable PWA — offline app shell via a service worker, plus Web Push notifications (RFC 8291 / VAPID) that work even when the app is closed.
  • Themes — Light, Dark, Orbit, Orbit Dark and a classic yomIRC/IRC mode.
  • Settings that surface the protocol — a live Server panel (network, software, TLS, users, limits, raw ISUPPORT) and an IRCv3 panel showing exactly which capabilities your server supports.
  • Fully internationalized — 10 languages, browser-detected and switchable live (see Internationalization).
  • Plugins — an experimental, operator-controlled plugin API (window.Orbit) for events, IRC actions, theming and UI slots. See the plugin docs.

📚 Documentation

Full docs are hosted at orbit.tchatou.fr/docs:

Overview what Orbit is, and why
Quick start run your own in a minute
Configuration every config.json option
Branding & themes re-brand without a rebuild
Plugin system the window.Orbit API
Compiled plugins real React plugins
Build & deploy self-hosting
IRCv3 capabilities the protocol features
Architecture how it's built

There's also a user wiki and an FAQ.

🔌 IRCv3 capabilities

Orbit requests every capability it knows how to use and lights up a live status panel (Settings → IRCv3) showing what the connected server actually supports. The full set it negotiates lives in src/irc/caps.ts — including draft/chathistory, draft/event-playback, draft/message-redaction, draft/multiline, draft/account-registration, draft/webpush, sasl, server-time, message-tags, echo-message, batch, labeled-response, multi-prefix, away-notify, chghost, and more.

🚀 Quick start

Requirements: Node 20+ and npm.

npm install
npm run dev        # Vite dev server with HMR
npm run build      # type-check (tsc -b) + production build → dist/
npm run preview    # serve the production build locally
npm run lint       # ESLint
npm run test       # Vitest

⚙️ Configuration

Orbit is configured at runtime by config.json, fetched on startup and deep-merged over built-in defaults. Point it at another IRC network and fully re-brand it without rebuilding — just edit the deployed file and reload (the service worker serves it network-first).

Configuration docs cover every option, merge rules, and examples (source: CONFIG.md).

{
  "server":   { "url": "wss://irc.example.org/ws/" },
  "startup":  { "channels": ["#lobby", "#help"] },
  "branding": { "name": "ExampleChat", "url": "https://example.org" }
}

📦 Deployment

Static output — copy dist/* (including config.json) to the web root served at /app/. To change only the config later, edit the deployed /app/config.json and reload. Full steps in the Build & deploy guide.

🗂️ Project structure

src/
  irc/         IRCv3 client, parser, capabilities, numerics, modes
  store.ts     zustand store — connection, buffers, messages, actions
  components/  chat UI (sidebar, composer, message list, members, modals…)
  i18n/        react-i18next setup + 10 locale files
  ui/ lib/     theming, formatting, editor helpers
public/        config.json, icons, manifest, service worker

🌍 Internationalization

Every user-facing string is translated across 10 languages — English, French, German, Spanish, Italian, Portuguese (Portugal & Brazil), Russian, Turkish and Nepali. The language is browser-detected, persisted, and switchable live from Settings. Strings live in src/i18n/locales/.

🧪 Development & CI

A Woodpecker CI pipeline (.woodpecker.yml) runs lint + test + build on every push and pull request once the repository is enabled at ci.codeberg.org.

📄 License

Licensed under the GNU Affero General Public License v3.0 or later (AGPL-3.0). If you run a modified version of Orbit as a network service, you must make your modified source available to its users. See LICENSE.

Built with React · Cutting-Edge IRCv3 Capabilities orbit.tchatou.fr