Thu 10 Sep · 17:00 CEST · onlineCommunity Town Hall: the roadmap, the three colours, and a live provisioning demoAgenda and registration →

package-agent-network-green

Clojure / Babashka

Provision and manage a minimal, single-node NetBird Agent Network demo on Vultr or DigitalOcean from declarative desired state — a keyless, policy-gated LLM endpoint plus a network-isolated agent container running headless Claude Code. Use when asked to deploy, converge, inspect or delete a NetBird Agent Network, a keyless LLM gateway demo, or an isolated AI-agent sandbox with identity-based model access.

Installation
npx skills add https://github.com/getcolors/agent-network --skill package-agent-network-green

NetBird Agent Network on Vultr or DigitalOcean

A Green workflow that turns one colors.yml into a running Agent Network demo: OpenTofu for the machine, its provider firewall and two Cloudflare records (the base name and its wildcard); Ansible for Traefik, the combined netbird-server, the dashboard in agent-network-only mode, the NetBird reverse proxy in private mode, the control plane (provider, guardrail, policy, global limit), and the isolated agent container.

The demo's claim: the agent has no internet path — two independent boundaries, an internal Docker network and DOCKER-USER rules — and its only route to an LLM is the keyless agent-network endpoint over the WireGuard tunnel, where every request carries the peer's identity, passes the policy, and is metered. Convergence proves the claim (positive and negative space both) or fails.

Compute providers

provider-compute selects vultr or digitalocean; each provider has its own credential and its own provider-scoped keys, and the keys of the other provider are ignored, so one colors.yml can carry both.

Provider Credential Keys
vultr COLORS_PAR_VULTR_API_KEY vultr-region, vultr-plan, vultr-os-id, vultr-ssh-sources, vultr-http-sources, vultr-stun-sources
digitalocean COLORS_PAR_DO_TOKEN digitalocean-region, digitalocean-size, digitalocean-image, digitalocean-ssh-sources, digitalocean-http-sources, digitalocean-stun-sources

The provider firewall is the same rule set on both: 22 from the SSH sources, 80 and 443 from the HTTP sources, STUN over UDP from the STUN sources, nothing else. On DigitalOcean the droplet joins the region's default VPC, discovered at plan time; digitalocean-vpc-uuid and digitalocean-vpc-cidr are refused, because this package creates and pins no VPC. <provider>-name is optional and defaults to the profile. Keygen mode (the package owns ~/.ssh/<profile> when <provider>-ssh-keys is absent) works on both providers.

Switching providers is a rebuild, never an apply. A profile whose state already holds a machine refuses a create or delete under a different provider-compute — set it back, delete, then switch.

Verbs

./green build              # render .colors/<profile>/ — no provider calls, no credentials
./green create --dry-run   # walk the workflow, skip every side effect
./green create             # converge for real
./green delete             # guarded; needs a one-run override

Exit code 2 is validation or usage failure and lists every problem at once. The launcher walks up from the working directory to find colors.yml.

Before you converge

  • The hostname and its wildcard must be free in the Cloudflare zone. The DNS stage creates both and never adopts a foreign record.
  • Five credentials must be set in .envrc.private — the selected compute provider's, Cloudflare's, the two R2 keys and the Anthropic key; see references/configuration.md. Never export COLORS_PAR_PROFILE.
  • A deliberately fake COLORS_PAR_ANTHROPIC_API_KEY is a supported mode: the acceptance suite then expects Anthropic's own 401 relayed through the proxy, which still proves isolation, tunnel, policy and key injection while never producing a billable completion. Swap in a real key and re-run create to upgrade the demo to real completions.

Disposability

This deployment is disposable by design: no backups, and recovery is a guarded delete followed by create. The endpoint hostname and every peer identity are regenerated by the next create; nothing on the box is worth outliving it.

Operating

agent-network-status, agent-network-smoke, agent-network-bootstrap on the host. The dashboard admin password is generated on the host: /etc/agent-network/secrets/admin_password.

Rules

  • colors.yml is the only file to edit. .colors/ is generated: never edit it, read it as source, or commit it.
  • Credentials are COLORS_PAR_<UPPER_SNAKE_KEY> variables in the gitignored .envrc.private, never in colors.yml or documentation.
  • Never weaken compute-prevent-destroy in committed desired state.
  • The installed launcher is a copy, not a symlink. After npx skills update -p, copy .agents/skills/package-agent-network-green/green over the root ./green.