Read receipts

Sync read state across a user's own devices. When a user reads a message on their phone, their tablet and laptop can clear the same unread badge. The platform stays out of your way: your app decides when a message counts as read, the relay never infers it.

How it works

  1. Your UI decides a message has been read (scrolled into view, conversation opened, whatever your product means by "read").
  2. You call markRead(messageId, conversationId?).
  3. The relay forwards the receipt to that user's other devices, and only those devices. It is never sent to the message's sender, and the server stores no read state.
  4. The other devices receive it via onReadReceipt and clear whatever unread count or badge your app maintains for that message.

What the platform does not do

DropOnAir does not compute unread counts, does not auto-mark messages read, and in this release does not notify the sender that a recipient read their message. Those are product decisions left to you. Unread counts live entirely in your client.

Quick start (JavaScript)

// When YOUR UI decides the message is read
client.markRead(messageId, peerUserId);

// On the user's other devices
client.onReadReceipt(e => {
  // e.messageId was read elsewhere - clear your unread state
});

Turning it off

Read receipts are a capability, not a mandate. The app owner can switch them off in the dashboard under App Settings; when off, the relay silently drops the receipt and other devices simply never see it. Your markRead() calls stay harmless no-ops.

Compatibility

Requires SDK 0.11.0+ on JavaScript, Android, and iOS (PROTOCOL_VERSION 6). Verify via GET /api/info: the features array includes "read_receipts".