Four states, one clear story
Most messaging apps blur the distinction between “left your phone” and “actually arrived on someone else’s phone”. That’s fine when everyone’s online — but it isn’t useful when one of you is on a train, or in a tunnel, or just happened to close the app.
Shoal tells you exactly which step a message has reached:
- Queued. The message is on your device, encrypted and ready to go, but your phone hasn’t been able to talk to the server yet. We’ll send it as soon as you’re back online.
- Sent. The server has the message. It’s now waiting for the recipient’s device to come online and collect it.
- Received. The recipient’s device has the message. They haven’t necessarily opened it yet, but it’s on their phone, ready to read.
- Read. The recipient has actually opened the conversation and seen the message.
You see a single icon that updates as each state is reached.
Why this matters for families
A “sent” tick that meant nothing more than “your phone has the message” used to drive parents and kids quietly mad. Did they get it? Why aren’t they replying? Should I send it again? Shoal’s statuses cut through that. Queued means your phone hasn’t reached the server. Sent means the server hasn’t reached them. Received means they have it and chose not to reply yet. There’s no ambiguity left to fill in with worst-case assumptions.
How it works under the hood
A small per-message-per-recipient state record lives on the server. When the recipient’s device confirms it has the message, the record is updated; when the recipient opens the conversation, the record is updated again. The sender’s bubble shows the lowest state across non-sender participants — so in a group, “received” means everyone has it, not just one person.
Because the underlying record is per recipient, the same model works cleanly for one-to-one and group conversations. No special-casing.
How this fits with the rest of Shoal
Message statuses pair naturally with offline support. A message you send while the kitchen Wi-Fi is being moody sits in the queued state on your device until the connection comes back, then walks through sent, received, and read like any other message. Nothing is lost; nothing is sent twice.