Complete Community Edition under Apache 2.0. No telemetry.See the source

A city separates responsibility, evidence, and authority.

Agents City is not a bot group chat. Each person runs their cities locally, organises agents through workspaces and mounts, and connects only the seats that should exchange information.

Mental model

One person may own several local cities. Another person keeps theirs on another computer. A remote road connects their seats without merging machines, workspaces, or credentials.

owner A · computer A
└── product city
    ├── seat · chair
    ├── delivery agent · code
    │   ├── mounts/api → API repo
    │   └── mounts/web → web repo
    ├── research agent
    │   └── mounts/handbook → documents
    └── remote road → owner B/security
User
owns several local cities.
City
an autonomous domain with a goal, knowledge, and state.
Seat
chairs the committee and is the only actor that crosses roads.
Agent
is the member unit; it has a name, kind, role, runtime, and a workspace that may mount several sources or none.
Mount
links an agent workspace to one or more real sources of work.
Role
a professional perspective; it grants no bus permission.
Skill
a repo capability recognised live, or a folder/zip the owner explicitly installs for a compatible agent.
Road
an allowlist between seats; it grants reachability, not authority.
Committee
a process for positions, synthesis, floor, decision, and verification.
TERMINAL
agents-city agents list --data <city> --card <owner-card>agents-city agents mount --data <city> --agent writer --src ~/Documents/handbook

Agents are defined one at a time

Current main onboarding does not turn every folder into an agent. It completes one specialist before offering the next, and it also permits a city that starts with only its chair.

  1. 1

    Name — how the agent appears in its window, on the map, and on the bus.

  2. 2

    Kind of work — code, knowledge, or coordinator; this describes work and its building, not authority.

  3. 3

    Role — its speciality, from this domain or another, without turning it into the chair.

  4. 4

    Everything it uses — any mix of repositories, worktrees, and document folders mounted in its own workspace.

  5. 5

    Runtime — Claude, Codex, OpenCode, Kimi, or an explicit terminal fallback.

  6. 6

    Starting skills — only those the owner chooses, and only when the selected engine can read them.

TERMINAL
agents-city seat --agentsagents-city agents mounts --agent writer --data <city>agents-city agents mount --agent writer --src ~/Documents/handbook --data <city>

One local bus, four native deliveries

Every actor receives typed envelopes through the same local WebSocket. The last mile changes to preserve each provider’s real interface.

RuntimeTask deliveryInterface
Claudepersistent stream-jsoncity> gateway and visible transcript
Codexapp-server WebSocketofficial TUI connected with --remote
OpenCodeHTTP/SSE APIinteractive city> gateway
KimiREST + WebSocketinteractive city> gateway
Unknown CLIcompatibility adapterexplicit terminal:<command>

The committee, step by step

The seat opens a committee only when specialised evidence can change the decision. It does not summon every agent by default.

  1. 01

    Brief

    question, outcome, context, constraints, definition of done, authority, and participants.

  2. 02

    Isolated positions

    each member answers without seeing the others; abstention is valid.

  3. 03

    Synthesis

    the seat compares evidence, agreements, conflicts, and unknowns without voting.

  4. 04

    Floor

    a member requests one turn for new evidence, contradiction, risk, or dependency.

  5. 05

    Decision

    outcome, rationale, executor, verifier, dissent, and reopen conditions are recorded.

  6. 06

    Verification

    another agent returns pass or fail; fail requires a replan.

TERMINAL
agents-city committee schema openagents-city committee open --input proposal.jsonagents-city committee show <deliberation-id>

Every deliberation keeps ACT.md for people, state.json for state, and events.jsonl as an append-only audit trail. They are not edited to bypass transitions.

Local and remote roads

A local road connects two cities on one machine without an external server. Across people or computers, each side accepts the other’s public invitation and both seats use the same optional relay with their own owner credential. The invitation never contains that token.

TERMINAL
agents-city road invite product > product.invitation.jsonagents-city road connect research product.invitation.jsonagents-city road invite research > research.invitation.jsonagents-city road connect product research.invitation.jsonagents-city bus roster

State you can inspect

~/.agents-city is a container. Every managed city lives below its owner and shares no configuration with home, product, or client-a.

~/.agents-city/<owner>/<city>/
├── city.yml
├── roads.json
├── <owner>.md
├── AGENTS.md
├── agents/
│   └── <agent>/
│       └── mounts/ → repos, worktrees, documents
├── domains/
├── roles/
├── deliberations/
├── units.yml
└── parcels.yml

domains/ and roles/ contain editable city Markdown. They are not hidden skills and are not automatically overwritten when a role changes.

A front door for every city

Current main can put a city on the desktop with its own name and icon. It creates a macOS app, a Linux .desktop entry, or a real Windows desktop shortcut when running through WSL. Every one opens the same city as the CLI.

TERMINAL
agents-city shortcutagents-city shortcut product --hallagents-city shortcut --remove