Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

62 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Mesh-Talk

CI UI E2E Backend E2E Sanitizers Fuzz Mutants Gitleaks Scorecard OpenSSF Scorecard codecov License: MIT Rust Tauri React platform: macOS | Windows | Linux DeepWiki Release

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 β€” a group channel with a selectable brand theme, inline media, reactions, and animated stickers


Overview

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.

Features

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 / δΈ­ζ–‡

Screenshots

The animated-sticker panel open in a direct message
Built-in animated stickers
The theme picker with dark, light, OLED, and football-brand themes
Selectable themes
The verify-contact dialog showing a safety number
End-to-end verification (safety number)
The settings dialog: background behavior and privacy toggles
Background & privacy settings
The avatar picker gallery
Pick an avatar
Group avatar crest gallery
Group avatars

How it works

  1. 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.
  2. Connect β€” peers dial each other over TCP and run a Noise handshake for an authenticated, encrypted channel.
  3. Sync β€” conversations are append-only event logs; peers exchange only the events the other is missing (bounded rounds), so history converges and survives restarts.
  4. Encrypt β€” message payloads are sealed with per-conversation ratchets (Double Ratchet / sender key), so a compromised key can't decrypt past traffic.
  5. 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.

Download & first run

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
  • 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/Conda xattr in PATH may 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 (multicast 224.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.

Build from source

Prerequisites

  • 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

Desktop app

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 / ...)

Headless node (CLI / post-office relay)

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.

Architecture

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.

Documentation

Everything is indexed in the documentation map β€” start there. Highlights:

Development

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 gate

The 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.

Contributing

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.

Security

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.

License

Open source under the MIT License.

(back to top)