A relay doesn't need to read
a message to forward it

MeshWhisper is messaging infrastructure built on this observation. Encrypted on the device. Forwarded as an opaque blob. Decrypted on the other end. The relay never holds a key. It doesn't need to.

Relay promiscuously. Connect selectively.
Node layer — live now

The backbone

One Docker container. Packet relay, store-and-forward, push notifications, media storage, and a prekey directory. Always on. Always connectable. Never holds a decryption key.

How the node works →
Device layer — roadmap

The mesh

Every device running any SDK-embedded app is a potential relay for every other. The relay infrastructure is shared across all participating applications. The relay mesh is shared. The application namespaces are isolated.

Read more →
Stage 1 — Now

Foundation node live

The relay is running at relay.meshwhisper.org. Prudence — the reference PWA — is being built on the SDK.

Stage 2

Developer adoption

Other developers deploy nodes. Multi-node privacy routing becomes real. No single operator sees both ends of a conversation.

Stage 3

Mesh density

Device-layer relay becomes meaningful. Privacy strengthens automatically as a side effect of adoption — the inverse of centralised messaging.

Integrate the SDK

Use the relay at wss://relay.meshwhisper.org during development. Deploy your own node in production.

1. Install
$ npm install @meshwhisper/sdk
2. Initialize
import { MeshWhisper } from '@meshwhisper/sdk';

const mw = await MeshWhisper.init(({
  namespace: 'com.example.myapp',
  node: 'wss://relay.meshwhisper.org',
  onMessage: (msg) => display(msg),
});

// PQXDH key exchange happens automatically on first contact
await MeshWhisper.send(contactId, payload);
3. Deploy your node
$ docker run -d \
  -v meshwhisper_data:/data \
  -e BASE_URL=https://relay.myapp.com \
  ghcr.io/meshwhisper/node:latest