Fernweh brings private messaging beyond internet coverage

Offline Protocol powers nearby message delivery in Fernweh, while encrypted history and search stay on the phone as connectivity changes

Actual Fernweh App Store artwork showing offline conversations, private messaging, and nearby discovery.

Problem

Fernweh is a shipping private messenger on iPhone1 and Android.2 Its users encounter the problem in ordinary life: a crowded event, an underground journey, or a trip beyond cellular coverage interrupts the connection between people who still need to coordinate.

Solution

Fernweh keeps conversation history and search encrypted on the device. The Offline Protocol Mesh SDK3 carries messages across available nearby or internet paths; its automatic transport selection solution, the Dynamic Offline Relay Switch (DORS), handles the change in connection. Persistent message IDs and delivery receipts keep the exchange in one thread as routes change. This delivery layer underpins V2's direct and group conversations, alongside media, reactions, edits, local search, and internet-dependent encrypted calls.4

Outcome

People can find an earlier message without an internet connection and reach nearby contacts when a supported local path is available. That makes Fernweh useful both as a daily private messenger and when people need to find one another beyond coverage. Its published footprint is 40,000+ early users across 80+ countries.5 The App Store review below captures the practical result: two people separated at an event could communicate and reconnect.

I got lost at an event and was able to communicate with my boyfriend through this app! Thank you!

App Store review, September 1, 20261

The conversation belongs on the device

Encrypted SQLite holds Fernweh's local conversation history. Sending first creates a durable local message; receiving commits into the existing thread. Delivery and read receipts can advance independently of the message body. An internet relay extends reach by forwarding ciphertext, but it does not become the authoritative inbox.

The Offline Protocol Mesh SDK3 supplies the underlying discovery and delivery runtime. Its automatic transport selection solution, the Dynamic Offline Relay Switch (DORS), selects an available qualified nearby or internet path. A message arriving over more than one path retains the same identifier, so reconnection updates the conversation instead of duplicating it.

9:41AdaPrivate conversationTodayWhere are you?Meet at exit 209:41Message9:41KaiPrivate conversationTodayWhere are you?Meet at exit 209:41MessageSenderRecipientNearby deliveryRecipient commit → delivery receiptSame message ID, same conversationEncrypted internet relayAlternative when reachableA retained message stays pending until a recipient receipt returns over an available path.
9:41AdaPrivate conversationTodayWhere are you?Meet at exit 209:41Message9:41KaiPrivate conversationTodayWhere are you?Meet at exit 209:41MessageNearbyReceiptSenderRecipientInternet relayCiphertext onlyAlternative delivery pathsThe same message ID reaches the same thread.Recipient commit produces the delivery receipt.No path: the sender keeps the message pending.
01 / One thread across nearby and internet delivery

This architecture changes the visible experience. A person can open a previous conversation while a new message remains pending. Nearby participants can exchange messages without waiting for the internet. If no supported path exists, the sender retains the message and its unresolved delivery state. A locally stored bubble never stands in for a recipient's receipt.

Meeting nearby does not mean accepting every message

Fernweh supports nearby Bluetooth discovery, invitations, QR exchange, contact matching, and searchable OfflineIDs. Each leads to an explicit connection request. Discoverability and permission remain separate decisions.

OfflineID6 supplies a memorable identity around device-backed proof. In the shipped V2 identity profile, an Ed25519 public key derives a SHA-256/Base58 peer identifier; signed identity material can be verified locally. The private key remains on the phone. The directory resolves a human-readable username, while an already established nearby connection does not depend on another directory round trip.

Prove the deviceAccept the connectionProtect the conversationSigned identityEd25519 key stays localConnection requestAcceptDeclineRecipient decidesBlocking remains explicitAdmitted participantsMLS-protected exchangeOfflineID directoryOnline username resolution provides device material. Recipient acceptance still governs access.
Three separate trust decisionsProve the deviceSigned identity materialThe private key stays on the phone.Accept the connectionRecipient approvalNearby discovery grants no access.Protect the conversationMLS membershipOnly admitted participants exchange.OfflineID directoryOnline username → verified device material
02 / Identity proof, acceptance, and membership

Messaging Layer Security (MLS)7 protects conversation traffic. Identity verification establishes control of a key; it does not decide whether its holder is welcome. Connection acceptance, blocking, rate limits, and membership checks remain product controls. Reputation gives a recipient context rather than silently overriding that choice.

Search stays beside the history

Fernweh's FTS5 index lives inside its encrypted local database. A query resolves matching message IDs back to the conversation store, so opening a result returns the existing message and thread. Message inserts, edits, and deletions update the index; older history backfills in resumable chunks. Locked-chat results remain concealed until authentication succeeds. Search therefore follows the same on-device access boundary as the history it retrieves.

This is an everyday benefit of the architecture: retrieval uses data the phone already holds. Searching a globally registered username still reaches the directory because that task needs information the phone may not have.

On-device searchSearch queryThread or conversation historyNo remote message-body searchEncrypted databaseFTS5 indexMatching IDsMessage storeOriginal threadInsert, edit, delete → update indexOpen resultRespect locked-chat accessNo WAN requestSeparate online dependenciesGlobal username lookup → OfflineID directoryVoice / video → LiveKit + call keys
On the phoneSearch a conversationQuery stays inside the applicationEncrypted databaseFTS5 indexReturns matching message IDsConversation storeLoads the original thread + messageOpen the resultLocked chats require authentication.Edits and deletes update the local index.Global username lookup → online directoryVoice / video → internet-dependent LiveKit
03 / Search resolves against the encrypted local history

Calls have a different requirement. LiveKit carries internet-dependent voice and video. Fernweh creates a fresh 256-bit call key on the device and wraps it separately for invited devices through established secure sessions. If the key cannot be delivered securely, the application does not fall back to plaintext. Asynchronous message retention is never presented as continuous offline calling.

The implementation behind the experience

The runtime composition includes offline-protocol, offline-protocol-core, offline-protocol-transport, offline-protocol-router, offline-protocol-reliability, and offline-protocol-mls. Native bindings through offline-protocol-uniffi connect platform capabilities to the application. The deployed SDK and identity format are pinned together; changing the address format requires a deliberate migration.

The application owns its encrypted database, message IDs, outbox, and receipt transitions. Receiver deduplication and message insertion share a transaction. Attachments retain their own completion state, so a received message does not falsely promise that its media has finished downloading.

What changed for people using Fernweh

People now have a usable conversation even while a message is waiting for a route. They can reopen history, find an earlier message, and continue a nearby exchange inside the same application. Recipient receipts distinguish a stored message from one that another person has received. The published event review gives that architecture a human outcome: two people were able to reconnect when they needed to find each other.

Release validation follows the same user-visible boundaries:

User expectationHow it is verified
My conversation survives an application restartReopen the encrypted store and compare committed message IDs and attachment state.
A repeated delivery creates one messageDeliver the same identifier through nearby and internet paths, including a lost receipt.
I can find an earlier message without WANRun fixed local queries and record p50/p95 search latency with indexing state identified.
A nearby stranger does not gain conversation accessExercise rejected requests, removed membership, blocked peers, and invalid identity proof.
A pending message has a clear resolutionCorrelate its local commit with the recipient commit and returned receipt.

Managed services and expansion

Reach beyond the groupPrivate messages, nearby or onlineHosted RelayServices where people gatherSchedules, host help, and local requestsCapability ExchangePresence with permissionOptional verification for an event windowProof of Location
Reach beyond the groupPrivate messages, nearby or onlineHosted RelayServices where people gatherSchedules, host help, and local requestsCapability ExchangePresence with permissionOptional verification for an event windowProof of Location
04 / From private conversations to community services

Fernweh's next service layer grows out of the same moment that makes nearby messaging useful: people arriving somewhere together and needing to communicate. Travel groups and temporary event communities can reuse the application's conversations, invitations, and device identity, with services added around the group experience.

Reach and delivery support. Hosted Relay extends encrypted message delivery beyond nearby peers when an internet path is available. A managed Telemetry integration8 can help the product team diagnose failed routes and aging delivery queues across application releases. The application selects and buffers permitted diagnostic events; message bodies, search queries, and contact lists stay outside that stream. Local messaging does not wait for diagnostic ingestion.

Services inside the community. Capability Exchange can expose an organizer's help desk, cached event schedule, or a travel host's local information through authenticated discovery and invocation.9 People choose the service and approve the interaction. An organizer gains a service channel that remains useful on site, while Fernweh retains control of the conversation experience.

Optional attendance verification. Proof of Location10 adds a separate, consented way to verify presence during an event window without disclosing a continuous journey. It is useful for an attendance benefit or venue service, with witness and freshness requirements defined for that event. These extensions create room for organizer and travel-partner offerings combining private group communication, hosted reach, operational support, and selected service access.

References

  1. 01Fernweh on the App Store
  2. 02Fernweh on Google Play
  3. 03Offline Protocol Mesh SDK
  4. 04Fernweh V2 release and application architecture
  5. 05Fernweh product footprint and user stories
  6. 06OfflineID and device identity
  7. 07Messaging Layer Security: RFC 9420
  8. 08Runtime telemetry
  9. 09Service discovery and authenticated invocation
  10. 10Proof of Location

Bring the failure case. Leave with evidence. One workflow, agreed criteria, 4 to 16 weeks.

Scope an evaluation Read the docs