What a wisp hears
Your wisp’s line follows one group, its own, and Woosh puts into it exactly what the grants of
every server it is in allow (with slices, each line hears its share of the servers).
The events are the ones the apps hear, with the same names and keys, and two differences: a
channel’s events carry server first, since your wisp is in many servers, and a member
carries no presence or activity. A grant taken away takes its events with it at once: nothing
outside a grant ever reaches your line.
Always
Section titled “Always”Whatever it was granted, a wisp hears what concerns itself:
| Event | When |
|---|---|
command |
a person ran one of its commands, where it has commands (Commands) |
act |
a person pressed something on one of its cards (Presses and private cards) |
server with new and grants |
it was added to a server |
server with grants |
its grant there changed: an admin changed it, or your wisp stopped asking for something it had |
server.gone |
it is out of a server: removed by an admin, kicked, banned, or the server deleted |
| Event | d |
|---|---|
server |
id, name, icon?, owner, unread? (mark when its members see marks rather than counts for what they have not read), new?, grants? |
server.gone |
id, why, name? (the server’s name; left out when deleted) |
Added to Saturday Squad, hearing the server’s shape and the lines of #general, and allowed to
post and offer commands there:
{ "c": 61, "n": 106, "t": "server", "d": { "id": "5c3b1a2d-8e4f-4a6b-9c7d-0e1f2a3b4c55", "name": "Saturday Squad!", "owner": "3f1c9a52-6d1e-4c8b-9a51-2b7e0c4d8f11", "new": true, "grants": {"hears":["shape","messages"],"does":["post","commands"],"channels":["6d4c2b3e-9f5a-4b7c-8d6e-1f2a3b4c5d66"]} }}grants is whole every time: hears and does list what it has (left out: none), and
channels the channels it may hear and act in (left out: every channel, those made later too).
Its server permissions are not in it: they sit on the role made for your wisp (Permissions).
Later, an admin let it react as well, everywhere:
{"c":61,"n":120,"t":"server","d":{"id":"5c3b1a2d-8e4f-4a6b-9c7d-0e1f2a3b4c55","name":"Saturday Squad!","owner":"3f1c9a52-6d1e-4c8b-9a51-2b7e0c4d8f11","grants":{"hears":["shape","messages"],"does":["post","react","commands"]}}}Taken out by an admin. Nothing more of the server reaches the line; treat any server.gone as
the end of that server for your wisp:
{"c":61,"n":140,"t":"server.gone","d":{"id":"5c3b1a2d-8e4f-4a6b-9c7d-0e1f2a3b4c55","why":"removed","name":"Saturday Squad!"}}By grant
Section titled “By grant”| Grant | Events | For |
|---|---|---|
shape |
channel, channel.gone, layout, roles, emoji, emoji.gone, and server when the server itself changes |
keeping a map of the server |
members |
member, member.gone, member.roles |
welcomes, auto-roles, logs |
messages |
message, message.edit, message.gone, reaction |
levels, moderation, replies |
voice |
nothing yet |
shape and members cover the whole server, whatever channels the grant names. messages
covers only the channels it names.
| Event | d |
|---|---|
channel |
id, server, name, type? (voice; left out: text), new? (just made) |
channel.gone |
id, server |
layout |
server, nodes?: the order of channels and sections, each type (channel, section), id, name?, children? (each type, id) |
roles |
server, roles: every role, highest first, each id, name, color?, permissions?, admin?, position?, default?, hoisted? |
emoji |
id, server, name, url, serverName |
emoji.gone |
id, server |
layout and roles are whole after any change, so replace yours with them.
members
Section titled “members”| Event | d |
|---|---|
member |
server, user, name?, avatar?, avatarColor?, banner?, bannerColor?, status?, flags?, joined, roleIds? |
member.roles |
server, user, roleIds? (the whole list; left out: none) |
member.gone |
server, user: they are out of the server, however they went |
status is the person’s own words, and flags marks on the account, as bits: 2 is a wisp.
dani joins:
{"c":61,"n":114,"t":"member","d":{"server":"5c3b1a2d-8e4f-4a6b-9c7d-0e1f2a3b4c55","user":"e1f7a3c5-9d4b-4a2e-b8c6-5f0e3d2a7144","name":"dani","avatar":"639198830442210985","avatarColor":"#06d6a0","bannerColor":"#14b8a6","joined":1791915000004271}}A member never carries presence or activity: Woosh takes both off before your wisp hears it.
messages
Section titled “messages”| Event | d |
|---|---|
message |
server, id, channel, parent? (the thread, for a thread reply), author, name?, avatar?, text?, at, edited?, reply?, files?, imported?, card?, run? |
message.edit |
server, id, channel, parent?, text?, files?, edited?, card?, run?: what it holds replaces the line’s |
message.gone |
server, id, channel, parent? |
reaction |
server, message, channel, parent?, emoji, user, name? (on an add), on? (left out: taken off) |
A line’s parts:
reply: the line it answers, as it was then:id,author?,name?,text?.files: 1 to 10, eachid,url,name?,type?,mb?,w?,h?,expires?.card: a wisp’s card.run: the run a wisp’s line or edit answers:id,user,name?, andcommandfor a command’s answer (left out for a press’s).imported: on a line brought over from another app when its server was copied into Woosh, the name it had there. Such a line has noname, and itsauthoris not a person.
ana’s line, as your wisp hears it:
{ "c": 61, "n": 107, "t": "message", "d": { "server": "5c3b1a2d-8e4f-4a6b-9c7d-0e1f2a3b4c55", "id": "0199de8f-6c10-7a1b-8c3d-4e5f6a7b8c01", "channel": "6d4c2b3e-9f5a-4b7c-8d6e-1f2a3b4c5d66", "author": "3f1c9a52-6d1e-4c8b-9a51-2b7e0c4d8f11", "name": "ana", "avatar": "639201477315520417", "text": "Bora jogar às 21h? :wave:", "at": 1791914412304271 }}A wisp never hears its own new lines or reactions back, its answers to runs among them: it knows
what it did. It does hear message.edit and message.gone for its own lines, as for anyone’s,
and every other wisp’s lines.
Avatars
Section titled “Avatars”avatar is a short key, not an address. Build the address from it, media from your last
ready, and the id it sits beside (user, or author on a line):
| The key | The address |
|---|---|
holds :// |
the key itself |
| digits only | <media>/<user>?v=<key> |
| anything else | <media>/default-avatars/<key>.png |
No key: the person has no picture.
Under no grant does a wisp hear typing, presence, read marks, digests, anyone’s inbox, or lines
between people in DMs. Nor does it hear what goes to people’s apps alone: asides, card.live
frames (a tally’s count moving among them) and commands.
Your wisp’s own presence is kept for it: it shows online while one of its lines is up. Its words are yours to set, though the apps do not draw them yet (Your wisp’s words).
© 2026 Woosh AS. All rights reserved.