←Projects

Nored

2026

An offline messaging app my team and I built at Hack the North 2026 that lets nearby phones send messages to each other over Bluetooth, even without internet or cell service.

React NativeExpoTypeScriptSwiftKotlinSQLiteGitHub

My team and I built Nored at Hack the North 2026 to explore how phones could communicate without relying on the internet or a central server. We worked on an app where phones connect over Bluetooth and pass messages between each other. A phone can store a message and forward it later when another device comes into range, allowing it to reach someone who was never directly connected to the original sender.

The same approach works for emergency alerts, so messages can travel across multiple devices without requiring everyone to be within Bluetooth range of each other.

The mesh

Each phone acts as both a Bluetooth LE central and a peripheral, meaning it can discover other devices and accept connections from them. We built a custom Expo native module to handle Bluetooth discovery and GATT communication, using Swift on iOS and Kotlin on Android.

The routing logic is shared in TypeScript. It handles storing packets, forwarding them to other devices, retrying delivery, and tracking acknowledgements.

Who is in range
Aria
Sam
You
Riley

You, Aria, and Sam are in range. Riley is not.

01/06
A link is whoever is in Bluetooth range at that moment. Each phone is both a central and a peripheral. It stores the text and passes it on when another phone shows up. Packet IDs drop duplicates.

Messages use a store-and-forward approach. Once you save someone as a contact, you can send them a message even if they are not nearby. Another phone can pick it up, store it, and pass it along when it gets the chance to connect to the recipient.

Devices also exchange lists of packets they already have, so they do not keep sending the same messages. Each packet has an ID to prevent duplicates, along with a hop limit and expiry time to stop old messages from circulating indefinitely.

Store and forward
Maya
You
Sam
QueuedSendingCarryingDelivered

You meet Sam and save them as a contact.

01/07
Carrying means Maya stored the packet. Delivered means Sam's acknowledgement made it back to you. She never opens the text. A phone confirms a packet only after SQLite has committed it.

We also gave different message types different delivery limits. Direct messages and group messages can travel up to five hops and remain valid for 24 hours. Emergency alerts such as INFO, HELP, and DANGER get priority, can travel up to ten hops, and expire after six hours.

How far a packet can go
Text and group membership get five hops and 24 hours. Alerts go out first, with ten hops and a six-hour expiry. Photos and voice notes need a direct connection, so they stay on one hop.

Other features

We also added support for photos and voice notes, although these require a direct Bluetooth connection rather than being forwarded through the mesh.

Voice notes can be transcribed directly on the device using a bundled, quantized Whisper model. They can then be translated into English, French, or Hindi.

There is also a view showing nearby peers and the route a message took to reach its destination. We added Chess, Pong, and drawing telephone as well, all using the same Bluetooth connection and transport layer.

Our repository also includes an experimental ESP32-C3 badge relay. We wrote custom firmware that lets a Hack the North badge act as a bridge between two phones over BLE and display recent alerts. The badge also hosts a local Wi-Fi page where new alerts can be submitted.

Implementation

The app is built with React Native and Expo SDK 57, with most of the application logic written in TypeScript. Messages and relay packets are stored in SQLite, while the native Bluetooth modules handle communication on each platform.

From the chat to the radio
Chat & alerts
Text, groups, and alerts
Mesh router
Forward, dedupe, and acknowledge
SQLite & scheduler
Commit the packet, then prioritize
Bluetooth LE
Swift on iOS · Kotlin on Android

You send a text, or an alert.

01/07
Chat, alerts, and acknowledgements go through one router and one priority scheduler. The iOS and Android Bluetooth modules carry the bytes.

Because of the custom native modules, the app needs to run as a development or release build. It cannot run through Expo Go.

Nored is still a hackathon prototype. The app needs to stay in the foreground, message delivery is best-effort, and messages are not encrypted yet. Adding authenticated end-to-end encryption is one of the next things we want to work on.