Features
One program. Every node is the same.
meshvpn is a single static binary. The same program runs on your laptop, your server and your Raspberry Pi, and together they are the network.
The network
No coordination server, no account, no cloud.
Gossip, not a control plane
Each node signs its own record (name, addresses, neighbours) and gossips it. The state is saved on disk, so the network survives losing any node, including the first one.
Stable addresses and names
Every node gets an IPv4 address in 100.64.0.0/10 and an IPv6 address in its network's own prefix, both derived from its key, and a <name>.mesh name.
Encrypted twice
Links between nodes use Noise (XXpsk3). Every packet is also encrypted end to end, with replay protection, so relays can neither read nor forge what they forward.
Relays when nothing else works
Nodes that can't reach each other are connected over the shortest path through other nodes. Relays never see the content.
Several networks
One machine can be in a home network and a work network at the same time, each with its own interface and names.
Containers and no root
Without /dev/net/tun, meshvpn switches to userspace mode with a SOCKS proxy. A rootless install lives in your home directory.
Getting through
Home routers, mobile networks, carrier-grade NAT, corporate firewalls.
Direct UDP paths
Nodes probe each other's candidate addresses and punch through both NATs. LAN paths win when two nodes share a network. Big packets are split where a path has a small MTU.
Hole punching over IPv6
Home routers and mobile networks block incoming IPv6 connections. Two nodes that try each other at the same moment open both firewalls: UDP for data, TCP simultaneous open for the link.
Automatic port forwarding
On home routers with UPnP, NAT-PMP or PCP, meshvpn opens its port for an hour at a time and closes it again when it stops.
A rendezvous without a server
Optional (dht = true): nodes publish an encrypted, signed entry in the public BitTorrent DHT at a place only members can work out, and find each other again after their addresses change. New nodes can even join this way.
SSH-only networks
A machine that may only open an SSH connection joins with --ssh user@jump. meshvpn runs and supervises the reverse tunnel.
Why there's no direct path
meshvpn net why <node> tests the path together with the other node and says what blocks it. meshvpn doctor checks the whole setup.
Getting onto machines
Password-less SSH, per machine
sudo meshvpn ssh opens a grid: which user of which node may log in as whom. Keys are bound to the node's mesh address, which can't be spoofed. No host-key prompts on the mesh.
A built-in SSH server
For Docker images without sshd: shells, commands, scp and sftp, port forwarding, with the same rules. Locked and expired accounts stay out.
A desktop in the browser
meshvpn desktop gpu1: Xfce, MATE or Cinnamon in your browser, tunnelled over SSH, with 3D (VirtualGL) and H.264 from the GPU. Also in containers without X, or the machine's own screen.
The console
meshvpn console: the whole mesh in your terminal. Pick a node, log in, open its desktop.
Exit nodes
Internet through another node of the mesh: appear with your home address while travelling, or give a machine without internet a way out.
Tab completion
Commands, options, node names and tags complete in bash, as they are right now.
Working across nodes
For people with several GPU machines, and for the AI agents working on them.
exec and cp
Run a command on nodes by name or tag, copy files between them. Tags and an inventory of every node's hardware.
Distributed training
meshvpn launch starts torchrun-style jobs across nodes with the right addresses, and stops them cleanly. LAN paths for NCCL where nodes share a network.
GPU reservations
Reserve GPUs on a node for a while so two jobs don't collide. Released when the time is up.
Sharing data
Datasets and checkpoints are shared peer to peer, in chunks checked by hash, from whichever nodes already have them.
Check before you train
meshvpn net matrix measures every pair of nodes; meshvpn net check tests that real connections work between all of them.
For AI agents
--json output and clear exit codes everywhere, meshvpn guide with instructions for agents, and an MCP server.
Running a network
Admins and invites
Only admins invite. Invites are single-use and expire (24 hours by default), and are bound to a one-time key, so members who see a ticket can't use it.
Bans that hold
Banning a node rotates the network key and sends the new key, sealed, to everyone else, also to nodes that were offline.
Members for a while
A user's computer can be a member for a few hours only (invite --client), and is dropped when its time is up.
Leaving
meshvpn leave takes a machine out of a network for good. The last admin hands over first.
Updates you decide
Nodes never update themselves. meshvpn update installs a new release only if its signature verifies.
Devices without internet
deploy.sh installs meshvpn on a device you can only reach over SSH, from a jump host, without installing anything there.
Platforms
| Linux | macOS | Windows | |
|---|---|---|---|
Mesh, names, status, connect, userspace mode | ✓ | ✓ | ✓ |
| Service at boot | systemd | launchd | Task Scheduler |
| SSH logins into the machine | ✓ | ✓ (its sshd) | – |
ssh, exec, cp, desktops of other nodes | ✓ | ✓ | ✓ |
| Desktop sessions on the machine, exit nodes, console, rootless | ✓ | – | – |
| Architectures | x86_64, ARM64, ARMv7, ARMv6 | Apple Silicon, Intel | x86_64 |
The full table, with what is tested on real machines in CI: the README.