Build a messenger on Ollacore
Ollacore gives you the server half of a chat and calling product: durable ordered messaging, an SFU for multi-party audio/video, end-to-end-encryption transport, push, and optional turnkey phone-OTP identity. You build the clients.
Orientation #
Three things explain most of the design:
- A room is the only primitive. Direct messages and groups are both rooms; calls happen in rooms; permissions are per-room. There is no separate "conversation" object.
- Tokens are room-scoped and short-lived. A client credential authorises one principal, in one room, for minutes — not blanket account access. Minting them is a server-side (or directory) operation.
- Durability comes before delivery. A message is committed to PostgreSQL and assigned a monotonic per-room sequence before it is fanned out, which is what makes gap-free reconnection possible.
Where to go #
Integration checklist
The full ordered sequence for chat, calls and push — plus what to verify before shipping.
Architecture
What runs, what stores state, and how an event travels from send to every device.
Authentication planes
Five credential types, what each may touch, and which ones must never reach a client.
Audio & video
SFU signalling, trickle ICE, re-offers, screen share, multi-device, and call events.
Push & ringing
Web Push, native FCM/APNs with your own credentials, and how offline devices get rung.
Turnkey identity
Phone-OTP signup, contacts, conversations and the inbox — a messenger without an app-server.
API reference
All 81 HTTP operations grouped by plane, with the credential each one takes.
Conventions #
- All endpoints are versioned under
/v1. The contract is additive-only, with a 90-day deprecation notice signalled byDeprecationandSunsetheaders. - Identifiers are UUIDs unless stated.
principal_idis an opaque string you choose (or, on the directory path, the directory user's UUID). - Errors are a JSON object with
codeandmessage— see Errors & rate limits. - Timestamps are RFC 3339 UTC.
- Machine-readable contracts: OpenAPI for HTTP, AsyncAPI plus a JSON-Schema bundle for the sockets. Both are kept in lockstep with the router by a parity check that fails the build.