Skip to content

Realtime

One client. Many features.

Eternia's chat, presence, voice, notifications, and bridges share one Centrifugo client and one event dispatcher. The result: a launcher that feels live, with one auth handshake and one reconnect path.

Principles

  1. 01

    One Centrifugo client per session

    No socket multiplication. Every program subscribes through one connection.

  2. 02

    Typed room subscriptions

    RoomKey.dm(id), RoomKey.serverChannel(id, channel), RoomKey.thread(id) — not stringly-typed.

  3. 03

    Single dispatcher

    Every feature registers handlers; the dispatcher routes events. No back-channel between features.

  4. 04

    Durable outbox

    Sends queue locally to a sqlite table. The network can blink and you don't lose messages.

  5. 05

    Per-message lane

    Durable vs best-effort is declared at send time. A reaction is best-effort; a DM is durable.

Envelope shape

JSON
{
  "type": "dm.message",
  "id": "01ABCD...",
  "correlationId": "01XYZ...",
  "scope": "dm",
  "scopeId": "dm:42",
  "ts": "2026-05-18T10:23:14Z",
  "by": "user:7f0e...",
  "body": { "kind": "text", "text": "..." }
}

Shape illustrative; canonical contract lives in the launcher's docs/

Programs that plug into this

VoiceBeta

Opt-in voice rooms and 1:1 huddles

StreamIn flight

Watch with friends, in the same launcher

NexusIn flight

The realtime substrate

MessagingIn flight

DMs, channels, threads, broadcasts

NotificationsLive

Local-first inbox

PresenceLive

Sticky, debounced, restored