Free and open source · AGPL-3.0 · pre-1.0

Turn your Discord roles
into a private, encrypted network.

You already have a group organized in Discord — a gaming community, a homelab crew, a project team. UnityLAN turns those roles into a private LAN. Give a role a network, and everyone who holds it can reach each other's machines directly, as if they were plugged into the same switch. Lose the role, lose access — automatically.

Your friends type a name, not an address. Nothing to look up, no port to forward, no “what's my IP again?” in chat.
The UnityLAN desktop app showing the live peer list: each machine's name, whether the path is direct, and its traffic counters
And the app shows who's on, how each one is reached, and what's moving.
Direct P2PWireGuard tunnels peer‑to‑peer
No traffic relayControl plane never carries data
Free, no accountsDiscord login, no seats or plans
Linux & WindowsmacOS and mobile planned

What people use it for

Three ways it tends to get used.

A game-server community

Give a role you create — say @regulars — a network, and everyone holding it can hit the Minecraft or Valheim box by name, with no port forwarding and no public exposure. Take the role away and they're off the LAN. Games that only do LAN multiplayer work the way they always did.

A homelab and a few trusted people

Share the NAS, Jellyfin, a git server — with exactly the people who hold a role. No VPN accounts to provision by hand, nothing published to the open internet, and no exit server in the middle slowing traffic down.

A team without an identity provider

You want a private LAN but don't want to stand up an IdP. You already have one: the Discord server everyone's already in. Roles you already maintain become the access control.

What it actually is

A WireGuard mesh

Every online member forms a WireGuard tunnel to every other member they share a network with. Traffic goes directly between peers when the network path allows it; difficult NAT pairs can use an opted-in member as a ciphertext‑only relay. There is no exit server.

Membership = Discord roles

An admin registers a Discord role as a network with one slash command. Holding the role gets you in; a role change in Discord takes effect on the mesh within seconds. @everyone can't be a network, so nobody joins just by being in the server.

A lightweight control plane

A coordinator authenticates people against Discord, hands out addresses, and helps peers find each other — then gets out of the way. Use the hosted instance or run your own. Either way it carries no traffic and holds no one's private keys.

Human-readable names

Machines get names like laptop.alice.unity.internal, or just alice.unity.internal for a member's primary device — instead of raw IPs you have to remember.

If you know Tailscale: same shape — control plane plus P2P WireGuard data plane — but the identity source is your own Discord server. No third-party account, no company in the middle.

No server required

Or just your own devices

You don't need a Discord server — your own or anyone else's. Install UnityLAN, log in with Discord on each device, and they find each other. No network to create, no role to grant, nothing for an admin to approve.

Your devices get the usual names and are reachable from each other and nobody else — a stranger who signs in the same way sees nothing of yours. Join a community later and nothing changes: same address, same names, same tunnels. The community's networks simply appear alongside them.

  1. Install on the first device and log in.
  2. Do the same on the second.
  3. That's it.
The Networks tab of the desktop app, showing the My devices toggle alongside per-community networks

How it works

The 60-second version.

  1. A coordinator watches your Discord server

    Invite the hosted bot, or self-host your own. It holds an independent Ed25519 signing key for each Discord server it serves, so every server has its own trust anchor and compromise of one cannot forge membership in another.

  2. A member installs the client and logs in with Discord

    A privileged background engine plus an unprivileged desktop app.

  3. The coordinator issues a short-lived, signed attestation

    A token that cryptographically binds this user + this device + this IP + this WireGuard key to your Discord server. It can't be forged without that server's signing key, and it expires — so it must be continually re-earned.

  4. Peers verify each other and form direct tunnels

    Each peer checks the attestation against the pinned key for the server it names. From here the data plane is pure peer-to-peer.

  5. Members discover each other by long-polling

    No gossip flood, no always-on connection to babysit. A role change bumps that server's version and every affected client re-syncs at once; clients in unrelated servers stay parked.

The design goal throughout is decentralization. Once tunnels are up, peers hand each other the coordinator's freshly-minted attestations directly over those tunnels — so if your path to the coordinator breaks while your peers still have one, your mesh keeps running indefinitely. The coordinator itself going down is a different case: nothing new gets minted, so credentials lapse at their TTL (30 minutes by default) and tunnels close. A mesh rides out a coordinator restart, not a sustained outage — and enrollment and finding peers you've never met need it either way.

Security model, briefly

Your keys never leave your machine

The coordinator never sees your traffic and never holds a peer's private key. WireGuard keys are generated on each device and stay there.

A separate trust anchor per Discord server

The coordinator generates its own signing key for each server it serves — independently, on first use. Clients pin that key on first contact and verify every peer against it, so a compromised one's blast radius is a single server, never across servers.

Access expires unless re-earned

Attestations are short-lived and reissued on a TTL, so taking a Discord role away takes mesh access with it. No peer can extend another's credential — only the coordinator mints — so a removed member drops off when theirs lapses, whether or not anyone can reach the coordinator at the time.

Nothing is exposed by default

Joining a network does not open your box up. The engine installs a host firewall that drops all inbound on the mesh interface except what you explicitly share — a peer can ping you and nothing else. Your regular LAN and localhost traffic is never touched.

The Manage tab: each exposed port listed with a chip per scope allowed to reach it
Sharing a port is explicit, and can be scoped to one network's members — or to just your own devices.

How it compares

Same family, different answer to one question: who decides who's on the network?

  Who decides who's in Control plane Data plane
UnityLAN A Discord role you already maintain Open source; self-host it or use the hosted one. Carries no traffic either way WireGuard, direct peer-to-peer; hard NAT pairs fall back to an opted-in member as a ciphertext-only relay
Tailscale An SSO identity (Google, GitHub, Microsoft…) plus an ACL policy file Vendor-hosted and closed source; self-hosting means Headscale, a third-party reimplementation WireGuard, direct peer-to-peer with vendor-run DERP relays as fallback
NetBird Your identity provider over OIDC, plus policy rules Open source; self-host or use their cloud WireGuard, direct peer-to-peer with a relay fallback
ZeroTier Manual approval of each device in a network controller Vendor-hosted controller; self-hostable Its own layer-2 overlay, not WireGuard
Hamachi / Radmin VPN Whoever has the network's password Vendor-hosted, closed source Proprietary, and leans heavily on the vendor's relays

Where they're ahead. Tailscale and NetBird are mature products with macOS and mobile clients, audited code, real ACL tooling and actual support behind them. UnityLAN is pre-1.0, Linux and Windows only, and maintained by one person. If you need something that just works on every device your group owns, pick one of those — genuinely.

Where UnityLAN differs. Membership comes from a Discord server you already run, so there's no separate directory to maintain and no third-party account for anyone to create. The trust anchor can be yours — self-host and the signing key never leaves your box. And the control plane is open source end to end, so the hosted instance is a convenience, not a lock-in.

Compared July 2026 from each project's public documentation, on architecture rather than pricing or limits, which change. Spot something wrong or out of date? Tell us and we'll correct it.

Read this before you install

Why you might not — yet

Being upfront so you can decide before installing.

Pre-1.0.
UnityLAN works end to end on Linux and Windows, but it's young software. Treat it as such.
NAT traversal is still maturing.
A userspace ICE agent (STUN plus UDP hole-punching) forms direct tunnels for common NATs, and a ciphertext-only relay fallback carries the hardest CGNAT and symmetric-NAT pairs. A pair can still fail to connect when no suitable relay is online. Most home connections are fine.
Everyone needs a Discord account.
Identity comes from Discord, so every member — and every machine you enroll — signs in with a Discord account. There's no email-and-password path and no plan for one. If that's a dealbreaker for your group, this isn't the tool for you.
macOS and mobile aren't ready, and builds are x86-64 only.
Linux and Windows on x86-64 are the current first-class targets — no ARM packages yet, so a Raspberry Pi means building from source. The data plane is portable userspace WireGuard by design, so the rest is planned — just not here yet.
Much of it was written with AI assistance.
With a human in the loop directing the work, reviewing changes, and making the design decisions. If that gives you pause, that's fair — especially for software that touches your network and handles keys. It's open source, so you don't have to take anyone's word for how it works, and CI enforces formatting, linting, a full test suite, and end-to-end network tests on every change. More on that.

Get started

Two ways in, depending on which end you're at.

You were invited — or it's just your devices

Install the app

Someone else already registered the network, or you're meshing machines you own. Either way there's nothing to set up and no account to create.

  1. Install UnityLAN and start the engine.
  2. Log in with Discord.
  3. Peers you share a network with appear. Your own devices find each other with no network at all.

Get the app

You run the Discord server

Add the bot

Registering a role as a network takes one slash command. Members do nothing but install and log in — you don't provision anyone.

  1. Invite the bot to your server.
  2. Run /unitylan network add <role>.
  3. Tell your members to install the app.

Invite the bot Or self-host

Install

Free, and packaged installs already point at the hosted coordinator — there's nothing to configure. Linux and Windows, x86-64. After installing, log in with Discord from the app (or unitylan-engine login on a headless box).

Linux desktop

The unitylan-desktop package pulls in the engine, CLI, and app.

sudo apt install ./unitylan-desktop_*.deb
sudo systemctl enable --now unitylan-engine

.deb .rpm

Windows

Run the .msi. The wizard installs the engine and app, bundles the WireGuard driver, registers and starts the service, and offers to open the app when it finishes.

.msi

Headless server

Engine and CLI only, no graphics libraries. Mint a one-time key in Discord with /unitylan enroll, then hand it to the engine — no browser on the box.

sudo unitylan-engine --token unl_… run

.deb .rpm .tar.gz

SHA256 checksums ship with every release, and auto-updates are verified against a dedicated release key whose private half stays offline — separate from the keys that sign membership, so neither can stand in for the other. Prefer to build it yourself? It's a Rust workspace — cargo build --release.

For admins

Get a coordinator

Easiest — use the hosted instance. A canonical coordinator and bot is up and free to use, run by the project's maintainer — gtosh4 on GitHub, tosh on Discord. Invite the bot to your server, run /unitylan network add <role>, and you're done. You're trusting that instance to gate access to your mesh; it still never sees your traffic or your keys.

Full control — self-host. One container. You'll need a Discord app with a bot token and somewhere to run it behind HTTPS.

Invite the bot Self-host guide

The coordinator's admin dashboard, showing registered networks and live member counts

Questions people ask

Will it slow my internet down?

No. There's no exit node and nothing is proxied — your default route is untouched. Only traffic addressed to another mesh member goes into a tunnel; everything else leaves your machine exactly as it did before.

Can other members get into my machine?

Not unless you let them. The engine installs a host firewall that drops all inbound on the mesh interface except the ports you explicitly share — a peer can ping you and nothing else. Sharing a port is a deliberate act, and can be scoped to one network's members or to just your own devices. Your regular LAN and localhost traffic is never touched.

Can whoever runs the coordinator see my traffic?

No. It isn't on the data path — packets go peer to peer — and it never holds a peer's private key, so there is nothing for it to decrypt even in principle.

Why there's a trusted party at all: Discord gives one user no way to check another user's roles — only a bot can read a server's member list. So membership has to be vouched for by something holding a bot token, and that something is the coordinator. It's a Discord limitation, not a design preference.

The honest caveat that follows: the coordinator generates its own signing key for each Discord server it serves — UnityLAN's key, nothing Discord issues or knows about — and holds it. So whoever runs the coordinator could mint an attestation and place a device of their own into your networks. That device would still land behind your firewall rules like any other peer, and it could not read traffic between existing peers. If that residual trust bothers you, self-host — then the signing key is on your box and nobody else's.

What does the coordinator actually store about me?

Your Discord user ID and display handle, your device names and their WireGuard public keys, an index that determines your mesh address, a per-device token, and a last-seen timestamp. That's the lot.

It does not store your traffic (it never sees any), and it keeps no record of the addresses your peers connect from — reflexive candidates are brokered in memory to help two peers find each other and are never written down. The coordinator logs operational events like start-up and membership changes, not a per-request access log.

Does it work alongside Tailscale?

On Linux, yes, automatically. Both use the same 100.64.0.0/10 address range, and Tailscale installs a firewall rule that drops that range on interfaces which aren't its own — which silently blackholes every UnityLAN packet while peers still look reachable. The engine detects that rule and narrowly exempts the mesh interface, rechecking after every Tailscale restart.

On Windows this isn't handled yet. If you run both there and mesh traffic vanishes while peers show as connected, this is why.

Do I need to forward ports or touch my router?

No. Peers negotiate a direct path themselves, hole-punching where the NAT allows it. The hardest cases — CGNAT, symmetric NAT on both ends — fall back to an opted-in member relaying ciphertext it cannot read.

Is it fast enough for games?

When a direct path exists, traffic takes the same route it would without UnityLAN, plus WireGuard's encryption overhead — so latency is close to a plain internet connection between the same two machines, and there's no server in the middle adding a detour. A pair that ends up on the relay fallback pays whatever the detour through that member costs.

What names do my machines get?

<device>.<you>.unity.internal — so laptop.alice.unity.internal. Whichever device you mark primary also answers to the bare alice.unity.internal.

Can I serve a website or media library over the mesh?

Yes, and it can have a real HTTPS certificate rather than a browser warning. Mesh names end in .unity.internal, which no certificate authority will ever certify — so a deployment can also configure a domain it owns, under which every device gets a matching public name (laptop.alice.mesh.unitylan.com on the hosted coordinator) and can obtain a publicly-trusted certificate for it. Your device runs the whole exchange and keeps its own key; the coordinator never sees key material.

It's off by default and opt-in per device, for a reason worth knowing: every publicly-trusted certificate publishes its names to public transparency logs, permanently, where anyone can search them. Turning it back off stops renewals but can't unpublish what's there. The app only offers the option once you're actually serving something.

What happens if I stop using it?

Nothing dramatic. A device stays enrolled and keeps its address until you remove it — ctl remove for one you no longer have, or uninstall when you're done with a machine. Removing it returns the address to the pool.

There's one automatic cleanup: if you mesh only your own machines, with no Discord server involved, an address that goes 30 days without connecting is released and you get a fresh one next time you log in.

Is the hosted coordinator really free?

Yes, and it's meant to stay that way — there are no seats, plans, or limits to grow into. It's a control plane that carries no traffic, so it's cheap to run. If you'd rather not depend on someone else's goodwill, self-hosting is one container.

What kind of support should I expect?

Best-effort. UnityLAN is a side project, not a company or anyone's day job — there's no SLA, and the hosted coordinator comes with no uptime promise. Questions in Discord get answered when there's time. Everything is open source and self-hostable precisely so you're never stuck waiting on one person.