[DEPRECATED - Use Go version] WireGuard mesh VPN
Project description
wire
⚠️ DEPRECATED: This Python package is no longer maintained. Please use the Go version instead:
# macOS brew install meshpop/tap/wire # Linux curl -sSL https://github.com/meshpop/wire/releases/latest/download/wire-linux-amd64 -o /usr/local/bin/wire && chmod +x /usr/local/bin/wireGitHub: https://github.com/meshpop/wire
Self-hosted WireGuard mesh VPN. Like Tailscale, but you own everything.
pip install meshpop-wire
Pure Python. No external services. No accounts. No cloud dependency.
Why wire?
| Manual WireGuard | Tailscale / ZeroTier | wire | |
|---|---|---|---|
| Add new node | Edit every peer config | One command | One command |
| Coordination | You manage | Their cloud (required) | Your own server |
| Works if vendor down | Yes | ✗ | ✓ |
| Self-hosted | Manual config | ✗ Enterprise only | ✓ Always |
| IP assignment | Manual | Auto | Auto — deterministic |
| AI management | ✗ | ✗ | ✓ via MCP |
How it works
wire has three components:
| Component | Role | Where |
|---|---|---|
wire-server |
Peer registry + STUN | One always-on server |
wire |
VPN daemon + CLI | Every node |
wire-mcp |
MCP server for AI | Machines with Claude |
┌─────────────────────────────────┐
│ Coordination Server │
│ HTTP :8787 — peer registry │
│ UDP :8788 — STUN │
│ Does NOT carry VPN traffic │
└──────────┬──────────┬───────────┘
│ │
┌───────▼──┐ ┌──▼───────┐
│ Node A │◄──►│ Node B │
│ 10.99.x.x│ │10.99.y.y │
└──────────┘ └──────────┘
direct P2P WireGuard tunnel
Deterministic IPs — each node's VPN IP is derived from its hardware identity (SHA-256 of hostname + MAC address). Same machine always gets the same IP. No DHCP, no conflicts.
Auto peer sync — the daemon polls the coordination server every 30 seconds. New nodes are discovered by the whole fleet automatically.
NAT traversal — built-in STUN server lets nodes behind home routers find each other without port forwarding.
Quick Start
Step 1 — Start the coordination server (once)
pip install meshpop-wire
wire-server
As a systemd service:
[Unit]
Description=wire coordination server
After=network.target
[Service]
ExecStart=wire-server
Restart=always
[Install]
WantedBy=multi-user.target
systemctl enable --now wire-server
Step 2 — Join each node
# First time — saves config to /etc/wire/config.json
sudo wire up --server http://YOUR_COORD_SERVER:8787 --name myserver
# After first run:
sudo wire up
Done. Every existing node discovers the new node within 30 seconds.
CLI Reference
wire up [--server URL] [--name NAME] # Join the mesh
wire down # Leave the mesh
wire status # View all nodes
wire peers # List registered nodes
wire ping web1 # Ping by name or VPN IP
wire diagnose # Full diagnostic check
wire install # Check WireGuard installation
Example wire status output:
4 online / 1 offline / 5 total
● web1 10.99.23.187 203.0.113.10 5s ago
● web2 10.99.45.22 198.51.100.20 12s ago (this node)
● db1 10.99.87.3 192.0.2.30 8s ago
○ backup1 10.99.100.1 198.51.100.30 14m ago OFFLINE
WireGuard Installation
# Debian / Ubuntu
apt install wireguard wireguard-tools
# RHEL / Fedora
dnf install wireguard-tools
# Alpine
apk add wireguard-tools
# macOS
brew install wireguard-tools wireguard-go
Run wire install to check your platform.
AI Management via MCP
{
"mcpServers": {
"wire": { "command": "wire-mcp" }
}
}
"Which nodes are currently offline?" "Ping all nodes and tell me which have high latency" "Why can't web1 reach db1?"
MCP Tools
| Tool | Description |
|---|---|
wire_status |
Full mesh view — all nodes, VPN IPs, last seen |
wire_up / wire_down |
Bring VPN up or down |
wire_peers |
List registered peers |
wire_ping |
Ping a peer by name or IP |
wire_diagnose |
Full diagnostic check |
wire_watchdog |
Check handshake ages, stale connections |
Configuration
Written automatically by wire up:
{
"server_url": "http://COORD_SERVER:8787",
"node_name": "web1",
"vpn_ip": "10.99.x.x",
"listen_port": 51820
}
| Context | Path |
|---|---|
| Root / system | /etc/wire/config.json |
| User | ~/.wire/config.json |
Server environment variables
| Variable | Default | Description |
|---|---|---|
WIRE_PORT |
8787 |
HTTP port (UDP STUN = port + 1) |
WIRE_VPN_SUBNET |
10.99 |
VPN IP prefix |
WIRE_STATE_FILE |
/etc/wire/state.json |
Peer state file |
MeshPOP Stack
wire is the network layer of the MeshPOP stack:
mpop Fleet orchestration — monitor, manage, automate
vssh Authenticated transport — remote exec, file transfer
wire Encrypted mesh VPN — connects all nodes ← this
Each layer is independently installable and usable.
License
MIT — MeshPOP
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file meshpop_wire-3.0.0.tar.gz.
File metadata
- Download URL: meshpop_wire-3.0.0.tar.gz
- Upload date:
- Size: 28.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1b3f68aa5cc4425bc569cec7d05e077a5dd90505f3fcba7af326fe20193dae00
|
|
| MD5 |
dd4647ebc2b79ea30b3b5ba23df6104a
|
|
| BLAKE2b-256 |
323cf60ed1b5320da7865ad60948576606a3ec88e8df276b40feae096ff7a653
|
File details
Details for the file meshpop_wire-3.0.0-py3-none-any.whl.
File metadata
- Download URL: meshpop_wire-3.0.0-py3-none-any.whl
- Upload date:
- Size: 30.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fcbbf17f1989731cb1bd72652dd06043a4f9662192eb94ff38bfb757cf7575ee
|
|
| MD5 |
474e50affb5bb4e96d6babd09575a270
|
|
| BLAKE2b-256 |
85460fae82e2bdb710436916ee29fd8c560b12dc2497218d082b3972c52d815f
|