A Radicle client and node, in Zig.
Early work in progress. Every layer is verified against authoritative sources
(Heartwood source, RFCs, git, and a live radicle-node).
Identity and encoding:
base58- base58btc (multibasez)NodeId- Ed25519 public key asdid:key:z6Mk...RepoId- repository identifierrad:z...canonical- Radicle canonical JSON (NFC-normalized, sorted keys, integer-only)Doc- identity document; its canonical git-blob hash is the RIDsigrefs- signed refs (rad/sigrefs)unicode- NFC via a forked zg
Wire protocol (spoken to a live node):
noise- theNoise_XKhandshake radicle uses (Edwards25519 DH)codec/protocol- QUIC-varint framing, streams, gossip messageswire- dial a node: ping/pong, signedNodeAnnouncement, gossipSubscribeannounce- encode and sign gossip announcementsgit.protocol- hand-rolled git protocol v2 client (ls-refs, fetch, sideband)fetch- clone a repo: git stream, v2 fetch, packfile indexed via libgit2
radish ping <host> <port> <node-id> handshake + ping/pong
radish announce <host> <port> <node-id> [alias] send a signed NodeAnnouncement
radish subscribe <host> <port> <node-id> [frames] listen to gossip (nodes + inventory)
radish fetch-probe <host> <port> <node-id> <rid> open a git stream, read the v2 advertisement
radish clone <host> <port> <node-id> <rid> <dir> clone a repo into <dir> (bare)
Requires a Zig 0.17-dev toolchain; a Nix flake pins it.
nix develop --command zig build test
nix develop --command zig build run
See REFERENCES.md for the Radicle protocol docs and the standards behind each encoding.