NYDUS NETWORK · DOCS

Sign your cluster to the swarm.

The Nydus Network is a federation layer for self-hosted AI clusters. This page covers the protocol, the client commands, and how to get your cluster on the map. The registry is live — the landing page renders the current clusters straight from it, with no manual list to keep.

01What Nydus is

The Nydus Network is the federation layer for self-hosted AI clusters — think of it as a directory that lets machines find each other and prove who they are. If you run an AI cluster, Nydus gives you a way to sign it with a cryptographic identity, publish what it can do (models, tools, agents), discover other clusters that offer what you need, and link to peers you trust. It is not a cloud, not a coordinator, and not an intelligence — it is the connective tissue between clusters that want to be found and clusters that want to be found useful.

Who it is for: multi-site organizations meshing clusters across HQ, edge, and labs — and enterprises running the same federation behind their own private, air-gapped registry.

At its core are five pieces. A registry — the public directory at nydus.zergs.net — stores cluster identities, signed capability manifests, heartbeats, peer relationships, and a tamper-evident ledger. A self-certifying cluster identity means a cluster cannot claim to be something it does not hold the key for. Capability sharing lets clusters advertise models, tools, and agents as signed, machine-readable units. Peer links are explicit, scoped connections between clusters — request, approve, and then exchange work. And the ledger keeps a signed, append-only record of what happened on the network.

THERE IS NO OVERMIND

The Nydus connects; nothing commands. The network knows what clusters offer, not what they think. It holds no credentials to your machines, it makes no decisions for you, and every switch — signing up, publishing, routing — is yours to flip. Air-gapped clusters are fully functional clusters; the Nydus is an add-on, never a requirement.

02The protocol

The trust model is simple and worth reading once: every cluster owns an Ed25519 signing keypair, and every claim a cluster makes is signed with that key. Nothing on the network is believed on good faith — everything is verified.

Self-certifying cluster_id

Your cluster id is derived from your public key, not assigned by anyone:

# 26 lowercase chars from [a-z2-7]
cluster_id = base32( blake3( ed25519_pubkey ) [0:16] )

Because the id is a hash of your public key, the registry re-derives the expected id from the key you present at registration and rejects any mismatch. You cannot register as a cluster you do not hold the private key for. Blue's live id, for example, is nzanfob55b2x73yzjonzi4k5ku, and the second live cluster, usw, derives to txm6sb62dhscra5hm5kb532i5a.

Signed manifests and envelopes

Your capability manifest — display name, capabilities, policies, validity window — is signed by your cluster key and stored as manifest.json + manifest.json.sig. Every mutating call to the registry is an Ed25519-signed envelope: {cluster_id, ts, nonce, …, signature}, where the signature covers the canonical JSON of every field except signature itself. The timestamp window and a random nonce make signatures replay-proof.

Per-cluster JWT

On first registration the registry issues your cluster an HS256 JWT. Subsequent mutating calls require both the JWT and a valid Ed25519 signature — defense in depth. When you announce new capabilities, the registry bumps your auth_epoch, which revokes every previously-issued JWT and mints a fresh one.

Peer scoping

Peering is always explicit and scoped. You request a peer link to a target cluster with a scope (for example {"tools":["web.search"]}); the target approves; and the peer link plus its token gate what your cluster can actually see and call. A peer without an approved link gets an HTTP 403.

Tamper-evident ledger

Every network event is recorded in a linear, append-only chain. Each entry stores a payload_hash (BLAKE3 of the canonical event data), the prev_hash of the entry before it, and an Ed25519 signature over the whole link. Modifying any stored field breaks either the signature or the hash link — so the record can be verified independently, entry by entry, via the public API.

Public API

The registry is a small HTTP API. Reads are public; writes are signed envelopes (plus JWT after registration).

EndpointReturns
GET /healthzRegistry liveness, registry id, hash algorithm
GET /api/v1/clustersPublic summaries of every registered cluster
GET /api/v1/cluster/{id}A cluster's signed manifest + live status
GET /api/v1/cluster/{id}/jwksJWK (RFC 8037) for a cluster public key
GET /api/v1/capabilities?need=model:X&need=tool:YWhich clusters satisfy each capability need
GET /api/v1/ledgerSigned ledger entries for independent verification
GET /api/v1/ledger/tailCurrent prev_hash for signing the next entry

Authenticated writes (register, heartbeat, announce, peer/request, ledger, rotate-key) take a signed envelope body and a Bearer JWT. Capability matching is exact or by family prefix — model:qwen3.8 matches qwen3.8:27b — and case-insensitive.

03Sign your cluster

The whole flow is four commands and one JSON file. Everything you need is the single-file client nydus_ctl.py, which ships with the nydus repository under client/.

Prerequisites

# Python 3.12+
pip install -r requirements.txt   # PyNaCl, blake3

blake3 (Rust-core pip package) is recommended; a byte-identical pure-Python BLAKE3 fallback is bundled in the client, so it works even where pip is restricted. keys generate cross-checks both when both are installed.

1. Generate your identity

Create a state directory and your Ed25519 identity + self-certifying cluster id:

python3 nydus_ctl.py keys generate .nydus
# wrote identity to .nydus/
#   cluster-signing.key  (ed25519 seed, mode 600)
#   cluster-signing.key.pub (SubjectPublicKeyInfo PEM)
#   state.json
# cluster_id: <your id>
# self-certification check passed: cluster_id == base32(blake3(pubkey)[0:16])

2. Build the signed capability manifest

Describe what your cluster can do in a caps.json, then sign it into a manifest:

{
  "models": ["qwen3.8:27b", "ling3.0:tiny"],
  "tools": ["web.search", "filesystem.read"],
  "agents": ["ops.oncall"],
  "worker_count": 8
}
python3 nydus_ctl.py manifest build .nydus --display-name my-cluster --capabilities caps.json
# wrote .nydus/manifest.json and .nydus/manifest.json.sig
# cluster_id: <your id>   display_name: my-cluster
# valid: 2026-... -> 2026-... (90 days by default)

Manifest defaults: not_before = issue time, validity 90 days. The display name defaults to your hostname if you omit --display-name.

3. Register with the network

python3 nydus_ctl.py register .nydus https://nydus.zergs.net
# self-certifying registration: the registry re-derives your id from your pubkey
# on success your cluster JWT is stored to .nydus/registry.jwt

From here on the registry URL is remembered in state.json, so later commands can omit it.

4. Heartbeat and announce

python3 nydus_ctl.py heartbeat .nydus --load 0.4 --inflight 2
python3 nydus_ctl.py announce .nydus --tool web.search --model qwen3.8:27b
# announce merges capability deltas into your manifest and returns a fresh JWT
INVITE-FIRST

Sign-up is invite-first today. The network is live and the map shows the current clusters, but registering a new cluster needs a signer. Join the waitlist and we'll get you one — your cluster can consume from the network before you're a signer, but appearing on the map takes an invite.

04Use the network

Discovery

Find clusters that offer what you need. --need is repeatable; each need is model:NAME or tool:NAME:

python3 nydus_ctl.py capabilities .nydus --need model:qwen3.8 --need tool:web.search
# model:qwen3.8  -> clusters serving a qwen3.8-family model
# tool:web.search -> clusters advertising a web.search tool

Peering

To work with another cluster, request a scoped peer link. The scope is a JSON allowlist of what the link may touch:

python3 nydus_ctl.py peer request .nydus <target-cluster-id> --scope '{"tools":["web.search"]}'
python3 nydus_ctl.py peer list .nydus
# list your peer links + granted peer tokens

Cluster-as-MCP

Every registered cluster is reachable as a standard Model Context Protocol server through the registry — any MCP-compatible client can discover a cluster's advertised tools and call them over HTTP, authenticated with the same trust as the rest of the API. Transport is JSON-RPC 2.0 over HTTP POST:

curl -s https://nydus.zergs.net/api/v1/mcp -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26"}}'

Endpoints: POST /mcp, POST /api/v1/mcp, and POST /mcp/{cluster_id} to target a specific cluster. Protocol surface: initialize, ping, tools/list, tools/call. Three tools are built into the registry itself:

ToolWhat it returns
cluster.infoA target cluster's signed manifest + live status
registry.statsRegistry totals: clusters, ledger entries, tail hash, uptime
network.discoverWhich clusters offer a capability need (the registry directory)
<cluster>:<tool>A cluster's advertised tool, e.g. nzanfob55b2x73yzjonzi4k5ku:web.search

Cross-cluster calls are scoped by your peer links: tools/list shows another cluster's tools only if you are that cluster, the registry admin, or an approved peer — and your peer token's scope further filters which tools are listable and callable.

05Verify the network

The registry is a public read API. Nothing on this page (or the landing page) needs to be taken on faith — every cluster's identity and every ledger entry is signed and checkable by hand. Here's how.

Check a cluster's signed identity against the JWKS

A cluster's id is self-certifying: cluster_id = base32(blake3(ed25519_pubkey)[0:16]). So verifying an identity is a two-step check — pull the public key, then confirm the id derives from it:

# 1. The cluster's signed manifest + its public key (PEM):
curl -s https://nydus.zergs.net/api/v1/cluster/nzanfob55b2x73yzjonzi4k5ku
# -> manifest.signing_pubkey_pem: the cluster's Ed25519 public key

# 2. The same key as a JWK (RFC 8037), keyed by cluster_id:
curl -s https://nydus.zergs.net/api/v1/cluster/nzanfob55b2x73yzjonzi4k5ku/jwks
# -> {kty:"OKP", crv:"Ed25519", kid: cluster_id, alg:"EdDSA", x: <base64url pubkey>}

Confirm the kid matches the cluster id you asked for, and that the x component decodes to the same bytes as the PEM in the manifest. The id is a hash of that key — if the key doesn't hash to the id, the identity is a forgery. Blue's live key, for example, is:

FieldValue
cluster_idnzanfob55b2x73yzjonzi4k5ku
kty / crv / algOKP / Ed25519 / EdDSA
x (base64url)mVfuuAVrbwSg7V1fnpDQzxoCQckfSwmBZV9N1LPbghA

Read the ledger (tamper evidence)

The ledger is a linear, append-only hash chain. Every entry stores a payload_hash (BLAKE3 of the canonical event data), the prev_hash of the entry before it, and an Ed25519 signature over the whole link. You can walk it entry by entry:

curl -s https://nydus.zergs.net/api/v1/ledger
# -> {"entries":[{"seq":1,"event_id":"<32 hex>","origin_cluster":"<id>",
#      "event_type":"<type>","payload_hash":"<64 hex>","prev_hash":"<64 hex>",
#      "ts":"...Z","status":"ok","signature":"<hex>"}, ...],
#      "count":N, "tail":{"prev_hash":"<tail hash>"}}

# The chain anchor and the current tail:
curl -s https://nydus.zergs.net/api/v1/ledger/tail
# -> {"prev_hash":"<tail hash>","genesis":"<genesis hash>"}

To verify the chain: each entry's prev_hash must equal the previous entry's payload_hash (the first entry chains from genesis), and each entry's signature must verify against its origin cluster's public key. Change any field in a stored entry and either the hash link or the signature breaks — the tampering is visible in seconds, no trust required. The registry also exposes GET /api/v1/ledger?cluster=<id> to filter a single cluster's trail.

HONEST

At the time of writing, the ledger is genesis-only — zero entries, because no cross-cluster event has been recorded yet. That is the truth, not a gap: the chain is live and ready, and every future event is verifiable the same way. The landing page's health strip reports the real ledger count, live.

06FAQ

Is it free?

Yes. The Community tier is free forever: browse the brood map, discover clusters, and consume published skills and models. The paid tiers (publisher, router, and enterprise/private-federation) exist for clusters that need to publish, route, or federate at scale — they're a later stage of the roadmap, not a paywall on the network.

Is joining required?

No — everything is fully opt-in. Signing up, publishing, and routing are three separate switches, and none of them are flipped for you. An air-gapped cluster is a completely functional cluster; the Nydus is an add-on, never a dependency.

Who is on it?

The network is live and intentionally small. The brood map on the landing page and the verified-cluster cards are rendered from GET /api/v1/clusters on every visit — nothing on the front page is hand-maintained, so a cluster appears the moment it registers and heartbeats (and is marked idle when it goes quiet). As a reference, blue's live id is nzanfob55b2x73yzjonzi4k5ku and usw's is txm6sb62dhscra5hm5kb532i5a.

How do I get my cluster listed?

Joining is invite-first: sign up for the waitlist and we'll get you a signer. Your cluster can consume from the network without one, but appearing on the map — publishing your identity and capabilities — requires an invite while the network is in its early phase.

Does it phone home?

No. Your cluster talks to the network only when you tell it to, and only what you opt into. There is no telemetry, no background traffic, and no heartbeat beyond the signed one you publish yourself. The network holds no credentials to your machines.

Can I run a private registry?

Yes. The Enterprise tier is a private, on-premises Nydus segment: your own air-gapped registry, full isolation and compliance, running the same protocol against your own directory. Public and private networks can coexist — the Nydus is a protocol before it is a place.

07See the live network

Sign your cluster and it appears on the map automatically after its first heartbeat. Watch the brood map light up, then sign your cluster when your invite lands.