Architecture

Orbit is a small, modular React app. No framework magic — a thin IRC layer feeds a zustand store, which renders components.

Project tree

src/
  config.ts            App.tsx  main.tsx  index.css
  lib/        format.tsx  editor.ts          ← presentation + editor helpers
  ui/         theme.ts  prefs.ts  viewport.ts
  services/   notify.ts  push.ts  avatars.ts
  irc/        parser  client  modes  numerics  casemap  types  caps  ctcp
  store.ts    store/text.ts  store/persistence.ts
  components/
    Chat.tsx            ← thin assembler
    chat/      MessageList  Composer  Sidebar  Topbar  MemberList  Banners
    settings/  SettingsModal
    profile/   ProfileModal
    modals/    Modals
    Avatar  ConnectScreen  Turnstile

Layers

  • irc/ — the protocol. client.ts is the WebSocket transport + CAP negotiation; parser.ts, modes.ts, casemap.ts, numerics.ts are pure primitives. caps.ts lists the requested capabilities.
  • store.ts — turns IRC events into buffers, messages and members (zustand). Pure helpers split into store/text.ts (masking, formatting) and store/persistence.ts.
  • lib/format.tsx renders mIRC formatting → React; editor.ts is the rich-composer serialization.
  • components/ — the UI, grouped by area (chat/, settings/, profile/, modals/). Chat.tsx is a ~30-line assembler.

Quality

Vitest unit tests cover the pure modules (parser, casemap, masking). Lint + test + build run in CI, and the self-hosted push-to-deploy gates on the same.