Watch
0
0
Fork
You've already forked hyperhive
0
a swarm o agents, each in its own nspawn cage, gossiping over unix sockets. config changes flow as git commits, the operator approves them in a browser, every deploy is a tag. cyberpunk-themed dashboard included. 💜⚡
  • Rust 66.3%
  • Nix 22.3%
  • TypeScript 5.6%
  • JavaScript 2.6%
  • CSS 2.1%
  • Other 1.1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
atlas d0c2b85d45 swarm-nats-auth: limit hive and swarm-controller subscribe to the subjects they use
A hive's queue credential and the swarm controller's could subscribe to
every subject in the swarm account, so a hive could read every other
hive's deploy requests and every agent's terminal, state, input and
request replies.

Their grants now carry a subscribe allow-list:

- a hive `hive-<h>`: `$SWARM.knowledge`, `$SWARM.deploy.<h>` and its
  reply inbox `_INBOX.client.hive-<h>.>`
- the reader (swarm-controller): `$SWARM.term.*`, `$SWARM.term.*.sub.*`,
  `$SWARM.agent-state.*` and its reply inbox
  `_INBOX.client.<client-id>.>`

`swarm_queue_client::connect`, which hive-c0re and swarm-controller both
use, now connects with `_INBOX.client.<client-id>` as its inbox prefix,
the same shape agents got for their own credential. In async-nats 0.50
every request reply and every ordered consumer (the hive's wanted-state
watch, the controller's KV key listings) delivers under that prefix, so
the one inbox grant covers them all.

A hive or controller still on a build without the prefix has every
JetStream reply refused once the responder runs this policy, so the
clients need to be rebuilt before, or with, swarm-nats-auth.

Closes #4945
2026-10-07 16:05:36 +02:00
.forgejo/workflows swarm CA: describe the store's pki root as the only anchor in docs and comments 2026-10-05 21:17:10 +02:00
branding swarm-ui: make it installable as a PWA 2026-09-12 11:30:20 +02:00
claude-plugins claude-plugins: format the swarm-logs skill with nix fmt 2026-09-17 15:17:33 +02:00
docs swarm-nats-auth: limit hive and swarm-controller subscribe to the subjects they use 2026-10-07 16:05:36 +02:00
frontend container stats: measure agent disk usage through hive-priv, unknown on failure 2026-10-05 18:56:46 +02:00
hive-agent swarm CA: describe the store's pki root as the only anchor in docs and comments 2026-10-05 21:17:10 +02:00
hive-agent-mcp hive-c0re: remove the approvals subsystem 2026-10-04 23:55:32 +02:00
hive-agent-sock hive-c0re: remove the approvals subsystem 2026-10-04 23:55:32 +02:00
hive-bash-mcp hive-bash-mcp: drop the redundant output-path line from status's description 2026-09-13 15:56:10 +02:00
hive-c0re swarm CA: describe the store's pki root as the only anchor in docs and comments 2026-10-05 21:17:10 +02:00
hive-core-agent-sock hive-c0re: remove the approvals subsystem 2026-10-04 23:55:32 +02:00
hive-forge swarm CA: describe the store's pki root as the only anchor in docs and comments 2026-10-05 21:17:10 +02:00
hive-forge-notify github: PATs live in swarm bao; the agent fetches them itself 2026-10-02 17:48:27 +02:00
hive-host-sock swarm-ci-runner: run the forge CI runner as a swarm service 2026-10-05 13:55:37 +02:00
hive-jobq treefmt: apply prettier 2026-09-02 15:25:07 +02:00
hive-jobq-metrics move otel_http_client from swarm-queue-client into swarm-controller 2026-08-29 11:17:24 +02:00
hive-jobq-wire address review: move parse_states/filter_nodes_by_state to hive-jobq-wire, rename placeholder enums, trim core-mirroring framing 2026-08-16 16:59:54 +02:00
hive-log log: send records natively to journald, keep stdout off-unit 2026-09-21 15:52:57 +02:00
hive-matrix-mcp hive-matrix-mcp: fix list_rooms/list_invites docs to say room_id, not id 2026-10-04 20:40:15 +02:00
hive-metric docs(readmes): drop mentions of nonexistent fields 2026-10-02 11:40:07 +02:00
hive-priv container stats: bound hive-c0re's wait for the disk measurement, no total for an agent with no paths 2026-10-05 18:56:46 +02:00
hive-priv-sock container stats: bound hive-c0re's wait for the disk measurement, no total for an agent with no paths 2026-10-05 18:56:46 +02:00
hive-runtime hive-runtime: re-export ACP_API_KEY_ENV_ENV 2026-09-30 22:55:03 +02:00
hive-screen-mcp hive-screen-mcp: bound grim/wtype and VNC calls; hive-c0re: make messages match the code 2026-09-27 20:47:06 +02:00
hive-sh4re hive-c0re: remove the approvals subsystem 2026-10-04 23:55:32 +02:00
hive-sock-client remove the create_repo agent tool 2026-10-01 09:04:17 +02:00
hive-subagent-mcp hive-subagent-mcp: a refused continue leaves the session's records alone 2026-10-07 13:18:07 +02:00
hive-types use a neutral forge name in link-form placeholders, schema examples and tests 2026-10-04 15:51:20 +02:00
hivectl swarm CA: retire the host-held root CA, the store holds the only anchor 2026-10-05 21:17:10 +02:00
nix nats-callout-removed: remove the container's OIDC secret copy here, ungated 2026-10-06 15:25:29 +02:00
scripts scripts: prefer the forge remote over alphabetical order when picking check-attribution-trailers.sh's base ref 2026-10-04 22:12:01 +02:00
swagger-ui-theme treefmt: apply prettier 2026-09-02 15:25:07 +02:00
swarm-authelia-bridge swarm options: no swarm.* value depends on a deploy option or this host's hive 2026-10-04 18:13:47 +02:00
swarm-authelia-bridge-sock swarm-controller: make authelia's operators matrix homeserver admins 2026-10-04 16:45:08 +02:00
swarm-controller swarm CA: describe the store's pki root as the only anchor in docs and comments 2026-10-05 21:17:10 +02:00
swarm-logs swarm CA: describe the store's pki root as the only anchor in docs and comments 2026-10-05 21:17:10 +02:00
swarm-matrix-client matrix: drop the per-hive appservice and its unused token 2026-10-05 07:48:17 +02:00
swarm-matrix-ctl matrix: drop the per-hive appservice and its unused token 2026-10-05 07:48:17 +02:00
swarm-nats-auth swarm-nats-auth: limit hive and swarm-controller subscribe to the subjects they use 2026-10-07 16:05:36 +02:00
swarm-queue-client swarm-nats-auth: limit hive and swarm-controller subscribe to the subjects they use 2026-10-07 16:05:36 +02:00
swarm-secret-client swarm-nats-auth: open sealed callout requests and seal the replies 2026-10-05 23:25:36 +02:00
swarmctl swarm: named scheduled prompts for one or more agents, fired in each agent 2026-10-04 17:24:57 +02:00
.gitignore docs: address review — redundancy proof for Passive, wave-2 split, re-enable Contractions 2026-09-07 11:56:31 +02:00
.mailmap chore(#2165): add damocles@pr1ma + lexis@pr1ma mailmap entries 2026-07-04 13:50:16 +02:00
.prettierignore hive-c0re: remove the approvals subsystem 2026-10-04 23:55:32 +02:00
.prettierrc temp: add prettier configs 2026-07-02 23:33:11 +02:00
.vale.ini docs: disable write-good.TooWordy -- 100% dictionary mismatch on this corpus 2026-10-04 17:09:58 +02:00
Cargo.lock swarm-nats-auth: bound the OIDC secret re-read, and test the 401 that starts it 2026-10-06 15:25:29 +02:00
Cargo.toml deps: bump hive-claude to 0.1.2 2026-10-04 23:35:49 +02:00
CLAUDE.md docs: the hive has no approval queue 2026-10-04 23:55:32 +02:00
clippy.toml swarm-logs: an agent's CLI for the swarm log store 2026-09-17 01:02:14 +02:00
flake.lock nix flake update 2026-10-06 09:36:21 +02:00
flake.nix swarm-ci-runner: run the forge CI runner as a swarm service 2026-10-05 13:55:37 +02:00
README.md swarm CA: retire the host-held root CA, the store holds the only anchor 2026-10-05 21:17:10 +02:00

hyperhive

a swarm of coding agents with one control plane: one identity, one forge, one homeserver, one secret store, one UI. agents run caged on whichever host has room. config changes flow as git commits, the operator approves them in a browser, every deploy is a tag. cyberpunk dashboards included. 💜⚡

→ website · → docs · → options reference

A coding agent is great in one window, exponentielle across many — as long as the agents stay off each other's toes, keep a durable identity, and leave production alone. hyperhive is a set of NixOS modules that runs that many-agent setup as a swarm:

  • the swarm is where things live — agent identities and accounts, secrets, the job graph that creates and places agents, telemetry, and the UI you drive it all from.
  • hives are the substrate — NixOS hosts that run agent containers on the swarm's behalf. Add a hive to add capacity.

Start with everything on one box; move services and add hives as the swarm grows. Which host runs what is a per-host deploy.* toggle, not an architecture change.

concern how hyperhive answers it
control plane swarm-controller holds the hive directory, the agent roster and the job graph. Create an agent from the swarm UI or swarmctl agent create --hive <h>: it provisions the SSO identity, forge user and config repo, then deploys the agent onto that hive
identity every agent is a swarm-wide principal — SSO subject, forge user, matrix account, secret-store cert identity — addressable as name@hive.domain
secrets one OpenBao store; the operator places one mTLS identity per host, and everything else — every agent's credentials included — is fetched from the store under an identity rather than copied by hand
shared services one forge, homeserver, SSO, message queue and metrics/logs stack per swarm, each on whichever host you put it
config git: an agent opens a PR on its config repo, an operator merges it on the forge, and the merge deploys
runtime claude --print by default; any ACP agent (e.g. opencode) per agent with services.hyperhive.agent.runtime = "acp"
substrate each hive runs one nixos-container per agent, under an unprivileged daemon with a tiny socket-activated helper for the few root ops
watching the swarm UI (hives, agents with live terminals, jobs, a cross-repo issue report), Grafana over OTEL, and a per-hive dashboard for host-level detail

Shape

the swarm — one of each, each on whichever host you choose
│
├── swarm-controller       hive directory, agent roster, job graph
│   ├── swarm-ui           the operator's UI, served off the gateway on the swarm apex
│   └── swarmctl           its CLI, on the controller's host
├── swarm-authelia         SSO in front of the swarm UI, forge, grafana, …
├── swarm-bao              OpenBao — secrets, a cert identity per agent
├── hive-forge             Forgejo — per-agent accounts, config repos
├── hive-matrix            tuwunel — matrix homeserver, per-agent accounts
├── swarm-nats             message queue (JetStream KV: hive status, …)
├── swarm-otel             telemetry collector, sole holder of upstream creds
├── swarm-victoriametrics  metrics store
├── swarm-victorialogs     log store
├── swarm-grafana          dashboards over both stores
│
└── opt-in, not part of singleHostSwarm
    ├── swarm-ci-runner        Forgejo Actions runner (deploy.ci-runner)
    ├── swarm-snapshot-store   btrfs-receive endpoint for agent snapshots
    └── wg-hive                WireGuard mesh between hives (deploy.wireguard)

the hives — the substrate, as many as you like (deploy.hive-controller.enable)
│
├── hive-c0re      runs the agent containers: lifecycle, broker,
│                  auto-rebuild, the per-hive dashboard; unprivileged
├── hive-priv      root helper, socket-activated, does bind-mounts + nsenter
├── hive-gateway   nginx + dnsmasq on :80/:443, fronts every agent's web UI
├── hivectl        host-level CLI
│
└── agent containers
    ├── h-ruth     manager — privileged MCP surface, configures agents
    └── h-<name>   agent — claude / ACP runtime, MCP tools, web UI

Inside an agent

Every agent is a full NixOS container with its own unix user (passwordless sudo inside the cage) and a durable, self-compacting session. Out of the box it gets:

  • messaging — send / recv to other agents and the operator, remind to wake itself, scheduled prompts the operator sets for it at swarm level, and a todo list that forge notifications and other producers feed. → schedules
  • background bash — long-running commands as tracked tasks (run / status / kill), so a build doesn't block the turn. → bash
  • subagents — nested sessions on the agent's own runtime, optionally re-prompted toward a goal over several turns. → subagent
  • forge — its own Forgejo account, the hive-forge CLI, git credentials, and notifications turned into todos. Optional linked accounts on other forges, and GitHub (gh + push) via services.hyperhive.agent.github.enable. → forge · github
  • matrix — its own account(s) on the swarm homeserver, as MCP tools. → matrix
  • knowledge — the swarm's shared internal/knowledge repo, read-only at /knowledge, plus hyperhive's own docs in the container. → knowledge
  • web UI — a per-agent page behind the gateway: live terminal of the turn stream, model / effort switching, cancel, /compact.
  • GUI (opt-in, services.hyperhive.agent.gui.enable) — a Wayland desktop with screenshot / keyboard / mouse tools, viewable over VNC in the web UI.
  • your own tools — any extra MCP server (stdio or http) via services.hyperhive.agent.extraMcpServers, and any NixOS config you'd put on a machine.

Quick start: an all-local swarm

The whole swarm on one box — a hive plus every shared service. Good for a dev box or a single-host deployment; docs/swarm/ covers spreading a swarm across hosts.

{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-26.05";
    hyperhive = {
      url = "git+https://forge.darkest.space/hyperhive/hyperhive";
      inputs.nixpkgs.follows = "nixpkgs"; # see "Overriding nixpkgs"
    };
  };

  outputs = { nixpkgs, hyperhive, ... }: {
    nixosConfigurations.my-host = nixpkgs.lib.nixosSystem {
      system = "x86_64-linux";
      modules = [
        hyperhive.nixosModules.default # the whole host stack, one import
        {
          services.hyperhive = {
            deploy.singleHostSwarm = true;        # every swarm service on this machine
            deploy.hive-controller.enable = true; # …and a hive to run agents on

            swarm.domain = "hive.example";        # the swarm's DNS domain
            hiveName = "pr1ma";                   # this hive's label in it
            swarm.hives.pr1ma = { };              # the directory: just us

            # c0re.operatorPronouns = "they/them"; # default "she/her"
          };

          # ... the rest of your host config
          system.stateVersion = "25.11";
        }
      ];
    };
  };
}

singleHostSwarm turns on everything an all-on-one-box swarm implies: the shared services above, the swarm controller, and /etc/hosts entries so the hive's names resolve on the box itself. claude-code is unfree — hyperhive scopes the allowance to itself, so there's nothing to set.

After nixos-rebuild switch the swarm UI answers on the swarm domain, and the hive brings up the manager agent (ruth). A few steps stay deliberately human — initialising the secret store, giving ruth her store identity, creating your SSO account. Walk through docs/getting-started/setup.md once, top to bottom.

Overriding nixpkgs

hyperhive pins its own nixpkgs so it builds standalone in CI. The follows line above builds it against your host's nixpkgs instead: one evaluation, no version drift. It works as long as your channel is close to the nixos-26.05 hyperhive develops against — drop it if a much older or newer channel breaks in ways hyperhive's CI doesn't catch.

Operating it

  • swarm UI — the day-to-day surface, on the swarm apex behind SSO (admins group): hive roster and status, every agent with its live terminal and wanted state, creating agents, linking external forge and matrix accounts, the job graph, a cross-repo issue report. → docs/swarm/ui.md
  • swarmctl — the swarm's CLI, on the swarm-controller host: create agents and mint their identities, manage SSO users, make forge admins. → reference
  • per-hive — each hive's dashboard (container state, rebuild queue) and hivectl for host-level administration and container shells. → docs/web-ui/ · hivectl

You are an SSO user too: swarmctl user add <you> --group admins, and a first login through authelia creates your forge and matrix accounts; swarmctl forge make-admin <you> promotes the forge one, and the matrix one becomes a homeserver admin within five minutes of that first login.

docs/README.md is the index, grouped by question — pick the page for your task rather than reading front to back. Some common entry points:

Hacking on it

nix develop -c cargo check
nix flake check            # rust + nix + toml fmt, clippy, module-eval tests

# in your host flake:
nix flake update hyperhive
sudo nixos-rebuild switch --flake .#<host>

Conventions (commit style, no #[allow(clippy::…)], the pre-push hook) live in docs/process/conventions.md. Issues + backlog are on the forge.