Skip to main content
Both react and reply live directly on an incoming message. They no-op silently on platforms that don’t support the feature — no try/catch required. Spectrum also exports first-class reaction(), reply(), and unsend() content builders that you can pass directly to space.send(...) — the sugar methods on message delegate through the same send pipeline.

Reactions

Both forms are equivalent — message.react(emoji) delegates to space.send(reaction(emoji, message)) internally. Reactions resolve to a — keep it as the handle to unsend() later. Resolves undefined only when the platform does not support reactions. Use the universal aliases for iMessage’s native tapbacks:
reaction() rejects reaction messages as targets — reacting to a reaction throws at build time. The iMessage tapback aliases are:

Threaded replies

Both forms are equivalent — message.reply(content) wraps each content item in reply(content, message) and delegates to space.send(...) internally. On platforms with thread support (iMessage, WhatsApp Business), this sends a threaded reply. On platforms without, the call resolves as a no-op — the reply is not downgraded to a regular send. If you need guaranteed delivery, use space.send(...) instead. reply() cannot wrap reply, edit, reaction, group, typing, rename, avatar, addMember, removeMember, leaveSpace, unsend, or read content — the builder throws at construction time.

Editing messages

edit() takes new content and the outbound message to rewrite. Edits are fire-and-forget — space.send(edit(...)) resolves to undefined. edit() cannot wrap edit, reply, reaction, group, typing, rename, avatar, addMember, removeMember, leaveSpace, unsend, or read content.

Unsending messages

Unsends retract a previously-sent outbound message. Fire-and-forget — the result is always undefined. Only outbound messages can be unsent; the builder throws at build time for inbound targets. Reactions can also be unsent — keep the returned by react() and pass it to unsend():

When to use what

space.send is the safe default — it works on every platform. The sugar methods (message.reply, message.react, message.edit, message.unsend) and the canonical content builders (reply(), reaction(), edit(), unsend()) are interchangeable — they both route through the same send pipeline.