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

Connect cities across computers on infrastructure you control.

Local cities and local Roads need no server. To cross machines, deploy the narrow relay included in the Apache 2.0 repository to your own account and issue a separate credential to every owner.

Three networks you can build

01

Inside your company

Connect Product, Legal, Finance, Operations, or any domain. The relay grants reachability between chairs; it does not merge goals, identities, or files.

02

With clients and suppliers

Every organisation keeps its cities and credentials. A public invitation opens one exact Road, and either side may remove it.

03

A CPS community

Create a Complex Problem Solving community across developers or other specialists. Every member keeps their city and knowledge local, accepts their own Roads, and shares only the response they choose to contribute.

What you deploy

The Worker accepts only seat-to-seat road envelopes from the agents-city-bus/2 protocol. KV holds owner token hashes, and one Durable Object keeps the socket and a bounded offline queue per city.

72 hoursmaximum TTL for offline direct messages
200maximum queued messages per city
offmessage-body logging by default
seat ↔ seatthe only direction accepted by the relay

1. Deploy the relay

Set the Cloudflare account id in bus/worker/wrangler.toml. The script creates the TOKENS KV namespace when needed and deploys the Worker with its Durable Object.

TERMINAL
cd busnpx --yes wrangler@4 login./scripts/deploy.sh

2. Issue one credential per owner

One token authenticates an owner prefix and may serve several cities owned by that person. Only its SHA-256 hash is stored, and the token is shown once. --to may narrow destinations as an additional control.

TERMINAL
cd bus./scripts/mint-token.sh joseluiscases./scripts/mint-token.sh joseluiscases --to alice,bob/research

3. Configure every machine

CITY_BUS_URL and CITY_BUS_TOKEN belong to the machine or installation, not one individual city. The seat derives owner/city at runtime. Keep the token private; on macOS it may also live in Keychain.

TERMINAL
CITY_BUS_URL=https://city-bus.example.workers.devCITY_BUS_TOKEN=rb_...

4. Exchange public invitations

Authentication makes a seat reachable; a Road makes it allowed. Each side exports its public identity and accepts the other. The JSON never contains the bus token.

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

5. Open both cities and verify reachability

Start both seats and inspect roster or /city:team. An offline city may receive its queue after reconnecting. Delivery is not agreement and grants no permission to execute.

TERMINAL
agents-city seat --city productagents-city seat --city researchagents-city bus roster