hamma
A clean-room Rust implementation of a Tailscale-compatible mesh networking stack. Pre-alpha, actively implementing the peer client against a real reference control plane.
RECORDING FORTHCOMING: cargo test -p hamma-core && cargo test -p dictyon — the Noise-handshake and control-protocol-type tests passing
What it is
hamma is a clean-room Rust implementation of a Tailscale-compatible mesh networking stack: the pieces needed to knot a set of devices into one flat network, speak WireGuard peer-to-peer, traverse NATs through DERP relays, and name each other through MagicDNS. It targets wire compatibility with Tailscale’s existing control plane, so a device running hamma can join the same tailnet as a device running the reference client. It exists because no production-grade Rust implementation of that protocol exists yet, and it’s meant to fill that gap both for this practice’s own systems and openly, for anyone who wants a memory-safe, auditable mesh client.
Decisions and trade-offs
Clean-room, not a port
hamma is written from the protocol spec and public behavior, not translated line-by-line from Tailscale’s Go client. No vendor blobs, no unsafe beyond what the underlying boringtun crate already audits. The trade-off: a clean-room implementation is slower to reach feature parity than a direct port would be, since nothing gets carried over for free. The reasoning: a port inherits whatever the original got wrong along with what it got right; a clean-room build only has to be correct against the wire protocol.
| Decision | Chose | Rejected | Cost accepted |
|---|---|---|---|
| Validation order | Validate dictyon against Tailscale’s actual production control plane first | Building the self-hosted histos server first | No self-hosted option yet; Phase A depends on the vendor’s control plane |
| Feature scope | Peer WireGuard, MagicDNS, exit nodes, ACLs | Matching Tailscale’s full feature surface (Taildrop, SSH, Funnel, app connectors) | Real features left out until there’s demand, not built speculatively |
What’s solid / what’s open
Solid: the Noise handshake, control-protocol types, TCP/TLS registration, and the map-streaming loop, all landed as part of Phase A’s dictyon peer client.
Open, stated as the repo itself states it: pre-alpha, no releases yet, no stable API. The next implementation milestone is the WireGuard data plane via boringtun — until that lands, there’s no working end-to-end tailnet, and this page won’t imply otherwise. An open audit backlog tracks known gaps in map deltas, frame handling, node-key expiry, tracing, and map-stream integration coverage.
Numbers, and how they were measured
| Claim | Method | Where to check |
|---|---|---|
| 4,091 lines Rust (code-only), 5,112 including comments | tokei against a local clone, 2026-07-20 | reproducible: tokei on a fresh clone |
2 workspace crates (dictyon peer client, hamma-core shared types) | crate count in the workspace Cargo.toml | reproducible on a fresh clone |
Smallest of the systems on this site, by design — the newest and least mature, not padded to look bigger than it is.
Where to look
- Repo: github.com/forkwright/hamma
- Design principles, in the project’s own words:
README.md - The peer client:
crates/dictyon/; shared protocol types:crates/hamma-core/