v1 · live · MIT licensed

Mesh the routers, laptops, and servers you already own.

MeshWG is an open-source WireGuard mesh controller. Connect any router, laptop, or server that runs WireGuard — TP-Link, MikroTik, OpenWrt, Ubiquiti, your homelab, your phone — into one private network with policy-based access control. Self-host free, or pay $1/machine/month.

2 machines free, forever Standard wg-quick configs Open source · MIT Works with TP-Link, MikroTik, OpenWrt
If it runs WireGuard, it works with MeshWG
TP-Link
Archer · Deco · ER
MikroTik
RouterOS 7+
OpenWrt
19.07+
Ubiquiti
UDM · EdgeRouter
OPNsense
pfSense too
Linux/Mac/Win
wg-quick everywhere
/ how it works

Three primitives. That's the whole product.

No vendor firmware. No agent. The controller speaks standard WireGuard to your machines and writes policy at the kernel level.

01

Create an org

Sign up, name your organization. Each org gets its own isolated Linux network namespace and a unique WireGuard hub keypair (private key AES-256 encrypted at rest).

# tenantname = "acme-networks"namespace = "qm_acme_networks"hub_ip = "10.100.0.1/16"
          
02

Add machines

Each machine — router, laptop, server, phone — is one peer. The controller generates the keypair, allocates an overlay IP, and returns a ready-to-paste wg-quick config.

# machinename = "branch-mumbai"device_type = "site"overlay_ip = "10.100.0.2"lan_subnets = ["192.168.10.0/24"]
          
03

Set policies

Define which machines can reach which. Allow / deny, by protocol and port. Rules write into the tenant namespace's iptables FORWARD chain in real time.

# access_policysource_id = <machine-A>dest_id = <machine-B>dest_protocol = "tcp"dest_ports = "443,8000-8100"action = "allow"
          
/ honest engineering

It's a wg-quick config. No agent. No daemon.

The controller emits standard WireGuard. Paste it into your router, laptop, or server's existing WireGuard interface. The machine keeps doing what it does. MeshWG just brokers the tunnel.

# wg0.conf — generated for machine "branch-mumbai"
[Interface]
PrivateKey          = <generated, returned once>
Address             = 10.100.0.2/16
MTU                 = 1420

[Peer]
# tenant hub for "acme-networks"
PublicKey           = <tenant hub public key>
Endpoint            = vpn.your-domain.com:51820
AllowedIPs          = 10.100.0.0/16
PersistentKeepalive = 25
/ features

Small surface. All of it shipping.

Everything below is in the codebase today and exercised by an end-to-end harness on every release. No roadmap items.

Machines & subnets

Each peer is one row — site (with LAN subnets) or user endpoint. The controller generates the keypair, allocates the next overlay IP atomically, and returns a one-time wg-quick config.

handlers/devices.go

L3 / L4 access policies

Allow / deny rules between any two machines by protocol and port (single, comma list, or ranges). Rules flush and re-apply to the tenant namespace's iptables FORWARD chain in real time.

e2e step 11 + 14

Tenant isolation by namespace

Each org gets its own Linux network namespace. tcpdump in one tenant's namespace sees zero packets while another tenant floods — proved by step 12 of the e2e harness.

namespace/manager.go

Pure spoke-to-spoke through hub

The hub forwards overlay traffic between peers. It's explicitly not an internet exit — no MASQUERADE, no SNAT, only wg0+lo inside the tenant ns. Verified by step 17b.

e2e step 17b

Reboots are non-events

A startup reconciler walks every tenant in PostgreSQL and rebuilds namespace, wg0, peers and routes from DB. Fresh deploy or host reboot: kernel state restores itself in seconds.

wireguard/reconcile.go

Multi-tenant from day one

One controller, many orgs, per-tenant admin accounts, per-tenant private keys (AES-256-GCM at rest). No second deployment when you onboard a new customer.

handlers/tenants.go
/ vs the competition

Different shape. Fewer pieces.

Tailscale, Netbird and ZeroTier are agent-based — every device runs their daemon. MeshWG works with the WireGuard interface your router and OS already ship. Different problem, different price model.

TailscaleNetbirdZeroTier MeshWG
Needs a per-device agent? Yes (tailscaled)Yes (netbird agent)Yes (zerotier-one) No — uses native WireGuard already in your router / OS
Works with consumer routers (TP-Link, MikroTik)? Workaround via subnet routerWorkaround via netbird-relayWorkaround via bridging Direct — paste a wg-quick config, done
Self-hostable? Headscale (community)Yes (Apache 2)Yes (BSL) Yes (MIT) — first-class, this is the deployment model
Free tier 3 users / 100 devices5 users / 100 peers1 network / 25 devices 2 machines, forever — or unlimited if self-hosted
Paid pricing $6 / user / mo$5 / user / mo$5 / mo for 25 devices $1 / machine / month — or $3 monthly
Pricing scales by UsersUsersDevices Machines — the thing you actually count
ACL granularity L4 (tailnet policy file)L4 (groups + rules)L2 / L3 (flow rules) L3/L4 with multi-port (tcp 443,8000-8100)
Tenant isolation Tailnets (logical)Single-accountNetworks (logical) Linux network namespace per tenant (kernel-level)
If the provider dies Run HeadscaleSelf-host the dashboardSelf-host moons + planet wg-quick keeps running; source is on GitHub
/ pricing

One number. Per machine.

A "machine" is any peer in your mesh — a router, a laptop, a server, a phone. Two free, forever. After that, $1/machine/month on annual billing or $3/machine/month monthly.

Self-hosted
$0 forever

The OSS. Run it on your own Linux VM with full source.

  • Unlimited machines
  • All features, no gates
  • Full source on GitHub (MIT)
  • Reconciler, e2e harness, deploy templates
Get the source
Cloud
$1 / machine / month, billed annually
or $3 / machine / month, billed monthly

Hosted controller on our infrastructure. Free up to 2 machines.

  • 2 machines free, forever
  • Sign in with Google or email
  • Hosted, monitored, backed up
  • Audit log, basic alerts
Sign up free
Pro
Custom talk to us

Bigger fleets, dedicated infrastructure, priority support.

  • Dedicated controller instance
  • Custom domain (acme.meshwg.com)
  • Priority email support
  • Negotiated SLA
Talk to us

All Cloud plans share the same product — no feature gates on ACLs, reconciler, multi-tenant or any core function. The OSS and the Cloud version are built from the same codebase.

/ faq

Honest answers.

How is this different from Tailscale?

Tailscale needs its agent (tailscaled) running on every device. That's great for laptops and servers, awkward for branch routers. MeshWG works with whatever WireGuard implementation is already on the device — the one TP-Link, MikroTik, OpenWrt and Ubiquiti ship in their stock firmware. No agent install. Also: MeshWG prices by machine, not by user, which matches the homelab / multi-site / MSP shape better.

What is MeshWG today?

An open-source Go controller that manages WireGuard peers and L3/L4 ACLs for one or more organizations. Self-hosted on a single Linux VM. No cloud relays, no SaaS lock-in — the dashboard and API are the whole product surface.

Is this really SDWAN, or just WireGuard with a UI?

It's WireGuard with a UI, plus per-tenant Linux namespace isolation, iptables-enforced ACLs, a startup reconciler that rebuilds kernel state from the database, and an e2e harness that validates every claim against real kernel oracles. If 'SDWAN' means a $1,500 box, this isn't that. If it means software-defined site-to-site networking with central policy, it is.

Which devices work with it?

Anything that speaks WireGuard. That's TP-Link Archer/Deco/ER, D-Link DIR/COVR/DSR, Ubiquiti UDM/EdgeRouter, MikroTik RouterOS 7+, OpenWrt 19.07+, OPNsense, pfSense, and any Linux/Mac/Windows machine. The controller emits stock wg-quick config.

Where do private keys live?

Tenant hub private keys are generated by the controller and stored encrypted at rest with AES-256-GCM. Per-machine private keys are returned exactly once when the machine is created and not retained server-side after the .conf is shown.

Does the hub provide internet egress?

No. By design and verified by the e2e harness: the tenant namespace has zero MASQUERADE rules, zero SNAT rules, only wg0 + lo interfaces, and external IPs are unreachable from inside it. The hub forwards overlay traffic between peers only. Machines reach the internet via their own local network.

What happens if the controller goes down?

Existing tunnels keep running — WireGuard is a kernel feature on each peer, it doesn't depend on the controller. You lose the dashboard and the ability to change policy until it's back. The startup reconciler rebuilds kernel state from PostgreSQL when it comes back up.

How does sign-up work?

Sign in with Google or with an email + password. That's it. No SSO providers, no SAML, no Microsoft Entra — this is intentionally a tool for individuals and small teams, not enterprise procurement. If your use case needs SAML, talk to us about Pro.

/ get started

Sign up free. Bring your own hardware.

Two machines free, forever. Mesh your homelab, your laptop, and your router in five minutes. No card. No agent install.