The tunnel is an evening's work: WireGuard on a rented server, a script that adds peers, and the official apps as clients. What Mullvad rents out is a pool of 542 servers across 50 countries and 91 cities on 14 hosting providers, shared by many customers so an address blends in, plus an account that needs no email and a no-logging policy that has been through published outside audits. A server of your own gives you one fixed address tied to your hosting account, which is the opposite of what most people buy Mullvad for. It covers café Wi-Fi and a stable IP, not country-hopping or blending into a crowd.
Before you buildMullvad has no free plan or trial, but the 14-day money-back guarantee makes a one-month test cheap if you want to compare it with a server of your own.
Build me a small WireGuard control panel to replace Mullvad's tunnel for my own devices. Requirements: - Go 1.23: one static binary `wgpanel` that runs as root on a Debian 12 VPS I already own and manages the wg0 interface through `golang.zx2c4.com/wireguard/wgctrl`. Settings are read from /etc/wgpanel/config.toml. - `wgpanel init` creates the server keys and wg0 on UDP 51820, turns on IPv4 and IPv6 forwarding, and installs nftables rules for NAT on the public interface. Running it twice changes nothing. - Storage: SQLite (`modernc.org/sqlite`) at /var/lib/wgpanel/panel.db with devices: name, public key, tunnel addresses, creation date and a note. Private keys are never stored on the server. - `wgpanel add <name>` generates the device key pair, saves only the public key, takes the next free /32 and /128, and prints the client config once with a terminal QR code (`skip2/go-qrcode`). AllowedIPs are 0.0.0.0/0 and ::/0, DNS is the server's tunnel address, keepalive 25 seconds. - DNS: install unbound listening on the tunnel address only, forwarding over TLS to the resolver named in config.toml. - Status page on 127.0.0.1:4910 (embedded HTML, htmx), reached through an SSH tunnel and guarded by one password hash from config.toml: each device's last handshake and bytes in and out from wgctrl, with disable, enable and delete buttons. - `wgpanel check --server <ip>` runs on a client with the tunnel up and exits 1 when the address reported by an echo endpoint in config.toml is not the server's, or when a DNS lookup fails. - No accounts, no telemetry, local-first: outbound traffic is the DNS-over-TLS upstream and the echo request. - Out of scope: several servers or countries, multihop, obfuscation, payments, Windows or macOS clients (use the official WireGuard apps), traffic logging beyond the counters. - README: install, the firewall (22 and 51820/udp only), and warnings that sites see the server's address, the host can see traffic metadata, and this is not an anonymity tool.
Opens your agent with the prompt filled in, you press enter. Or copy it and paste it into an empty folder.
The first prompt builds the core. Run these one at a time in the same folder to grow it into your own Mullvad VPN.
Extend the WireGuard panel in this folder. Requirements: - Add a --killswitch option to `wgpanel add` for Linux clients that writes PostUp and PreDown lines using nftables to drop all traffic not going through the tunnel or to the server's UDP port. - Extend `wgpanel check` to test three cases: the echo address, DNS answered by the server's resolver, and IPv6 either routed through the tunnel or blocked. - Add `wgpanel check --drop` that brings the tunnel down for five seconds and fails if any request reaches the internet during that time. - In the README, say that phones need the WireGuard app's "block connections without VPN" setting, since the config file can't do it there.
Add multi-server support to the WireGuard panel in this folder. Requirements: - `wgpanel servers add <name> <ssh host>` registers a second VPS and runs `wgpanel init` on it over SSH, storing only its public key and endpoint locally. - `wgpanel add <device> --server <name>` creates a profile per server, so each phone holds one tunnel per country and I switch by turning the profiles on and off. - The status page lists each server, its devices, last handshakes, and the monthly cost I enter. - Keep the servers independent: no traffic is routed between them, and removing one leaves the others alone. - Update the README with the cost per added country and the DNS setup.
Add monitoring to the WireGuard panel in this folder. Requirements: - Every minute read the wg0 peers; alert when a known device's last handshake is older than a threshold I set per device, and when any peer appears that is not in the database. - Send alerts to an ntfy topic from config.toml, at most one per device per six hours. - Add `wgpanel rotate <name>`, which prints a new client config, swaps the public key on the server only after the new key has connected once, and removes the old key after 24 hours. - Record every change in an append-only audit table and show the last 50 entries on the status page. - Update the README with the ntfy setup.
People pay for the crowd and for the promise. Many customers share each server address, the company says it keeps no traffic or connection logs, and the price has been 5 euros since 2009. A server you rent yourself swaps trust in Mullvad for trust in the host, and it points back to your account.
Estimate · A small VPS costs a few dollars a month and includes a lot of traffic; each extra country is another server. The build is token usage on your agent plan.
Checked 2026-10-20 against Mullvad VPN's docs: 1, 2, 3, 4, 5, 6
| Plan | Monthly | Annual, per month | What you get |
|---|---|---|---|
| Mullvad VPN | $5.61 | $5.61 | Up to 5 devices, WireGuard servers in 50 countries, no port forwarding. One flat rate for a month, a year or a decade of time. |
Not really. People pay for the crowd and for the promise. Many customers share each server address, the company says it keeps no traffic or connection logs, and the price has been 5 euros since 2009. A server you rent yourself swaps trust in Mullvad for trust in the host, and it points back to your account. The prompt on this page builds the closest honest substitute.
About $5.61 a month on the Mullvad VPN plan, $67.32 a year (checked 2026-10-20).
Servers in 50 countries and hundreds of shared addresses; An account with no email, name or password, and cash or crypto payment; Published audits and a no-logging policy you can hold the company to; A kill switch, multihop and DAITA traffic-analysis defence in the app; A service that moves its servers and fixes blocks without your help. If any of those matter to you, keep paying.
Yes: wg-easy (open source), AmneziaVPN (open source), PiVPN (open source).