Events
Blixel records an event each time something happens: a call is transcribed,
you join or leave a room, someone else joins, a request goes to an agent.
Hooks run on these events, and blixel event watch prints
them.
Event types
| Event | When |
|---|---|
transcript.started |
Transcription of a call began. |
transcript.ended |
A call's transcript was finished and will not change: you left, quit or switched rooms. |
meeting.joined |
You joined a room. A reconnect is not a new join. |
meeting.left |
You left a room: you left, quit, switched rooms or lost access. |
participant.joined |
Someone else joined the room you are in. Not written for people already there when you joined. |
participant.left |
Someone else left the room you are in. Not written for people still there when you leave. |
handoff.sent |
You sent a request to an agent, yours or someone else's. Written when you send it, whatever happens to it next. |
handoff.received |
Blixel accepted a request for your connected agent, from someone in the call or from you. Written before it is accepted, discarded or delivered. |
blixel event types lists them with what each one carries.
What an event looks like
An event is one line of JSON:
{"after":4812,"at":"2026-10-10T09:31:02.114Z","data":{"transcript_id":312},"id":4812,"room_id":"9f…","subject":"transcript:312","type":"transcript.ended"}
| Field | Meaning |
|---|---|
type |
The event type. |
id |
A whole number, never reused. Later events have larger ids. |
subject |
What the event is about. Every event about one thing shares it: a transcript's transcript.started and transcript.ended, or one meeting's meeting.joined and meeting.left. |
at |
When it happened, in UTC. |
room_id |
The room, as blixel room list names it, or null. |
data |
Ids for the event's type, below. |
after |
Where to resume just past this event. It equals id. |
What each event carries
data holds ids, never names, text or chat. Use them with other blixel
commands to get the details, which may have changed or been deleted since.
| Events | data |
|---|---|
transcript.started, transcript.ended |
transcript_id. Get the transcript with blixel transcript export <id>. |
meeting.joined, meeting.left |
meeting_id, new for every join, as blixel room current shows it. |
participant.joined, participant.left |
meeting_id; participant_sid, the person's connection, new each time they join; participant_identity, who they are, or null when the server gave none. |
handoff.sent |
meeting_id; target_identity, whose agent it went to; source. |
handoff.received |
meeting_id; sender_identity, who sent it; connection_id, the agent connection, as blixel agent status shows it; provider, claude or codex; source. |
source is how the request was made: spoken, typed, or mixed (spoken,
then edited or added to by typing). A request's text is never in an event.
Identities are opaque ids, not names. A request writes handoff.sent on the
sender's Mac and handoff.received on the agent owner's Mac, with the same
subject.
Limits
- If Blixel crashes or is force quit during a call, no
transcript.endedor
meeting.leftfollows, then or later. - Events don't always come in pairs. Someone already in the room when you
joined has aparticipant.leftbut noparticipant.joined. - Events of different types come in no fixed order. Leaving a room writes
meeting.leftandtranscript.endedin either order. - Blixel keeps events for 90 days.
Watch events
blixel event watch --type transcript.ended
blixel event watch --type participant.joined --room <room-id>
blixel event watch prints each event as it happens, one line each, until you
stop it. Name every type you want; there is no "all events". It reads the
events on disk, so it works with Blixel closed, though events happen only while
Blixel is open.
The first line has the type watching. To resume later without missing
anything, pass the after of the last line you finished as --after. See
Script the CLI.