MeshLine  ·  offline mesh communication

When everything else goes down, your phone still talks.

MeshLine hops emergency messages directly between nearby phones over Bluetooth LE — no cell tower, no internet, no SIM, no server, no account. Every packet is signed before it is read. Every private word is end-to-end encrypted, including the ones your phone carries for a stranger.

0servers, accounts, or analytics
8hops before a packet is dropped
Noise-XXmutual handshake, Ed25519-bound
100%on device, including the history

The failure nobody plans for

A disaster does not only take the roads. It takes the towers. And the moment a tower is gone, a phone with a full battery and a clear line of sight to a hundred other phones becomes a torch. MeshLine gives those phones back to each other — directly, one to the next, until a message reaches somebody who can act on it.

How a message travels

Every phone in range is a relay.

You
SOS signed
Stranger
verify · relay
Neighbour
ttl 6 · carried
Shelter
duplicate dropped
Responder
read
01 · sign 02 · verify 03 · carry 04 · dedupe 05 · arrive

Nothing is trusted on arrival. Each phone checks the sender's Ed25519 signature before anything else touches the packet, drops what it has already seen, decrements the hop count, and passes on what is left. A relay carries ciphertext it cannot read, and cannot alter a packet without invalidating it.

The app

One button that means help.

Write what happened, tap once. The SOS is broadcast in the clear — deliberately, so any stranger in range can read it and come — with your coordinates attached if a fix is available, and one-tap phrases for when your hands are shaking. Proof-of-work keeps the channel from being flooded.

Private words stay private.

Direct chats run a mutual Noise-XX handshake, with each side's key signed by a long-lived mesh identity. Groups get a key delivered inside an already-established pairwise session, so nobody joins without a completed handshake. Until you compare safety numbers in person, the app says unverified rather than showing you a tick.

Water, shelter, hazards — signed.

Every pin carries its own creator signature and an expiry, verified independently of whichever phone relayed it. They are listed by distance and true bearing rather than drawn on a map, because a fabricated basemap in a disaster app is an invitation to navigate by it.

See exactly who is carrying for you.

The radar plots only devices that have exchanged authenticated packets with this phone, at their measured signal strength. An empty radar means an empty radar. And when a device has to be surrendered, panic wipe destroys every session key, group key, and stored message — while keeping the identity your verified contacts recognise.

relay active
ttl 8 → 0
noise_xx ok
MESHLINE3 devices
Emergency broadcast
Send an SOS
Phone to phone, no tower and no internet
Two people trapped, second floor, need medical help
People trappedMedical helpFire
SEND SOS
Your position12.9716, 77.5946
Devices in range3
Secure coreActive
Carrying for the mesh4 packets
MESHLINE3 devices
Mesh chat
Ward 4 crew
Private group · encrypted to 5 members
PublicWard 4 crewnode-7f2c
Tanker reached the school gate.10:42 · encrypted
Copy. Sending two people over now.10:43 · encrypted · relayed
Second floor stairwell is blocked — go round the east side.10:44 · encrypted
Message
MESHLINE3 devices
Signed resource pins
What is around you
Bearings from 12.9716, 77.5946
Water tanker at school gatesigned by 7f2c9a13
180 m
NE
Dry shelter, community hallsigned by a41f0b77
420 m
E
Medical post, 2 nursessigned by 09be4d21
1.1 km
SW
Bridge road impassablesigned by 5c7a2e08
640 m
N
MESHLINE3 devices
Mesh radar
Who is carrying for you
Devices exchanging verified traffic
node-7f2c9a13verified
node-a41f0b77unverified
node-09be4d21verified

Inside one packet

Four layers, checked in that order.

  • 01

    Signature

    Ed25519 over the immutable header and payload. Packet::verify() runs before any other processing on receive — nothing unsigned reaches a parser.

  • 02

    Identity binding

    sender_id must equal SHA-256(pubkey)[..16], so an attacker cannot attach their own key and claim to be somebody else.

  • 03

    Mutable header

    TTL and flags are excluded from the signed bytes, because relays have to change them. Signatures therefore survive every hop untouched.

  • 04

    Ciphertext

    ChaCha20-Poly1305 under a Noise-XX session, or XChaCha20-Poly1305 under a group key. The relay carries it; the relay cannot read it.

Signature64 bytes · Ed25519
Sender identity32-byte key · 16-byte id
Mutable headerttl · flags · unsigned
CiphertextAEAD · opaque to relays

The security model

The mesh is a hostile medium.

Anyone in radio range can transmit anything. So MeshLine treats every arriving byte as an attack until it proves otherwise — and refuses to send at all rather than fall back to plaintext.

Authenticity

Verify before anything else

Signature, then freshness window, then proof-of-work, then rate limit — in that order, on every packet, before a single field is acted on.

Confidentiality

Noise_XX_25519_ChaChaPoly

Each side's Noise static key is signed by its mesh identity, so a session is bound to a known node rather than to whoever answered.

Groups

No membership without a handshake

The group key travels inside an existing pairwise session. Removing a member rotates the key and bumps the epoch, so they can read nothing sent afterwards.

Replay

Nonces, windows, and an LRU

Per-message nonces with a sliding window, a duplicate cache, and a freshness bound — so a recorded packet cannot be played back into the crowd.

At rest

Hardware-backed, and destroyable

Identity, session keys, group keys, and history are sealed under Android Keystore keys and excluded from backup. Panic wipe removes all of it in one action.

Pre-auth input

Bounded on every axis

Fragment reassembly happens before a signature can be checked, so it is capped by count, size, concurrency per peer and in total, and by a timeout. A noisy peer cannot evict a quiet one's part-built packet.

Being straight about this

What MeshLine will not do.

A longer feature list would be easy to write. These are the things you would otherwise assume while standing in the middle of an emergency, so they are stated here, in the app, and in the store listing.

It is not a satellite messenger

Bluetooth LE only in this release. Range is tens of metres, extended only by other phones running MeshLine. No LoRa, no Wi-Fi Direct.

Delivery is best effort

Nothing guarantees an SOS reaches anyone. With no phone in range your message waits on your device and goes out the moment one appears.

A public SOS is readable by anyone

Deliberately. That is exactly what lets a stranger in range act on it. Private chats and groups are encrypted; a distress broadcast is not.

First contact is trust-on-first-use

An attacker present at the very first handshake is authenticated to both sides. Comparing safety numbers in person is the only thing that detects it, which is why the app keeps asking.

Traffic analysis is not defeated

A group's messages carry a tag derived from its key. It is opaque and rotates on rekey, but within an epoch an observer with a radio can count a group's traffic.

There is no offline basemap

Pins give distance and true bearing rather than a map. Shipping a fabricated basemap in a disaster app invites someone to navigate by it.

The measure of it

0

hops before a packet is dropped — roughly seven devices between you and the far end.

0

servers, accounts, trackers, or analytics. Nothing to breach, because nothing is collected.

0

digits in a safety number, compared in person, because that is what a radio cannot do for you.

0

most recent messages kept, encrypted under a hardware-backed key, and wipeable in one action.

Carry it before you need it

Install it on a calm day.

MeshLine is only as strong as the number of phones running it nearby. It costs nothing to carry and asks nothing of you until the day it matters — no account, no sign-in, no network. Android 8.0 and above.

Built in India by Prahari Labs