WiBChat Mesh

Offline mesh messenger · Android (API 26+)
QR code linking to this download page
↓ Download APK
https://wibchat.198-251-72-41.nip.io/app-debug.apk

WiBChat Mesh turns a group of Android phones into a small network of their own. Each phone finds the ones near it over Bluetooth Low Energy, and every phone passes on the messages it receives — so a message can hop phone to phone until it reaches someone standing several devices away. There is no internet connection, SIM card, account or server in the middle: the phones are the network, which is what makes it work exactly where an ordinary messenger does not.

Install steps
  1. Tap Download APK above (or scan the QR).
  2. If prompted, allow installs from this browser/source.
  3. Open the downloaded file and tap Install.
  4. Grant nearby-devices / Bluetooth / notification permissions on first launch.
Version: 0.1.0-debug
Built: 2026-10-08 14:40:44 UTC-04:00
Size: 22.79 MB
SHA-256: b1e0e41dc19ff110bb6e859ad280e2e2144e73a448c293305bf6d8bd1ff1189f
Debug build — for testing. BLE & Wi-Fi Direct need a physical device (emulators unsupported).

What WiBChat Mesh is

WiBChat Mesh is an offline chat app for Android. It is built for the situation where there is no working mobile network at all — a blackout or disaster, a crowded venue where data collapses, a large building with no Wi-Fi, a trail far from any mast — but the people who need to reach each other are standing within radio range of one another.

The phones do the routing themselves. WiBChat keeps a live list of the devices around it, opens a one-to-one chat with any of them, and re-broadcasts what it hears so that messages travel further than a single Bluetooth link could carry. Nothing is uploaded anywhere: every conversation lives only in a local database on the phone that sent it and the phones it reached.

No internet needed

Runs in airplane mode over Bluetooth Low Energy, with Wi-Fi Direct as an optional second radio.

No account, no sign-up

No phone number, e-mail or password. Your identity is a key generated on the device itself.

No server in the middle

Messages are stored and forwarded phone to phone, never routed through a data centre.

Multi-hop relay

A message can travel up to 10 hops through other phones to reach someone outside your range.

What it is not: a replacement for an ordinary messenger when you have signal. There is no central history, so it cannot sync across your devices, and it can only reach people whose phones are inside the same mesh.

What it does

People & conversations

Keeping it under control

How a message travels

flowchart TD
  A["Phone A
writes a message"] -->|"hop 1"| B["Phone B
relays it"] B -->|"hop 2"| C["Phone C
receives it"] C -->|"hop 3"| D["Phone D
out of A's range"]
You do not have to stand next to someone to reach them — the phones in between carry the message, and the hop count on the bubble shows how far it went.
  1. Discover — every phone advertises itself and scans for others. The same phone seen over both Bluetooth and Wi-Fi Direct is shown once, with both radios merged.
  2. Save, then send — a message is written to the phone's database before it goes out, so a failed send is never lost.
  3. Relay — every phone re-broadcasts what it receives, up to 10 hops. That is what lets you reach someone you are not standing next to.
  4. Drop duplicates — each phone remembers recently seen message ids (up to 4,096 of them, for 30 minutes) so the same message does not bounce around the mesh forever.
  5. Retry — anything still marked PENDING is sent again every 15 seconds until it lands.
  6. Verify at every hop — each packet carries the sender's public key and a signature, and every relay checks it, so a message cannot be forged, altered or redirected in transit.
The hop count is shown on each message, so you can see how far a delivery actually travelled. If a message never arrives, it is usually because there is no chain of phones bridging the gap between the two of you.
flowchart TD
  S["You type a message"] --> P["Saved on the phone as PENDING"]
  P --> B["Broadcast over Bluetooth LE"]
  B --> H{"Any phone in range?"}
  H -->|"no"| R["Retry every 15 seconds"]
  R --> B
  H -->|"yes"| V{"Signature valid?"}
  V -->|"no"| X["Dropped: it cannot be forged"]
  V -->|"yes"| D{"Message id seen before?"}
  D -->|"yes"| Y["Dropped: duplicate"]
  D -->|"no"| K["Stored as DELIVERED"]
  K --> F["Re-broadcast, hop count + 1"]
  F --> T{"Under 10 hops?"}
  T -->|"yes"| B
  T -->|"no"| Z["Stop: hop limit reached"]
        
What happens on every phone between pressing send and the hop budget running out. Nothing is held centrally, so a phone that is switched off simply misses its turn to carry it.
Diagrams unavailable. The two pictures above need one small script from a CDN, which this network did not allow. The same thing in words: Route — Phone A → (hop 1) Phone B relays → (hop 2) Phone C → (hop 3) Phone D, out of A's range. Delivery — saved as PENDING → broadcast over Bluetooth LE → signature checked at every hop → duplicates dropped → stored as DELIVERED → re-broadcast with hop count + 1 → retried every 15 s → stops after 10 hops.

Where it is useful

Emergencies & disasters

When towers or power are down, a street or a shelter can still be a working network.

Events & festivals

Crowds overload mobile data. A mesh keeps the group in touch anyway.

Remote & off-grid work

Farms, boats, mines, survey teams and hiking groups — anywhere with no coverage.

Big buildings

Warehouses, basements, car parks and sites with no Wi-Fi or persistent dead spots.

Schools & campuses

Share a channel by password and run a class or a club with no infrastructure at all.

Travelling

No roaming charges and no local SIM: a group of travellers stays reachable.

Privacy-sensitive groups

No server holds the messages, so there is nothing central to leak or hand over.

Demos & research

A working multi-hop mesh in your pocket, with hop counts and receipts you can show.

Tips & things to do first

  1. Install it on at least two phones. A mesh of one has nobody to talk to. Three phones is where the interesting part starts, because the middle one becomes a relay.
  2. Switch Bluetooth on everywhere. It is the default radio and the one that carries the mesh; Wi-Fi Direct is optional on top of it.
  3. Grant the permissions on first launch. The app asks for nearby devices (Android 12+), location (Android 12L and older, which Android requires for Bluetooth and Wi-Fi scanning), nearby Wi-Fi devices and notifications (Android 13+), and the microphone for voice notes. If you tapped don't allow, re-grant them under Settings > Apps > WiBChat Mesh > Permissions.
  4. Whitelist the app from battery optimization (Settings tab → Whitelist from battery optimization). Without it Android may stop the mesh when the screen is off and messages sit at PENDING. On Xiaomi, Huawei, Oppo and Samsung phones also set the app to Unrestricted / Don't optimize and allow autostart.
  5. Watch the notification. WiBChat Mesh active · Connected peers: N is the fastest health check. If it reads 0 while people are standing next to you, permissions or Bluetooth are the usual culprits.
  6. Stay close, then bridge the gap. Bluetooth LE reaches roughly 10–30 m in the open, less through walls. To reach someone further away, put a third phone in between — it forwards the message automatically, and the hop count on the bubble shows how it went.
  7. Empty People list? Check that Bluetooth is on, permissions are granted and both phones are awake with the app running, then start a fresh scan from the app. Toggling Bluetooth off and on also forces rediscovery. Discovery is continuous, but it takes a few seconds to settle.
  8. Pick the right radios. Settings → Radios: Both gives the best discovery and reach, Bluetooth only is the kindest to the battery, and Wi-Fi Direct works with Bluetooth switched off but loses multi-hop relaying, because there is only one Wi-Fi Direct group at a time.
  9. Put a password on any channel you care about. A public channel is not encrypted. With a password its traffic is encrypted with a key derived from that password through Argon2id (AES-256-GCM), and only the salt plus a non-secret key check travel over the air. Share the password out of band — and note that it cannot be changed or revoked, because anyone who knows it can re-derive the key.
  10. Join a channel before the messages arrive. A channel message that reaches you before you have joined is stored as “Unable to decrypt this message”, and joining afterwards does not decrypt what you already received.
  11. Treat attachments as public for now. Private text chat is end-to-end encrypted and every packet is signed, but attachments and voice notes are not encrypted yet — so send sensitive material as text, not as a file.
  12. Voice notes stop at 60 seconds, and a long recording can exceed what Bluetooth can carry comfortably — the app warns you when that happens. Keep them short, or fall back to text.
  13. Remember that deleting is local. Clearing a chat, or letting the retention window expire, removes this phone's copy and its attachments; other phones keep theirs. A mesh has no central store to delete from.
  14. Turn on app lock (Settings → Security) if the phone is shared or left lying around.
  15. Use real hardware. Emulators have no Bluetooth LE or Wi-Fi Direct, so nothing will ever show up in the People list.
  16. Expect large files to be slow. The mesh floods every message to everyone nearby, so a big attachment competes with all other traffic. Text gets through long before a large video does.

Worth knowing before you rely on it

Requirements

Reporting & blocking. Long-press a person to block them — their messages and connection requests stop reaching you — or to send an abuse report. Reports are signed with your device key and queued on the phone, then uploaded when a connection next appears; they are never sent through the mesh.