Messaging that
needs nothing.

Operating principle

Encrypted messages moving phone-to-phone over Bluetooth mesh. No servers, no accounts, no internet anywhere in the path.

02End-to-End Encryption

Encrypted before it leaves your hand, opened only in theirs.

On your phone01
Plaintext message
exists only on your device
derive shared secret · x25519
Sealed02
ChaCha20-Poly1305 packet
fragmented to the link MTU
ble hop · relays see ciphertext only
On their phone03
Decrypted in their hand
ack + read receipt ride back

Built on boring, audited primitives

X25519CHACHA20-POLY1305BLE 5.0RUST CORE
Bystanders with a sniffer
See ciphertext and a hop count. Nothing else.
Phones relaying your message
Forward sealed packets they cannot open.
A tampered packet
Fails authentication and is discarded, not delivered.
Voice notes
Recorded, encrypted, and fragmented on your device before the radio ever sees them.
03Mesh Relay

Out of range? The crowd is the route.

Every phone running FLVSH is a relay. Encrypted packets hop through the phones between you and your friend until they arrive — and the receipts hop back.

01
TTL-bounded hops
Every relayed packet carries a time-to-live, so the mesh reaches across a crowd without echoing forever. Each hop is counted — you can see how far the crowd carried your message.
02
Dedup at every node
Relays remember what they've already forwarded and drop repeats, so a dense room amplifies reach instead of flooding itself.
03
Receipts ride the mesh back
Delivery acknowledgments and read receipts hop back along the same mesh, so a sender three phones away still sees Delivered — and Read.

One protocol, both platforms

IOSANDROIDbyte-for-byte compatible over the air
flvsh — relay trace
you → msg 7f3a · encrypted · 214 bytes
  peer out of range — wrapping for relay, ttl=5
  hop 1 → phone “kiko”      FORWARDED
  hop 2 → phone “ari”       FORWARDED
  hop 3 → phone “maya”      DESTINATION

maya → ack 7f3a · riding the mesh back
   delivered in 3 hops — relays saw only ciphertext
Keypair Identity

No phone number. No account. Just a key.

Your identity is an X25519 keypair born on your device. Nobody issued it, nobody hosts it, and nobody can take it away — there is no company in the loop at all.

01
No signup, ever
Open the app, pick a name and an avatar, done. The X25519 keypair is generated on your device in that moment — no phone number, no email, no verification code, no account to create or lose.
02
Profile edits keep your key
Change your name or avatar whenever you like; the keypair underneath never rotates. Your conversations, receipts, and peers survive every identity refresh.
03
Blocking is cryptographic
Block a key and its packets are dropped before decryption. There's no server to appeal to and no new account to evade with — a blocked key is simply noise.
flvsh — first launch
$ flvsh identity create
generating x25519 keypair on this device…
   public key   9f4e…c21a
   private key  never leaves this phone
   phone number not requested
   servers      none contacted (there are none)

$ flvsh profile set --name maya --avatar 👻
   profile updated — keypair unchanged

The same identity core runs in both apps — one Rust library, generated Swift and Kotlin bindings, zero divergence.

05Nothing In Between

Built for rooms with no signal.

Every other messenger is a client for someone's server. FLVSH is the whole system — radio, crypto, storage — running end to end on the phones themselves.

The middleman, deleted

No infrastructure means no outage, no operator, and no collection point. These zeros are the architecture, not a policy.

0Servers in the cloudThere is no backend. Messages route through the phones in the room, never through a datacenter.
0Accounts & numbersIdentity is a keypair generated on device. Nothing to sign up for, nothing to leak.
0 bytesLeave the meshEvery packet lives and dies on the radio between phones. No sync, no backup, no telemetry.

Every message settles

Radio links drop; FLVSH doesn't pretend otherwise. Each send is tracked to a real outcome — acknowledged end to end, or failed loudly with a retry.

Message Lifecycle
msg 7f3a · via mesh
peer: maya3 hopsencrypted · read
Queued on deviceDONE
Written to radioSENT
Peer acknowledgedDELIVERED
Conversation openedREAD
Disappearing timer2H LEFT
06By the Numbers

Everything runs on the phone you already own.

FLVSH needs no plan, no account, and no infrastructure. The radio is in your pocket, the crypto runs on your CPU, and your history lives in a database only you hold.

Servers involved
0

No backend, no broker, no push service, no analytics endpoint. Every byte moves phone-to-phone over Bluetooth — there is nothing else in the path to trust, rent, or subpoena.

Peers per phone
7

Each device holds up to seven simultaneous BLE connections, running server and client roles at once. The mesh multiplies from there, hop by hop.

Bytes per frame
517

Links negotiate the largest MTU both radios support and size every fragment to it, so messages and voice notes cross the air as fast as the hardware allows.

The Stack

Seven layers, zero infrastructure.

From the keypair that is your identity to the SQLite file that is your history, every layer runs on the device in your pocket. Nothing above it, nothing behind it.

  • L1
    Keypair Identity
    You are a keypair, not a phone number
  • L2
    End-to-End Encryption
    Encrypted before it leaves your hand
  • L3
    Bluetooth Transport
    The radio in your pocket is the network
  • L4
    Fragmentation Protocol
    Big messages over a small radio
  • L5
    Mesh Relay
    Friends of friends carry the message
  • L6
    Offline Queue
    Messages wait for the reconnect
  • L7
    Local-Only Storage
    Your history lives on your phone. Full stop.
See the Stack