Route through a mesh, not a company.

A Rust daemon that links your machines into one private network, encrypted end to end, with no server in the middle.

X25519 + ML-KEM-512
Hybrid key exchange
RS(2,1)
Any two of three shards rebuild
512 bytes
Every frame, same size
Ed25519
Fingerprints, not addresses

Joining a mesh

Any node can seed any other. There is no registry to sign up to and no server to run.

01 Install it

On the machine inside your home network — the one that will be your exit — and on every device that should reach it.

# Linux / macOS
curl -sSf https://ggn.kellersystems.dev/install.sh | sh

# Windows PowerShell
irm https://ggn.kellersystems.dev/install.ps1 | iex

02 Let the nodes find each other

On one network there is nothing to configure: nodes broadcast a signed beacon every 30 seconds on 2270/UDP and connect to whatever they hear.

Across the internet, give each node a rendezvous point — a DNS name you control that resolves to the machines you trust…

GHOST_DNS_SEED=seeds.example.com

… or the public address of any node already in the mesh:

GHOST_SEEDS=203.0.113.7:2271

03 Connect to someone

Every node runs a console. Point one at another and the handshake runs:

> PEER 203.0.113.7:2271
[+] Session established
> PEERS # who is known
> STATUS # sessions, uptime, fingerprint

Peers that complete a handshake are written to peers.cache and retried next start, so the mesh rebuilds itself after a reboot.

04 Use it

A client node opens a SOCKS5 proxy locally. Point a browser or a terminal at it and the traffic takes the mesh:

# client
GHOST_SOCKS5=1 ./target/release/vantablack

curl --socks5 127.0.0.1:1080 https://example.com

An exit node makes the real outbound connection, and serves nobody until you say who may ask:

GHOST_EXIT_ALLOWLIST=<fingerprint> GHOST_BIND=0.0.0.0:2271 ./target/release/vantablack

Use any instead of a fingerprint to open it to every node that completes a handshake. Bind 2271, not 2270: that port belongs to the discovery beacon.

05 Keep it yours

Identities are self-signed, so anyone can make one. Set the same 32-byte secret on every node you own and a handshake can only complete between them:

GHOST_PSK=0123…ef # 32 bytes, hex, identical everywhere

Addresses are never trusted. A node is its Ed25519 fingerprint, and a peer that reconnects from a new address is re-anchored to the same identity rather than treated as someone new.

Sharding, running for real

RS(2,1) over GF(256). Click a shard to lose it — the other two still rebuild your text exactly.

shard 0 · data
shard 1 · data
shard 2 · parity
Rebuilt from the surviving shards

Every frame is 512 bytes

Whether you send one byte or four hundred. Select a field for its bounds.

HASH
CTR
SHARD
FLAGS
ENCRYPTED SHARD — 486 B
TAG 16 B
JITTER
Session hash bytes 0 – 4

Truncated session identifier, also mixed into the AEAD nonce so nonces never collide across sessions.