A serverless, end-to-end-encrypted messenger for your local network. Mesh-Talk peers find each other on the LAN and talk directly β no account, no cloud, no server in the middle. Your messages and files never leave the network, and they stay encrypted the whole way.
Documentation Β· Architecture Β· Report Bug Β· Request Feature
Mesh-Talk is a desktop chat app (Tauri v2 + React) for macOS, Windows, and
Linux, built on a UI-free Rust protocol core (mesh-talk-core) that also runs headless as the
mesh-talk-node CLI. Peers discover one another over signed UDP multicast, connect over a
Noise-encrypted TCP channel, and converge by replicating a per-conversation append-only event
log. Every message is end-to-end encrypted with forward secrecy; an optional store-and-forward
relay (the "post office") delivers messages to peers that are temporarily offline.
Messaging
- One-to-one DMs and group channels, addressed by identity (and fanned out across a user's linked devices)
- Reactions, @mentions, replies/threads, and full-text search over local history
- Large-file transfer (up to ~4 GiB) β chunked, encrypted per chunk, with progress and resume
- Persistent, offline-capable history; a "post office" relay delivers to peers that are away
Security & privacy
- End-to-end encryption with forward secrecy β Double Ratchet for DMs, a sender-key ratchet for channels
- Ed25519 device identities (your ID is your key fingerprint), X25519 key agreement, Noise-encrypted transport
- Safety-number contact verification with trust-on-first-use and key-change warnings
- Encrypted-at-rest keystores and message logs; no servers, no telemetry, no central account
Network
- Zero-config LAN discovery: signed UDP multicast announces + announce/response + a unicast subnet-scan fallback
- Dual-stack IPv4/IPv6 direct TCP; self-healing discovery that re-announces and re-joins on network changes
Desktop experience
- Multi-device accounts with QR/code device linking
- Live presence (online / last-seen), pinned contacts, and an in-app diagnostics panel
- Tray icon, launch-at-login, native notifications, light / dark / OLED themes, and English / δΈζ
Built-in animated stickers |
Selectable themes |
End-to-end verification (safety number) |
Background & privacy settings |
|
Pick an avatar |
Group avatars |
- Discover β each peer broadcasts a signed announce over UDP multicast (
224.0.0.167:47474) on every interface; peers verify the signature and record one another. A unicast subnet scan and announce/response replies cover networks where multicast is flaky. - Connect β peers dial each other over TCP and run a Noise handshake for an authenticated, encrypted channel.
- Sync β conversations are append-only event logs; peers exchange only the events the other is missing (bounded rounds), so history converges and survives restarts.
- Encrypt β message payloads are sealed with per-conversation ratchets (Double Ratchet / sender key), so a compromised key can't decrypt past traffic.
- Relay when offline β if a recipient is away, an elected post-office node holds the encrypted events and forwards them on reconnect. It never sees plaintext.
See docs/ARCHITECTURE.md for the full design.
Grab the .zip for your OS/arch from the Releases
page (e.g. mesh-talk_vX.Y.Z_macos_arm64.zip) and unzip it β inside are the installer(s) for
your platform plus a SHA256SUMS file. The builds are free and unsigned (no paid Apple/Windows
code-signing certificate), so macOS and Windows show a one-time "unidentified developer" /
SmartScreen prompt the first time β this is expected for unsigned open-source software and does
not mean the app is unsafe. Every release also ships a SHA256SUMS list, a Sigstore cosign
signature, and a SLSA build-provenance attestation; the release page documents the exact verify
commands (shasum -c, cosign verify-blob, gh attestation verify). How to open, per platform:
- Linux β no prompt at all.
- AppImage (portable, no install):
chmod +x Mesh-Talk_*.AppImage && ./Mesh-Talk_*.AppImage - or install the
.deb/.rpm(adds an app-menu entry):sudo dpkg -i mesh-talk_*.deb
- AppImage (portable, no install):
- macOS β open the
.dmg, drag mesh-talk to Applications. On first launch macOS blocks an unsigned app, so right-click the app β Open β Open (only needed once). If it says "damaged", clear the quarantine flag with the full path (a Homebrew/CondaxattrinPATHmay shadow the system one and lack-r):/usr/bin/xattr -dr com.apple.quarantine /Applications/mesh-talk.app. - Windows β run the
.exe(or.msi) installer. SmartScreen shows "Windows protected your PC" β click More info β Run anyway (only the first time). WebView2 is fetched automatically if missing.
After the one-time approval it behaves like any installed app. To remove the prompt entirely you'd need paid signing (Apple Developer ID for macOS, a code-signing cert or the Microsoft Store for Windows); Linux is always prompt-free.
Two peers must be on the same LAN with the firewall allowing UDP
47474(multicast224.0.0.167) and the app's TCP port. If they can't see each other, the in-app Diagnostics panel and the troubleshooting guide walk through it.
- Rust (stable, edition 2021) + Cargo
- Node.js 20+ (frontend toolchain)
- Tauri CLI β
cargo install tauri-cli - Linux only β the GTK/WebKit stack:
sudo apt install libwebkit2gtk-4.1-dev libgtk-3-dev libayatana-appindicator3-dev librsvg2-dev patchelf
git clone https://github.com/OctopusGarage/mesh-talk.git
cd mesh-talk
make dev # install Rust + Node deps + git hooks (first run is slow)
make tauri-dev # run the app in dev mode (hot-reload frontend)
make tauri-build # or: produce a release bundle (.app / .dmg / .exe / .deb / ...)The same core runs without a UI as mesh-talk-node β also the offline-delivery relay:
cargo run --bin mesh-talk-node -- --keystore alice.ks --password <pw> --name alice| Flag | Meaning |
|---|---|
--keystore <path> |
encrypted identity keystore, created if absent (required) |
--password <pw> |
password that encrypts the keystore (required) |
--name <name> |
display name advertised to peers (required) |
--port <n> |
TCP port to listen on (0 = OS-assigned) |
--discovery-port <n> |
UDP discovery port, default 47474 (must match across peers) |
--post-office |
run as a store-and-forward relay for offline delivery (no chat REPL) |
Each instance needs its own keystore path β two nodes sharing one clobber each other's data.
In the chat REPL: /msg <peer-id-prefix> <text> to DM, /history <peer-id-prefix> to view a thread.
Two Rust crates plus a React frontend, layered so the protocol is independent of the UI:
mesh-talk/
βββ crates/mesh-talk-core/ # UI-free protocol SDK (no Tauri dep)
β βββ src/
β β βββ node/ # the serverless node: orchestration
β β βββ identity/ transport/ discovery/ eventlog/
β β βββ ratchet/ channel/ dm.rs file/ postoffice/
β β βββ storage/ # encrypted append-only logs + at-rest crypto
β β βββ util/ # shared helpers (net, safety-number, β¦)
β β βββ bin/mesh-talk-node.rs # headless node CLI (--post-office relay mode)
β βββ tests/ # multi-process integration tests (real nodes over UDP/TCP)
βββ src-tauri/ # Tauri desktop shell β a thin bridge over mesh-talk-core
βββ frontend/ # React + TS + Tailwind + shadcn ("Ink & Signal" design)
βββ docs/ # architecture + documentation map
βββ specifications/ # process, deployment, and convention docs
βββ Makefile # dev/build/test/e2e/lint shortcuts
The frontend talks to the backend only through Tauri commands; the desktop crate holds no protocol
or crypto logic. Wire formats are versioned bincode framed with a magic + version byte. Full
reference: docs/ARCHITECTURE.md.
Everything is indexed in the documentation map β start there. Highlights:
- Architecture β components, data flow, and crypto
- Contributing β dev setup, commands, and conventions
- Domain model and repo conventions
- Deployment Β· Troubleshooting Β· Security
make tauri-dev # run the desktop app (hot reload)
make test # Rust workspace unit tests
make e2e # multi-process backend E2E (real nodes)
make lint fix # clippy -D warnings Β· auto-fix + format
make check # the full local health gateThe UI flow is covered by a Playwright suite (cd frontend && npm run e2e). Quality is enforced in
CI across macOS/Windows/Linux β formatting, Clippy (-D warnings), tests + coverage, the frontend
build + ESLint, supply-chain policy (cargo deny), unused-dep and spelling checks β plus fuzzing,
mutation testing, secret scanning, and OpenSSF Scorecard. Commits are GPG-signed (the hooks set up
by make dev enforce it). See CONTRIBUTING.md for the full workflow.
Contributions are welcome β see CONTRIBUTING.md for the dev setup, build/test/lint commands, and conventions, and CODE_OF_CONDUCT.md for the community guidelines.
Mesh-Talk is end-to-end encrypted with forward secrecy and has no servers or telemetry. Please report vulnerabilities privately β see SECURITY.md. Do not open a public issue for security reports.
Open source under the MIT License.




