Reach any service.
From anywhere.

A private mesh for your services — not a flat network you join. You run it all; we run nothing.

Enroll your devices into a federation. Grant one service to one peer. It answers on localhost — over a post-quantum WireGuard mesh you own end to end. No account, no control plane we run, no telemetry. Built on sidehub, one open binary for every OS.

closed alpha · free · linux  macos  windows  ios  android  freebsd  openbsd

Three steps. One federation.

No accounts to create. No servers to provision. Run the binary, mint a code, paste it on the next device.

01  / run

Run the binary.

Drop the single sidehub executable on the device you want as the controller and run it. It opens a setup page on localhost — choose Controller. No daemon to install, no config file to hand-edit, no kernel module.

$ ./sidehub  # setup page on 127.0.0.1
02  / invite

Mint a bootstrap code.

In the controller’s dashboard, issue a one-time code bound to your federation. Hand it to whichever device should join — paste it, scan a QR, sneakernet it. Your call.

dashboard → new code  → bc_3f9…8a2
03  / join

Paste it to join.

Run sidehub on the new device and paste the code in its setup page. It pairs with the controller, builds an encrypted tunnel to every hub, and exposes the federation’s services on localhost.

$ ./sidehub + paste bc_…  # joined

Two devices that can't reach each other directly — behind a home router, a firewall, a carrier NAT — meet through a relay. The relay only forwards encrypted frames and sealed invitations; it never sees your traffic, your keys, or even which services exist. Because it can't read anything, it doesn't have to be yours: use our open relay (free, on request), a partner's, or run your own. It's never part of what you have to trust.

A service is one thing you share.

A service is one thing you expose — a database, a web app, an SSH port, a SOCKS exit, even your mailbox. The controller grants it to specific peers, and it shows up on a local address on their machine. Nothing else on your network is visible — there's no subnet to scan, no flat address space to firewall.

TCP

Databases, SSH, Git, registries — anything on a port.

localhost:5432
UDP

DNS, syslog, game servers, custom protocols.

localhost:5353
HTTP / HTTPS the web naming

Web apps and APIs answer at a name — no IP, no port to remember. Resolved on your own machine, never by public DNS.

wiki.home-lab.sideservices.localhost
SOCKS5

A proxy or exit on another node — route requests through where it sits.

localhost:1080
Mail

A private IMAP + SMTP mailbox the controller hosts for your federation — opt-in, mesh-only.

imap + smtp on localhost

Every grant, in plain sight.

The controller is a small web app on your own machine. You see every service, who it's granted to, and what's denied — and any device sees just the services granted to it, reachable by name. Click a screenshot to enlarge.

The controller's Services page: services grouped by the node that hosts them — postgres (tcp) to laptop, wiki (http) to laptop and phone, redis (tcp) 'no clients — denied to all' — plus the panel to consume an external org's service and the trusted federations.
Services — deny-by-default. Each one shows exactly who it's granted to, or denied to all.
The controller's Nodes page: the devices enrolled in the federation, online or offline, and whether each may reach the controller UI.
Nodes — the devices in your federation, online or not, and who may reach the controller.
A node's service list at sideservices.localhost: services available to this node grouped by provider, each HTTP service browsable at http://service.federation.sideservices.localhost, plus tcp services on a local port and services from an external federation.
One device's view at sideservices.localhost — HTTP services open at service.federation.sideservices.localhost.
The controller's Services page, full size. The controller's Nodes page, full size. A node's service list at sideservices.localhost, full size.

What's inside the binary.

Cross-platform, self-hosted, deny-by-default, post-quantum. No public DNS, no public TLS, no public anything.

// one binary

Every role, every OS.

Controller, hub, relay, consumer — the same static sidehub executable, the same commands. Linux, macOS, Windows, Android, iOS, FreeBSD, OpenBSD. No separate management or signal servers to run.

linuxmacoswindowsandroidiosfreebsdopenbsd
// access

Deny-by-default, per service.

You don’t join a flat network where everyone can see everyone. A service stays invisible until the controller grants it to a specific peer — and is revoked the same way.

postgres · tcp → laptop
wiki · http → phone
redis · tcp → denied to all
// addressing

Localhost is the address.

TCP and UDP services bind to a stable local port. Web services answer at service.federation.sideservices.localhost — resolved by the binary, never by a public resolver.

postgres localhost:5432
redis localhost:6379
wiki wiki.home-lab.sideservices.localhost
grafana grafana.home-lab.sideservices.localhost
// transport

WireGuard mesh, post-quantum keys.

Direct, encrypted hub-to-hub tunnels, with a relay fallback when a peer is behind NAT. Identities and key exchange are hybrid post-quantum (Ed25519 + ML-DSA, X25519 + ML-KEM) — harvest-now-decrypt-later doesn’t work here.

srv-01 laptop  wg · pq-sealed
laptop phone  wg · pq-sealed
edge-gw desktop  wg · pq-sealed
// federation

Share across organizations.

Hand another federation a code and it can consume one service of yours — scoped, revocable, deny-by-default. The two networks never merge, and neither side learns the other’s topology.

metrics acme → partner-co
registry acme → lab-team
// trust

A tiny trusted base.

No sign-up, no vendor control plane, no telemetry. The only thing you have to trust is your own controller. The relay is untrusted — it can’t read your traffic, so it can be anyone’s (ours, a partner’s, your own). Your keys never leave your devices.

vendor control plane / telemetry
a relay that can read your traffic
public CA · public DNS · public ports
trust only your own controller.

How it compares.

Same WireGuard primitive as a mesh VPN. A different idea of who's in charge — and what's reachable.

Hosted mesh VPNs

A vendor runs the control plane you have to trust. You sign up; your coordination lives in their cloud.

SideServices

Your own controller is the only thing you trust — no account, no vendor in the loop. The relay is untrusted, so it can be ours, a partner's, or yours.

Self-hosted meshes

Every node gets a flat address, gated by network ACLs, plus a separate management or signal server to operate.

SideServices

Deny-by-default at the service level, and federation across organizations. One binary is every role — nothing extra to run.

Public meshes

A global, open network anyone can join; you firewall on top.

SideServices

Each federation is private and controller-signed — reachable only where you grant it.

Ad-hoc relay tools

A shared global relay for one-off shells through NAT.

SideServices

A persistent, encrypted mesh on infrastructure you own, with structured, revocable service access.

Across all of them: end-to-end post-quantum identity and key exchange, and services that answer on localhost — no public DNS, no public CA.

Questions, answered.

Short version: one binary, a post-quantum WireGuard mesh, deny-by-default service access, and a localhost addressing trick. Everything stays on devices you own.

Request alpha access →
What's a federation?

The set of devices (hubs) you’ve enrolled together. One hub is the controller — it signs enrollment and holds the federation’s identity. Every other hub reaches the others directly over WireGuard, with a relay fallback for hubs behind NAT. There’s no central data plane and no shared address space — just the services you grant.

How is this different from a mesh VPN?

A mesh VPN drops every device onto one flat network and gates it with ACLs. SideServices is deny-by-default at the service level: a service is invisible until the controller grants it to a specific peer. The WireGuard transport is the same proven primitive — the access model isn’t.

How do services get reached?

Through localhost. TCP and UDP services bind to a stable local port. Web services answer at service.federation.sideservices.localhost, resolved by the binary itself against state the controller signed — never by a public resolver.

Why no public TLS and no public DNS?

Because both already happen, privately, elsewhere in the stack. Traffic between hubs is encrypted by WireGuard; the few control channels use self-signed, fingerprint-pinned certificates and signed payloads, not the public PKI. Names resolve locally. Nothing about your services leaks to certificate-transparency logs or open resolvers.

Can I share a service with another organization?

Yes. Hand another federation a one-paste code and it can consume one specific service of yours — scoped and revocable, deny-by-default. The networks never merge, and the consuming side never learns your internal topology.

Is it quantum-safe?

Yes, end to end. Identities are hybrid Ed25519 + ML-DSA-65 signatures; enrollment and key exchange are hybrid X25519 + ML-KEM-768. A future quantum computer that records today’s traffic still can’t read it or forge an identity.

Can a device only consume — never host anything?

Yes. Deploy it without a rendezvous and it’s consume-only: it imports services others share with it and reaches them outbound, but exposes nothing. Attach a rendezvous later (no redeploy) if you ever want it to host services of its own.

Who runs the relay, and do I have to trust it?

No — and that’s the point. The relay (the same binary, in its rendezvous role) only forwards encrypted frames and sealed invitations between devices that can’t connect directly. It can’t read your traffic, your keys, or your service map, so it’s never part of your trusted computing base. Use our open relay (free, available on request), a partner’s, or run your own — it makes no difference to your security.

Do I need an account?

No. No sign-up, no central control plane, no telemetry. The controller is a device you own running the same binary. Codes travel hub-to-hub by whatever means you choose.

What's sidehub?

SideServices is the network and the product; sidehub is the single open binary that runs every role — controller, hub, relay, or consumer. One executable, no runtime dependencies.

How do I get it?

It’s in closed alpha right now, and free. Request access at info@sidephone.io. Public builds and source are coming soon.

Coming soon.

SideServices (the sidehub binary) is in closed alpha — free, but builds and source aren't public yet. Want in? Email us and we'll get you set up.

linux · amd64 linux · arm64 macos · universal windows · x64 ios · testflight android · apk freebsd openbsd source

one binary — every OS, every role · all builds coming soon