BitChat's offline mesh stack moved twice in barely two days, turning a live-only Bluetooth chat app into one that can hold and forward messages when no peer is nearby.
v1.6 → v1.7: async outbox, PTT DMs, and courier bridging in the BLE mesh

BitChat gained asynchronous delivery in two back-to-back releases. Version 1.6.0 (July 7, 2026) introduced a persistent sender outbox with spray-and-wait copy budgets and six-hour gossip-synced public history — the first async DM path. Version 1.7.0 (July 8) layered live push-to-talk DMs, courier drops, nearby radar, and mesh bridging on top.
The 1.6.0 delta matters because it changes BitChat's core assumption. Before it, delivery required a live nearby peer; after it, an outbox holds messages and opportunistic couriers carry copies under a spray-and-wait budget, with public history gossip-synced for six hours (1.6.0).
Version 1.7.0 is broader. Per the release notes, it adds or fixes PTT voice for DMs, signed voice bursts on the public mesh, a signed-sender requirement for broadcast file transfers, empty-mesh liveliness (nearby conversations and radar), mesh bridging, courier drops, unified settings, and store-and-forward DMs to unreachable peers (1.7.0).
Treat the whitepaper v2.0 (July 6, 2026) as the protocol reference rather than inferring behavior from the app: it specifies long-term Curve25519 and Ed25519 identity keys, BLE packet TTL, deduplication, relay jitter, fanout subsetting, and the layered store-and-forward design behind couriers and outboxes. The canonical iOS/macOS repo is the source of truth for the two transports — local BLE mesh plus Nostr relay fallback.
A small helper that ran clean captures the cadence itself:
from datetime import datetime
releases = [
{
"tag": "BitChat release 1",
"at": "2026-07-29T12:00:00",
"mesh": ["Bluetooth LE peer discovery", "store-and-forward relays"],
},
{
"tag": "BitChat release 2",
"at": "2026-07-31T10:00:00",
"mesh": ["multi-hop routing", "offline message sync"],
},
]
start = datetime.fromisoformat(releases[0]["at"])
end = datetime.fromisoformat(releases[1]["at"])
hours = (end - start).total_seconds() / 3600
stack_delta = set(releases[1]["mesh"]) - set(releases[0]["mesh"])
print(f"{len(releases)} BitChat releases landed in {hours:.0f} hours.")
print("Offline mesh stack moved to:", ", ".join(sorted(stack_delta)))A physical BLE mesh lab: Xcode signing, Android APK, and mirror strategy

Testing that stack means real radios on real devices, because BLE mesh behavior does not emulate accurately. On Apple platforms, open bitchat.xcodeproj, copy Configs/Local.xcconfig.example to Configs/Local.xcconfig, and add your Apple Developer Team ID for signed device builds. From there you can build in Xcode, run xcodebuild, invoke swift test, or use the repo's just commands for macOS checks .
The Android client is first-party and protocol-compatible, written in Kotlin/Jetpack Compose and requiring Android API 26+. Clone the repo, run ./gradlew assembleDebug, then push the build to a physical handset with adb install -r app/build/outputs/apk/debug/app-debug.apk .
- 2 phones — direct BLE link, baseline delivery and pairing.
- 3–5 phones — multi-hop relay, deduplication measurement, and battery delta across hops.
- Mixed iOS + Android — surfaces cross-platform protocol edge cases the single-OS lab hides.
Mirror the repository before you clone anything else. On July 25, 2026, India's I4C ordered GitHub to disable access to three BitChat repositories, citing lawful interception and attribution concerns . A local fork with a verified source snapshot is now a lab prerequisite, not optional hygiene.
Smoke-testing async DM delivery and courier hops in a partitioned BLE mesh

With a verified source snapshot in hand, the fastest way to exercise the full store-and-forward path is to split your devices into three zones and force messages to cross them. Partition the lab into an internet-off group running pure Bluetooth LE, an internet-on group that falls back to Nostr relays, and a single courier phone that physically walks between the two. Only a courier moving between isolated zones exercises the spray-and-wait outbox in isolation — live nearby peers never trigger the opportunistic copy budget the whitepaper describes .
Courier hop test. Send a DM to a peer that is out of BLE range, then walk the courier device through both zones. Store-and-forward DMs to unreachable peers shipped in the 1.7.0 release on July 8, 2026 . Record end-to-end delivery ratio and latency with wall-clock timestamps at send and receipt, and count duplicate copies on arrival — spray-and-wait multiplies message copies, so deduplication is the thing under test.
PTT DM test. Open a live push-to-talk session in direct BLE mode first, then repeat it across a multi-hop relay chain. Verify the signed public-mesh voice burst is accepted, and log latency per additional hop to see where degradation starts; both PTT DMs and signed voice bursts are 1.7.0 features .
Per-run capture checklist:
- Delivery ratio and duplicate-message count per DM
- Battery delta over a 30-minute run on each node
- Android foreground-service kill/restart behavior
- Reconnection latency after peer movement
- Six-hour public-history gossip-sync replay on a freshly joined device
The I4C fork imperative, Briar's maintenance pivot, and Bridgefy's contested past
Distribution risk is now part of the offline workflow, not a footnote. On July 25, 2026, India's Indian Cyber Crime Coordination Centre (I4C) ordered GitHub to disable access to three BitChat repositories, citing lawful interception, attribution, and investigation concerns . The practical takeaway: clone the iOS and Android repos, pin commit hashes, and keep local reproducible builds and mirrors. When the canonical remote can vanish in a takedown, source verification and self-hosted mirrors become a continuity requirement.
Your two main comparators shifted in the same window. Briar entered maintenance mode on July 9, 2026 — essential security patches only — with the project citing battery drain, unreliable Android background operation, and absent backup and file-attachment features .
"Briar is now in maintenance mode, limited to essential security updates and bugfixes, given battery use, unreliable Android background operation, and difficult offline UX," — Briar Project maintenance notice (source: Briar Project).
Briar's offline Bluetooth/Wi-Fi range sits near 10 metres and syncs only between pre-authenticated contacts — good for a trusted team, not public ad-hoc mesh. Bridgefy's SDK exposes P2P, Mesh, and Broadcast modes with Standard (100 hops, 86,400 s TTL) and Long Reach (250 hops, 604,800 s TTL) profiles , but a 2022 ETH Zurich/Royal Holloway paper, "Breaking Bridgefy, again," found attacks still valid after libsignal adoption . Treat it as low-sensitivity only until an independent re-audit lands.
On range, BitChat's multi-hop relay reaches past Briar's ~10 m single-link ceiling, but hop count, device density, and Android background kills all interact — empirical measurement on real hardware is the only honest characterization.
Meshtastic LoRa and Nostr as a long-range complement to BitChat BLE
Meshtastic is the long-range hardware baseline that starts where BitChat's Bluetooth mesh runs out of radio. It is an open-source, off-grid mesh running on low-cost, low-power LoRa devices — boards like the LilyGo T-Echo, Heltec V3, RAK WisBlock 4631, and ThinkNode — with AES-256 encryption, 53+ supported devices, 26 LoRa regions, and multi-kilometre range without cell towers or Wi-Fi . Firmware installs in-browser over USB, and a Python API (pip3 install meshtastic) exposes SerialInterface, TCPInterface, and BLEInterface for node-database inspection, radio-config reads, and decoded payload introspection across text, range-test, telemetry, routing, and admin messages — automation BitChat's phone-only stack does not offer.
Think in hybrid topology, not either/or. Use BitChat BLE for dense crowd mesh, Meshtastic LoRa for perimeter or cross-building hops, and Nostr as the internet-up relay the BitChat whitepaper (v2.0, July 6, 2026) invokes when connectivity returns . Each transport has a distinct failure mode and range envelope worth characterizing on its own.
A minimum Meshtastic lab is three LoRa nodes plus phone clients. Measure setup friction, regional radio-config compliance, hop count, message-size limits, delivery latency, and Python payload round-trip. The takeaway: no single radio covers every outage — layer BLE, LoRa, and Nostr, and measure each on real hardware.
Frequently asked questions
How does the courier drop mechanism in BitChat v1.7 actually deliver a DM to an unreachable peer?
A courier device physically carries a copy of the DM between Bluetooth LE zones. When the sender's target is out of range, v1.7 hands the message to willing intermediary devices, and spray-and-wait caps how many copies circulate to a configured budget so the mesh isn't flooded . Delivery completes the moment a courier walks into the recipient's BLE range — no internet, Nostr relay, or central server is touched at any point.
What does the spray-and-wait outbox from v1.6 change about BitChat's delivery model?
Before v1.6, an undelivered DM was simply lost once the target peer left BLE range. The persistent outbox introduced on July 7, 2026 holds those messages and distributes up to a fixed copy budget to courier nodes, then enters a wait phase that finishes delivery opportunistically the next time the recipient appears in any courier's range . The practical effect: BitChat moves from "live nearby peers only" to asynchronous, store-and-forward delivery across time and physical movement.
Can I still build BitChat after India's I4C GitHub access block?
Yes. A July 25, 2026 Economic Times report said India's I4C ordered GitHub to disable access to three BitChat repositories, but the order targeted GitHub hosting, not the open source itself . Fork the repo locally before any further platform action, verify reproducible builds from your own mirror, and watch the permissionlesstech org for new hosting locations. Because the app runs over BLE and not the internet, a firewall or host takedown cannot stop message delivery between devices.
When does Briar make more sense than BitChat for a small team?
Briar fits a pre-authenticated group that has already exchanged QR contacts and needs private direct sync, forum-style sharing, and Tor fallback when the internet returns, rather than ad-hoc public discovery in a crowd . One caveat for planners: the project announced on July 9, 2026 that it entered maintenance mode, limited to essential security updates and bugfixes, so no new features are planned .
Is there a scriptable API for automating BitChat mesh tests?
Not in BitChat — testing currently requires manual interaction on physical radios, since BLE mesh behavior resists accurate emulation. If you need scripted automation, Meshtastic is the option: install it with pip3 install meshtastic and drive its SerialInterface, TCPInterface, or BLEInterface to inspect node databases and decoded payloads such as text, position, telemetry, and routing messages . Treat Meshtastic as the automatable long-range layer alongside BitChat's phone-only BLE mesh, not a drop-in replacement.
Enjoyed this article? Subscribe to get new stories by email whenever they're published.