v1.4.0 — Mesh VPN for small friend groups.
Create a virtual LAN (10.242.0.0/24), chat, and play over P2P UDP with automatic relay fallback when NAT wins. Settings → Connection: Direct (default) or Relay (force server path).
| Client (classic) | Windows — Wails + Wintun (run as Administrator) |
| Client (Electron) | Linux primary (+ optional Windows) — see electron/ |
| Server | Linux or Windows — Go binary (WebSocket signaling + UDP relay) |
| Crypto | X25519 + HKDF-only (hkdf-v1) + XChaCha20-Poly1305 |
| License | Apache-2.0 · NOTICE |
Changelog · Contributing · Security
Breaking in 1.1.0: HKDF-only session keys + token-only relay REG. Every peer (and the server) must be on 1.1.0 — old 1.0.0 clients will not interoperate.
- Virtual IP mesh with room chat and DMs
- P2P / relay / WebSocket path indicator
- Connection mode: Direct (prefer P2P) or Relay (server-only)
- Auto-reconnect with room re-join
- Saved networks + pipe invites (
server|room|password) - Room owner can delete the network (capability
owner_token) - In-app Check for updates / Update (Windows client)
- Optional shared
ENTANGLED_TOKENfor server + relay auth - UI languages: English, Russian, Chinese
cd server
go build -o entangled-server .
./entangled-server -addr :8080 -relay :3478Optional shared secret (recommended on a public VPS):
export ENTANGLED_TOKEN='your-shared-secret'
./entangled-serverHealth check: curl http://127.0.0.1:8080/health
Cross-compile Linux amd64 from elsewhere:
cd server
GOOS=linux GOARCH=amd64 go build -o entangled-server-linux .Put the WebSocket behind Caddy/nginx. The Go process listens in cleartext for that proxy.
your.domain {
reverse_proxy localhost:8080
}
Clients use wss://your.domain. Open 3478/UDP on the host for the relay (TCP 443 via the proxy is enough for signaling).
Secret-free deploy template: scripts/deploy.example.sh.
Needs: Go 1.23+, Node 20+, Wails v2, Administrator privileges for Wintun.
cd client/frontend && npm ci && npm run build && cd ../..
cd client
mkdir -p build/windows
cp packaging/windows/icon.ico build/windows/
cp packaging/windows/info.json build/windows/
cp packaging/windows/app.manifest build/windows/wails.exe.manifest
wails buildRun build/bin/Entangled.exe as Administrator.
- Enter server (
host:8080orwss://host), nickname, and token if the server requires one. - Create or join a network.
- Share Copy invite — format
server|room|password(password may be empty for open rooms).
Saved networks store name/server only — not room passwords. Re-enter the password when joining a protected room.
Linux (and optional Windows Electron) live under electron/. Classic Wails remains the primary Windows client.
cd electron
npm install
npm run build
npm startTUN creation needs CAP_NET_ADMIN (or root). Example:
sudo setcap cap_net_admin,cap_net_raw+ep sidecar/entangled-sidecar- Peer traffic is E2E-encrypted (X25519 → HKDF → XChaCha20-Poly1305). Packet loss does not desync nonces (random nonces per packet).
- The signaling/relay server sees metadata (who joins which room, public keys, addresses) and can MITM key exchange if you do not trust the operator. Self-host with people you trust.
- Empty
ENTANGLED_TOKEN= open server (fine for a private friend VPS). Set a token for anything reachable from the wider internet. - Room passwords are never written to
rooms.json.
cd server && go test ./...
cd client && go test ./vpncore/...
cd client/frontend && npm ci && npm run buildApp version constant: client/vpncore/version.go (AppVersion).
| Path | Role |
|---|---|
server/ |
Signaling hub + UDP relay |
client/ |
Wails app + vpncore |
client/frontend/ |
Svelte UI |
scripts/ |
Build / deploy helpers (no secrets) |
Release assets are built by .github/workflows/release.yml on v* tags (or via Actions → Release → Run workflow for an existing tag).
| Asset | Platform |
|---|---|
Entangled.exe |
Windows — classic Wails client (run as Administrator) |
EntangledVPN-Setup-*-x64.exe |
Windows — optional Electron installer (also elevates for Wintun) |
EntangledVPN-*-x86_64.AppImage |
Linux — Electron client |
entangled-server-linux-amd64 / entangled-server-windows-amd64.exe |
Signaling + relay server |
Wintun is embedded in the Windows clients — first launch writes wintun.dll next to the exe (leave that file there).
- ProGaMEr110521 — initiator; main developer of the first working build
- Warexpor — polish, expansion, and maintenance
Apache License 2.0 — see LICENSE and NOTICE.
Wintun (wintun.dll) is third-party; see NOTICE for attribution.
