meshvpn

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

LinuxmacOSWindows
Mesh, names, status, connect, userspace mode✓✓✓
Service at bootsystemdlaunchdTask Scheduler
SSH logins into the machine✓✓ (its sshd)–
ssh, exec, cp, desktops of other nodes✓✓✓
Desktop sessions on the machine, exit nodes, console, rootless✓––
Architecturesx86_64, ARM64, ARMv7, ARMv6Apple Silicon, Intelx86_64

The full table, with what is tested on real machines in CI: the README.