A messenger with no server: how ShutChat gets a message from one phone to another
Most messengers have a server in the middle. It is where your messages live, and it is also the single place where they can be read, subpoenaed, or quietly deleted when the company loses interest. I wanted to see how far you can get without one. ShutChat is the result: an Android messenger where messages travel directly between devices. No server, no account, no sign-up screen. This is a write-up…
ShutChat is an Android messenger that operates without a server, directly transmitting messages between devices. It has no account system, address book, or sign-up process. Conversations begin with a 24-character invite code, serving as the sole access point. The invite code is 15 bytes long, rendered in Base32 with the Crockford alphabet, preventing confusion with similar-looking characters.
The code consists of a version, expiry day, CRC-16, and an 80-bit rendezvous secret. Two key details are maintained: expiry is stored as a day, not a timestamp, and a checksum is not computed over itself. The messenger utilizes three communication paths: LAN (UDP multicast), Nearby Connections (Bluetooth/Wi-Fi Direct), and MQTT over TLS. The room ID is generated using HKDF from the secret and displayed in clear on every frame header, enabling message relaying.
When a message is intended for an offline user, the relay queue ensures it is not lost. If the recipient does not acknowledge receipt within 30 days or upon room code expiration, the message is marked as failed. The messenger supports direct and group chats, file transfers, media sharing, read receipts, typing indicators, presence, reactions, and more.
However, the relay is always active, and Nearby Connections is Android-exclusive. The project is open-source under the Apache-2.0 license, with the APK available on the project's releases page.
Written by urgent.news from Dev.to's reporting — not their text. Machine-written — may contain errors; check the original before relying on it.