We will be undergoing planned maintenance on Oct 7th 6:00AM UTC / Oct 7th 2:00AM ET

Inspiration

At a crowded event, on a remote trail, or during a network outage, people can be close enough to help each other and still have no way to communicate. Most messaging apps stop working as soon as cellular service or Wi-Fi become unavailable.

We built NoRed around a different idea: what if the phones around us became the network? Instead of requiring two people to be connected at the same time, each phone could temporarily carry messages and forward them when it encounters another device.

Our goal was to make offline communication useful not only for emergencies, but also for everyday connection. That led us to combine mesh messaging with emergency alerts, on-device transcription and translation, media sharing, and nearby multiplayer games.

What it does

NoRed is an offline communication app for iOS and Android. Nearby phones connect through Bluetooth to exchange messages without cellular service, internet access, user accounts, or a messaging server.

What makes NoRed different from a regular Bluetooth chat is its store-and-forward mesh. Suppose Phone A has a message for Phone C, but C is out of range. Phone A can give the message to Phone B. Phone B stores it locally, carries it after disconnecting, and forwards it when it later encounters Phone C or another device that can help deliver it. A and C never need to be connected at the same time.

NoRed also supports:

  • Direct and group text conversations.
  • Prioritized INFO, HELP, and DANGER alerts.
  • Photos and voice notes over direct Bluetooth connections.
  • Offline voice transcription using Whisper, a local OpenAI model.
  • On-device translation.
  • A network view showing nearby peers and observed message journeys.
  • Nearby chess, Pong, and Drawing Telephone games.
  • A Hack the North badge relay that bridges phone connections and displays alerts.

How we built it

We built the mobile application with React Native, Expo, Expo Router, and TypeScript. Because Expo Go cannot provide the low-level Bluetooth capabilities NoRed requires, we created a custom native Expo module using Swift and CoreBluetooth on iOS and Kotlin with Android BLE GATT on Android.

Each phone acts as both a Bluetooth Low Energy central and peripheral. This allows devices to advertise themselves, discover other NoRed users, establish connections, and exchange data.

Above the Bluetooth transport, we built a TypeScript mesh router that manages the message lifecycle:

  1. A message is assigned a unique packet ID and stored locally with SQLite.
  2. Nearby phones exchange inventories of the packets they already have.
  3. Missing packets are transferred and persisted by the receiving device.
  4. The receiving phone carries them after the Bluetooth connection ends.
  5. When the destination is encountered, the packet is delivered and an acknowledgement can travel back through the mesh.

Packet IDs prevent duplicates, while expiry times and hop limits stop messages from circulating forever. Regular messages use a five-hop, 24-hour budget. Emergency alerts receive transmission priority, can travel up to ten hops, and expire after six hours.

For voice features, we integrated whisper.rn, powered by whisper.cpp, with a quantized Whisper model running locally on the phone. Transcripts can then be translated on-device through Apple Translation or Google ML Kit. Once the models and language packs have been prepared, the process does not depend on a cloud API.

We also developed custom ESP32-C3 firmware in C using ESP-IDF and NimBLE, allowing a Hack the North badge to act as a physical relay and display recent alerts. This firmware allows the mesh network of NoRed to be extended beyond phones with simple, off-the-shelf hardware rather than dedicated infrastructure. The badge runs the same BLE protocol as the app and forwards packets between phones not in direct range. Emergency broadcasts are relayed through it in real time and shown on the badge screen.

Challenges we ran into

One of the challenges we ran into was getting the base mobile application running on physical devices. NoRed uses custom Swift and Kotlin code, so we could not test it through Expo Go. We had to configure native builds, development clients, device permissions, iOS signing, Android build tools, and platform-specific dependencies. We spent hours resolving Gradle, CMake, code-generation, device connectivity, and native-module lifecycle errors before we could test the core experience.

Bluetooth itself was also difficult because iOS and Android handle advertising, discovery, permissions, packet sizes, and connection lifecycles differently. Devices can disconnect at any moment, so transfers needed retry handling and could not assume a stable connection.

Finally, store-and-forward messaging required more than sending data between two phones. We had to distinguish between a relay storing a packet and the destination receiving it, persist messages across disconnections, suppress duplicates, return acknowledgements, and prevent stale packets from spreading indefinitely.

Accomplishments that we're proud of

We're proud of:

  • Building a cross-platform native Bluetooth module in Swift and Kotlin.
  • Implementing persistent multi-hop routing, retries, duplicate suppression, expiry, hop limits, and delivery acknowledgements.
  • Giving emergency alerts priority across the network.
  • Running speech recognition and translation locally instead of relying on cloud services.
  • Building media sharing and multiplayer experiences on top of the same Bluetooth transport.
  • Extending the network beyond phones with an ESP32-C3 badge relay.

What we learned

We learned that offline-first development requires a completely different mindset. With a traditional application, a central server coordinates identity, storage, routing, and delivery. In NoRed, every connection is temporary, any device may disappear, and the network topology changes whenever someone moves.

We also gained experience working across TypeScript, Swift, Kotlin, C, and Lua while connecting Bluetooth networking, persistent storage, on-device machine learning, embedded hardware, and mobile interfaces into one system.

Most importantly, we learned how much complexity is hidden by tools like Expo Go. Working directly with native modules and physical devices was frustrating, but it gave us the control required to build something that a standard Expo application could not support.

What's next for NoRed

Our next priority is adding authenticated end-to-end encryption so relay devices can transport messages without reading or modifying them.

We also want to improve background discovery and forwarding, support durable multi-hop delivery for photos and voice notes, make transfers faster across different phone models, and test the network with more devices under realistic movement and congestion.

Our long-term vision is to turn the devices people already carry into a resilient community network that stays connected when the signal disappears.

Built With

Share this project:

Updates

Submission history