Gatherings
A gathering is a coordination space — somewhere people are invited, gather, mark themselves ready, and optionally kick off a transcribed session. It’s pure backend: tables and API endpoints, not a 3D world.
There are three types, each tuned to a different scenario.
The three types
Lobby
For game matchmaking and parties. Players join, mark themselves ready, and the host starts the gathering — which can auto-create a session so the bot joins the moment play begins.
Appointment
For scheduled meetings. An appointment has startsAt / endsAt, sends email invitations
with .ics calendar attachments, and can autoStartSession so it becomes a live,
transcribed call at the scheduled time.
Open
Always-on, drop-in social spaces. People come and go using a join code; the space can be listed (public) or unlisted.
Members & invitations
A gathering separates who was invited from who is currently in it:
- Invitations (
gathering_invitations) are the source of truth for reaching people by email — including invitees who never sign in. This is what you’d use to email a summary afterwards. - Members (
gathering_members) track current state with a simple lifecycle:invited→joined→ready→left, plus a role (owner/member).
See Sessions & Gatherings for why invitation, membership and session attendance are tracked separately.
Join codes
Every gathering has a short join code people can use to join — handy for sharing a
lobby or open space. Codes are alphanumeric and normalized (case-insensitive, hyphens
optional), so ABCD-1234 and abcd1234 resolve to the same gathering.
Email invitations
When you invite people by email, Cortex sends a branded invitation. For appointments it
includes a standards-compliant .ics attachment so the event lands in the recipient’s
calendar, with a recording notice when autoStartSession is enabled.
Invitation emails are sent fire-and-forget — a delivery problem for one recipient never blocks creating the gathering or inviting others.
Lifecycle events
Gatherings emit a rich set of domain events you can react to over webhooks, SSE or functions — for example:
gathering.created,gathering.started,gathering.ended,gathering.cancelledgathering.member.joined,gathering.member.ready,gathering.member.leftgathering.invitation.sent,gathering.invitation.accepted,gathering.invitation.declined