← All projects
Jonaki
JH26-4J0NEbaro_Hobe_Na · Dhaka · International University of Business Agriculture and Technology · 2 members · Crisis Tech
Messaging, SOS and disaster mapping that keep working when the internet dies. Phones relay for each other: no tower, no SIM, no servers.
The problem
In July 2024 the government shut off Bangladesh's internet. Mobile data went first, then broadband. For days people could not reach family, confirm who was safe, or learn which streets to avoid.
The most affected people were ordinary residents: a mother trying to reach a son who had gone out, neighbors deciding whether the road to the hospital was passable, students cut off from families in other districts.
The same failure arrives without politics. Every monsoon, floods take out power and towers across Sylhet and Chattogram and other rural areas. In both cases the phone in your pocket becomes a torch and a clock, nothing more.
Existing tools assume the network survives. Messaging apps need data. Emergency numbers need a working tower. When the infrastructure is the thing that failed, all of them fail with it, precisely when coordination matters most.
What people need in those hours is narrow: tell someone you are alive, call for help, and know which roads are blocked. None of that inherently requires the internet. It only requires other people within a few hundred metres.
The solution
Jonaki turns nearby Android phones into their own network.
Every phone runs one store-and-forward pipeline. When two phones come within range they exchange lists of message IDs over Bluetooth or Wi-Fi, then send only what the other is missing. Each phone relays for every other phone, so a message travels from A to D through B and C even though A and D were never near each other. The app shows the hop count, so you can see it happened.
Anything with nowhere to go waits. Walk within range of someone and the messages start forwarding again. A person travelling between two cut-off areas carries messages between them without doing anything.
Four features ride that single pipeline.
Global chat reaches everyone the mesh reaches, hops included. Personal chat is end-to-end encrypted with X25519 and AES-GCM: relays carry the message but cannot read it. Keys are exchanged automatically when phones meet, then pinned, so a later key claiming the same identity is refused and the conflict is shown to the user.
SOS is one button. It sends the emergency type, location, a note and battery level, relayed ahead of all other traffic. Receiving phones take over the screen with a bright red alert. Location never blocks the send: a recent cached fix, else a live fix with a five-second timeout, else no coordinates, labelled honestly, because a cold GPS fix indoors takes minutes. An "I'm safe" cancel exists, and only the original sender's cancel is honoured.
An offline map with real street tiles bundled into the app carries community reports like road blocked, fire, shelter, medical camp, food, water, charging, danger, or a custom pin. Reports spread through the same pipeline and gain confidence as others confirm them. The tile layer has no network URL, so the app cannot quietly reach the internet for imagery.
Every message is signed with Ed25519. Altered messages are dropped and never relayed. A valid signature earns a relay whether or not the sender is known, because phones must forward for strangers or there is no mesh.
Encryption hides the text, not that a message exists or who it is addressed to. There is no forward secrecy. SOS is plaintext by design, since a distress call only one person can read is worse than useless.
163 automated tests cover the logic, including a four-node simulation proving a message crosses a chain whose ends never meet.
Tech stack
Language / framework: Flutter 3.44, Dart 3.12, Android only (minSdk 23, targetSdk 34)
Networking: Google Nearby Connections API (nearby_connections)
Cryptography: cryptography package — Ed25519 signatures, X25519 key agreement, HKDF-SHA256, AES-256-GCM.
Storage: sqflite (SQLite) for messages, reports, confirmations and cancellations. shared_preferences for nicknames and settings.
Maps: flutter_map with a hand-written MBTiles reader. Tiles from Stadia Maps.
Device: geolocator, battery_plus, permission_handler, wakelock_plus, path_provider
AI tools used (section 5 disclosure)
Puku AI
Gemini