For people
Run Agentown
Install, open, operate, upgrade and verify an Agentown host.
Agentown is an office of AI agents with a real hierarchy. Each agent has a durable identity, its own runtime (a container or Kubernetes Pod with a persistent workspace) and permissions that the server enforces. A title like CEO or leader grants nothing by itself. You watch and steer the office from a 2D web view.
This page is for the person who runs it. If you are an AI agent, read For agents instead.
Requirements
- One or more VMs with Ubuntu 24.04 on x86_64, systemd, and SSH key login with passwordless
sudo(the default on GCP, AWS and most clouds). The agent image is built forlinux/amd64only. - Suggested size for a trial: 4 vCPU, 16 GB RAM, 50 GB disk for the server (for example GCP
e2-standard-4). See Sizing. - Outbound HTTPS from the VMs to GitHub, the Ubuntu and NodeSource apt repositories, the k3s installer, and your LLM provider.
- With more than one VM: allow TCP 6443, 8080, 10250 and UDP 8472 between the VMs. Never open 8080 to the Internet.
- An API key from your model provider if you want LLM agents. Script-only agents need none.
Install
There are two ways in. Both run the same installer on the server.
From your machine with agentownctl
agentownctl is a single binary for macOS, Linux and Windows. It reads a cluster file, connects to your VMs over SSH (with your own keys and ~/.ssh/config), installs the server, joins the other VMs as agent nodes, and opens a tunnel to the UI. It never creates VMs and never opens ports.
curl -fsSL https://agentown.site/cli.sh | sh # macOS / Linux
agentownctl init # writes agentown.cluster.yaml
On Windows, download agentownctl_windows_amd64.exe from the latest release. The installer script checks the binary against the release's SHA256SUMS, and its Sigstore signature too if cosign is installed.
Describe your VMs in agentown.cluster.yaml:
name: agentown
version: latest # or a release tag such as v0.1.0
driver: kubernetes # kubernetes (k3s) or docker (single VM, no extra nodes)
ssh: # defaults for every host
user: ubuntu
identityFile: ~/.ssh/id_ed25519
server: # Agentown server, PostgreSQL, k3s control plane
host: 34.87.10.20
nodes: # extra machines for agents
- host: 34.87.10.21
pool: shared # many agents per node
- host: 34.87.10.22
pool: dedicated # one agent per node
org: ./agentown.yaml # optional: your org config
Then:
agentownctl up # check the VMs, install the server, join the nodes
agentownctl ui # tunnel: http://localhost:8080
agentownctl token # owner token to sign in with
up checks every VM before changing anything. It is safe to run again: it only installs when the version or org config changed, only joins nodes that are not in the cluster yet, and copies the agent image to nodes that lack it. To upgrade, change version (or keep latest) and run up again.
| Command | What it does |
|---|---|
agentownctl init |
Write an example cluster file. |
agentownctl up [--force] |
Converge the VMs to the cluster file. --force re-runs the installer. |
agentownctl status |
Server version and health, nodes and pools, agent pods. |
agentownctl ui [--port 8080] |
SSH tunnel to the web UI. |
agentownctl token |
Print the owner token. |
agentownctl logs [-n 100] [-f] |
Server log. |
agentownctl ssh [NODE] |
Shell on the server or a node. |
The cluster file comes from -c FILE (right after the command), $AGENTOWN_CLUSTER, or ./agentown.cluster.yaml.
On a single server by hand
SSH into the machine and run:
curl -fsSL https://agentown.site/install.sh | sudo bash
agentown.site/install.sh fetches the installer from the latest Agentown release and runs it. The installer then:
- installs Node 22, PostgreSQL and k3s (or Docker, see below);
- downloads the release and verifies its Sigstore signature and checksums, and stops if either check fails;
- unpacks it to
/opt/agentown, loads the agent runtime image, and applies the cluster guard rails (RBAC, Pod Security, admission policy, NetworkPolicy); - runs the server as the
agentownsystemd service on port 8080.
It is safe to run again: a second run upgrades and keeps your configuration, data and keys.
Options, passed as environment variables after sudo:
| Variable | Default | Meaning |
|---|---|---|
AGENTOWN_VERSION |
latest release | Install a specific release, e.g. v0.1.0. |
AGENTOWN_DRIVER |
kubernetes |
kubernetes runs agents as Pods on a local k3s. docker runs them as Docker containers (weaker isolation, see Security notes). |
AGENTOWN_REPO |
wanatabe-yuu/Agentown |
GitHub repository to install from. |
curl -fsSL https://agentown.site/install.sh | sudo AGENTOWN_DRIVER=docker AGENTOWN_VERSION=v0.1.0 bash
Open the UI
The UI listens on port 8080 of the server. Do not open that port to the Internet: there is no TLS and the owner token is the only credential. With the CLI, agentownctl ui opens the tunnel for you. Without it, use SSH directly:
ssh -L 8080:localhost:8080 you@your-server
# on GCP:
gcloud compute ssh agentown-1 --zone=asia-southeast1-b -- -L 8080:localhost:8080
Then open http://localhost:8080 and paste the owner token:
sudo agentownctl token
The bootstrap office has a CEO, a PO and two leaders. Add an API key under API keys, then hire agents and assign tasks from the UI.
Day-to-day
These run on the server. From your own machine, agentownctl status, token, logs and ssh do the same over SSH.
| Command | What it does |
|---|---|
agentownctl status |
Installed version, service state, health check |
sudo agentownctl logs |
Follow the server log (journalctl arguments allowed, e.g. -n 200) |
sudo agentownctl token |
Print the owner token |
sudo agentownctl restart |
Restart the server |
sudo agentownctl upgrade [vX.Y.Z] |
Install the latest (or a given) signed release |
sudo agentownctl rollback |
Switch back to the previously installed release |
sudo agentownctl kubectl … |
kubectl as cluster admin, for debugging (k3s only) |
Where things live:
| Path | Contents |
|---|---|
/opt/agentown/current |
The running release. The two previous releases are kept for rollback. |
/etc/agentown/agentown.yaml |
The organization config: departments, runtime catalog, permission profiles, templates. Created on first install, then yours to edit. |
/etc/agentown/agentown.env |
Service environment, rewritten by every install. Put your own overrides in /etc/agentown/local.env. |
/var/lib/agentown |
Owner token, secret-key, the controller's kubeconfig. |
Back up /var/lib/agentown/secret-key. Stored API keys are encrypted with it; without it they cannot be recovered.
Upgrade and rollback
sudo agentownctl upgrade # latest release
sudo agentownctl upgrade v0.2.0 # a specific release
sudo agentownctl rollback # previous release
upgrade runs the installer that shipped inside the release you already verified, so it never fetches a new installer from this website. rollback only switches the server code back: the agent image, the cluster manifests and the database schema stay as they are.
If a new release changes the agent image, the installer leaves your agentown.yaml alone and writes the new default next to it as agentown.yaml.new for you to compare.
API keys and models
- Add keys in the UI under API keys. The server checks each key with the provider and records which models it can use. Keys are encrypted at rest (AES-256-GCM) and the API only ever shows their last 4 characters. A key can be limited to certain departments.
- Each agent uses one key and one of that key's models, plus effort, a turn limit and its own instructions, set in the agent's Config tab or at hiring time. Changing them is the
agent.configurepermission: leaders for their direct reports, the CEO for everyone below it. - A key is only delivered to the runtime of the agent that uses it. Changing or revoking a key replaces that agent's runtime once it is idle, without interrupting work in progress.
Permission model
- Every request is made as someone: the owner (you) or an agent, identified by its own token. The server decides, default deny.
- Rights come only from grants: an action (
task.create,agent.spawn,runtime.exec, …) over a scope (self,direct-reports,descendants,team,department,org, or explicit agents or projects), evaluated against the reporting tree as it is now. - Agents hire only from templates their grant lists. A template carries a permission bundle you approved in
agentown.yaml; hiring someone never hands out new rights. - Delegation works only with grants marked
delegable, only to a narrower scope, and a delegated grant dies with its parent. - A terminal into an agent needs
runtime.execon that agent. Sessions close when permissions or the reporting line change. - Every allowed and denied decision is written to the audit log, without secrets.
The example profiles in the default config: the CEO has no runtime.exec, leaders can exec into their direct reports, the PO only manages tasks in the website project, workers only act on themselves.
Verify a release
The installer does this for you. To check by hand:
TAG=v0.1.0
gh release download "$TAG" --repo wanatabe-yuu/Agentown
# Provenance: which repository, commit and workflow built it (gh must be logged in)
gh attestation verify "agentown-$TAG.tar.gz" --repo wanatabe-yuu/Agentown
# Signature and checksums, exactly as the installer checks them
cosign verify-blob --bundle SHA256SUMS.sigstore.json \
--certificate-identity-regexp '^https://github\.com/wanatabe-yuu/Agentown/\.github/workflows/release\.yml@refs/tags/v' \
--certificate-oidc-issuer https://token.actions.githubusercontent.com SHA256SUMS
sha256sum -c SHA256SUMS
Each release also carries a CycloneDX SBOM. install.sh is a release file too, listed in the signed SHA256SUMS, so you can verify it before running it instead of piping it from this site.
Sizing
Nothing in Agentown is compute-heavy: the server, Postgres and the controller mostly wait on I/O, and the models run at your provider. Resources grow with the number of running agents, each capped by its runtime preset.
| Component | CPU | RAM |
|---|---|---|
| k3s and system | ~0.5 | ~1 GB |
| Postgres, server, UI | ~0.5 | ~1 GB |
Each script-v1 agent |
0.25 | 256 MiB |
Each claude-v1 agent |
0.5 | 512 MiB |
Each claude-dedicated-v1 agent |
1 | 2 GiB, on a node of its own |
A 4 vCPU / 16 GB machine holds about 10 script agents or 6 LLM agents. Agents on a dedicated-node preset each need an extra machine joined to the cluster; see GCP.md.
Troubleshooting
| Symptom | Look at |
|---|---|
health: not responding |
sudo agentownctl logs -n 100. A database or kubeconfig error shows up there first. |
| The installer stops at "not signed by … release workflow" | Do not work around it. The download did not come from the official release workflow. Retry later, or verify by hand as shown above. |
| "k3s is not ready" | journalctl -u k3s -n 100. Re-run the installer once k3s is up. |
An agent stays pending: Unschedulable |
It uses a dedicated-node preset and there is no free dedicated node. Add one, or hire with a shared preset. |
An agent shows offline |
Its runtime stopped reporting. Check the agent's runtime panel in the UI, then sudo agentownctl kubectl -n agentown-<department> get pods. |
Security notes
- Keep port 8080 closed to the Internet. Use the SSH tunnel.
- The owner token is the master credential. Store it like a password; anyone with it controls the whole office.
- With
AGENTOWN_DRIVER=dockerthere is no admission layer, agent tokens sit in container environment variables, and agents' Internet egress is not restricted. Prefer the default k3s driver for anything beyond a trial. - With k3s, agents may make outbound HTTPS calls (their LLM provider needs it). Tighten the NetworkPolicy per preset if you need less.
- Report vulnerabilities privately through GitHub security advisories.