#
hyperhive
> a swarm of claude-code 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. ๐โก
Claude code is great in one window, _exponentielle_ across many โ but
only if you can keep the agents from stepping on each other, give them
durable identity, and stop them from eating production. hyperhive is
the substrate.
- identity = unix socket
- communication = sqlite-backed broker (`send` / `recv` / `ask` /
`answer` / `remind`)
- config = git (manager proposes, operator approves, deploys land as
tagged commits)
- blast radius = container
```
host (NixOS, runs hive-c0re.service)
โ
โโโ operator
โ โโโ browser โ :80 (hive-gateway) dashboard + per-agent UIs
โ โ /agent// โ per-agent unix socket
โ โโโ CLI โ /run/hyperhive/host.sock admin protocol
โ
โโโ hive-c0re (Rust daemon: lifecycle / broker / approvals /
โ auto-update / dashboard / sockets)
โ
โโโ optional containers
โ โโโ hive-gateway nginx โ proxies :80 โ c0re dashboard + per-agent sockets
โ โโโ hive-forge Forgejo โ per-agent accounts, config mirror (agent-configs/)
โ โโโ hive-matrix tuwunel โ Matrix homeserver + per-agent accounts
โ
โโโ agent containers
โโโ h-ruth manager (privileged MCP surface, approval gating)
โโโ h- sub-agent (claude + MCP tools + per-agent web UI + unix socket)
```
**[โ website](https://hyperhive.darkest.space)** ยท
**[โ options reference](https://hyperhive.darkest.space/options/)**
Depth lives in [`docs/`](docs/) โ pick the one matching your task:
| reading path | doc |
| --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| dashboard layout + endpoints | [`docs/web-ui.md`](docs/web-ui.md) ([shape](docs/web-ui/shape.md) ยท [dashboard](docs/web-ui/dashboard.md) ยท [agent](docs/web-ui/agent.md)) |
| claude turn loop + MCP tools | [`docs/turn-loop.md`](docs/turn-loop.md) |
| config-edit + approval state machine | [`docs/approvals.md`](docs/approvals.md) |
| what survives destroy / purge / restart | [`docs/persistence.md`](docs/persistence.md) |
| naming, wire protocol, commit style | [`docs/conventions.md`](docs/conventions.md) |
| nginx vhost map + sub-domain routing | [`docs/gateway.md`](docs/gateway.md) |
| NixOS / nspawn gotchas | [`docs/gotchas.md`](docs/gotchas.md) |
## Quick start
Minimal `flake.nix` for a host that runs hive-c0re:
```nix
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-26.05";
hyperhive.url = "git+https://forge.darkest.space/hyperhive/hyperhive";
# Pin hyperhive to your own nixpkgs instead of the one it ships with
# (see "Overriding nixpkgs" below) โ recommended for most hosts:
hyperhive.inputs.nixpkgs.follows = "nixpkgs";
};
outputs = { nixpkgs, hyperhive, ... }: {
nixosConfigurations.my-host = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
hyperhive.nixosModules.default # hive-c0re + hive-forge + hive-gateway in one import
({ ... }: {
services.hyperhive.enable = true;
# services.hyperhive.c0re.operatorPronouns = "they/them"; # default: "she/her"
# ... rest of your host config
system.stateVersion = "25.11";
})
];
};
};
}
```
hive-c0re opens its admin socket + dashboard, auto-creates the
manager container, and auto-rebuilds any container whose hyperhive
rev goes stale. `claude-code` is unfree โ hyperhive scopes the
whitelist to itself, nothing for the operator to set.
### Overriding nixpkgs
hyperhive pins its own `nixpkgs` so it builds standalone in CI. Add
`hyperhive.inputs.nixpkgs.follows = "nixpkgs"` (as in the quick-start above)
to build it against your host's `nixpkgs` instead โ one less nixpkgs
evaluation, no version drift from the rest of your system. Standard flake
`follows` pattern; works as long as your channel is reasonably close to the
`nixos-26.05` hyperhive develops against. Drop it again if a much
older/newer channel hits breakage hyperhive's CI doesn't catch.
For the full list of host and agent NixOS options see the
**[options reference](https://hyperhive.darkest.space/options/)**.
## Agent configuration
Per-agent config lives in each agent's `agent.nix` (proposed, operator-approved, deployed as git commits). Two accounts an agent can hold, both provisioned mostly outside of nix:
- **A second Matrix identity**, beyond the hive-internal one (e.g. an
external-facing account alongside the internal one) โ see
[`docs/tools/matrix.md`](docs/tools/matrix.md) for the
`hyperhive.matrixAccounts` option and setup.
- **A managed GitHub identity** (`gh` CLI + `git push` over HTTPS) โ on
by default, provisioned by pasting a PAT into the agent's dashboard
credentials tab, nothing to declare in nix. See
[`docs/github.md`](docs/github.md) for setup and the disable flag.
## Operator CLI
`hivectl` is the operator-facing host CLI for ad-hoc administration that
doesn't go through the broker (built alongside `hive-c0re` when the host
module is enabled):
```sh
sudo hivectl forge create-user mara # provisions a forge user
sudo hivectl forge create-user mara --password 'hunter2' # โฆ with a fixed password
sudo hivectl matrix create-user mara # provisions a matrix user
sudo hivectl matrix create-user mara --password-stdin # โฆ reading one line from stdin
```
For agent names (i.e., a `Coordinator::agent_state_root(name)` exists),
`hivectl` persists the resulting token to the agent's state dir like the
boot sweep does. For non-agent names (e.g. the operator's own forge/matrix
account), it prints the token to stdout and writes nothing.
## Build / deploy
```sh
nix develop -c cargo check
nix flake check # rust + nix + toml fmt + clippy
# deploy from a host config that imports hyperhive.nixosModules.default
nix flake update --update-input hyperhive
sudo nixos-rebuild switch --flake .#
```