Realtime · Socket.IO

Custom channels

Broadcast named event to project

javascript
socket.emit("custom:broadcast", {
  projectId: "6958511e8397f2dfa88090d8",
  event: "board_updated",
  payload: { columnId: "done", cardId: "x" },
})
socket.emit("custom:broadcast", {
  projectId: "6958511e8397f2dfa88090d8",
  event: "board_updated",
  payload: { columnId: "done", cardId: "x" },
})

Others receive event name custom:board_updated:

json
{
  "columnId": "done",
  "cardId": "x",
  "sender": "69566c4cf0bdc3ae3e81b108",
  "timestamp": "2026-03-18T10:00:00.000Z"
}
{
  "columnId": "done",
  "cardId": "x",
  "sender": "69566c4cf0bdc3ae3e81b108",
  "timestamp": "2026-03-18T10:00:00.000Z"
}

Legacy passthrough

javascript
socket.emit("custom:event", {
  projectId: "6958511e8397f2dfa88090d8",
  foo: "bar",
})
socket.emit("custom:event", {
  projectId: "6958511e8397f2dfa88090d8",
  foo: "bar",
})

Others get custom:event: { foo, userId, timestamp }.

Direct message

javascript
socket.emit("custom:message", {
  targetUserId: "69566c4cf0bdc3ae3e81b108",
  message: "Ping",
  type: "text",
})
socket.emit("custom:message", {
  targetUserId: "69566c4cf0bdc3ae3e81b108",
  message: "Ping",
  type: "text",
})