# The City

[AI Office](https://sael.net/ai-office) showed Claude Code agents as robots at desks. I wanted something that fits the way I work, so The City makes every project folder a building and every team a floor of robots, and shows which ones need me.

[Download ](https://github.com/Slaymish/theCity/releases)[Source code](https://github.com/Slaymish/theCity)

Solo designer and developer, from the stream parser to the 3D scenes and the release pipeline. The demo replay came from an outside contributor.

![A cutaway office building labelled theCity on a street grid among trees, with robots working at colour-coded desks on each of its three floors.](https://cdn.sanity.io/images/qnuj1c4o/production/25cb42d26ff47825a8266cbb51651f9a37a2376c-1600x1000.png?w=1280\&q=80\&auto=format)

## Every animation is a real event

Each floor runs claude -p in stream-JSON mode. A Swift package called OfficeCore parses that stream, speaks the control protocol and reduces the events into the state of the office, with no UI imports. Subagents walk to their department’s desk, and anything the plan didn’t hire sits at the Contractor desk. Recorded streams in the repo drive the unit tests and a replay mode, so the scene can be checked without spending tokens.

## Reception routes the work

You tell the receptionist what you need. Apple’s on-device model sends the job to the floor whose team fits, taking into account what is already running on other floors, or proposes a new floor. A busy floor queues the job. A new floor’s departments are picked from the project’s .claude/agents files, and a word-overlap check takes over when Apple Intelligence is off.

## Approvals happen at the desk

Questions and tool approvals appear as cards at the robot’s desk, with ⌘1 to ⌘9 to pick an option and ⌘⌫ to deny. Always allow writes the CLI’s suggested rule to the project’s local settings. New jobs ask before every tool by default, and approval notifications only offer Deny, so a tool can only be allowed from the card where you can see what it is.

## It runs the claude you already have

The City starts its own Claude Code runs with the installed CLI, so they count towards your plan as usual. Before each job it checks Claude Code is installed and signed in, and refuses versions older than 2.1.163, which have known security issues. Five-hour and weekly plan usage shows per account in the top right.

## Shipping a Mac app

CI runs the tests and builds the app on every push. Pushing a tag builds the .dmg, the .zip and a Sparkle appcast, with release notes taken from the changelog. Updates are signed with an EdDSA key and verified before they are unpacked. Version 0.3.0 added a demo replay, built by an outside contributor, that plays a recorded job on a sample floor without touching your city.

## Where it stands

Version 0.3.0 is on GitHub under MIT, with signed automatic updates. It needs macOS 26 and Claude Code 2.1.163 or later, and the build is not notarised yet, so the first launch goes through Open Anyway.

Office floor

### Each desk is a department

![A close view of an office floor: robots at the Research, Build and Review desks under status bubbles reading Reading, Running a command and Searching.](https://cdn.sanity.io/images/qnuj1c4o/production/337b402160a379cbbae429a66115ef8e1e30a861-1600x1000.png?w=1200\&q=80\&auto=format)

Robots at the Research, Build and Review desks show what their subagent is doing right now, taken straight from the stream.

[All work](/work)
