I built a tiny pixel office to keep an eye on my coding agents

Agent Lobby is a small open-source plugin that draws my coding agents as people in a pixel-art office. It started as a list with a pulsing dot. Along the way that dot cost a fifth of a CPU core, and two outside contributors fixed things I had missed.

Published4 min read

Contents
  1. A list first
  2. One long day in October
  3. The first pull request

I work with coding agents every day, usually several at a time, each in its own workspace in Paseo, the app I run them in. What I wanted was simple. Look at one corner of the screen and know which agent is busy, which one is stuck, and which one is waiting for me.

Agent Lobby is what came out of that. It draws every agent as a little person in a pixel-art office, and it took 95 commits to get there.

A list first

The first version went in on September 22, and it was called Crew. It was a list, one row per agent with a status dot, a title and a short second line, sorted so the ones that needed me came first. Later that night I made the dot breathe while an agent was working. Six days after that, every workspace header got a button that opened the list next to Files and Changes, with a switch between “this workspace” and “all of them”.

It worked. But a list is something you read, and I wanted something I could glance at.

The idea of an office came from agent-town, a project that shows agents as workers in a pixel office, with seats, wandering and speech bubbles as the way to show state. I used none of its code or art, but the idea stuck. Gather gave me the picture of an office seen from above. And an article on multi-agent orchestration, written in Vietnamese, is what made working with a crew of agents a daily habit for me in the first place.

One long day in October

On October 13 I made 56 commits. That was the day the list became an office.

Each workspace is a room and each agent has a desk. The pose tells you the state. Working means seated and typing, with code scrolling on the screen and a one-word bubble over the head: Bash, Read, Edit, Web. Needs you means standing at the desk with a question mark and the permission request in a bubble. Failed is an error screen and a cross. A finished agent walks to the pantry and stands at a little table with a cup, a check mark bobbing over its head. An idle one rests on the sofa, dozes, reads or stretches, and after fifteen minutes it goes back to its desk and falls asleep. When an agent is closed, it walks out the door, and a filing cabinet in the corner of the room counts it.

Every sprite is drawn in code. A character is a grid of letters, 16 wide and 24 tall, where “o” is the outline, “s” is skin and “h” is hair. A palette taken from the app’s theme turns the letters into colours, so the office follows light and dark mode. A small PNG encoder in plain JavaScript turns each grid into an image. The pixel fonts are mine too: a 5 by 7 one first, and a 3 by 5 face later the same day, once I had made everything smaller.

Some of my favourite commits from that day are about manners. Characters walk, one tile every 260 milliseconds, down their aisle and along the corridor, never across a desk. A seat comes from who started an agent and when, never from what it is doing, so nobody moves when a neighbour starts or finishes. An agent on a break picks a spot, like the coffee machine or the sofa, and keeps it, so no two ever share a tile. Agents started by the same agent sit together on a floor of their own. I give my agents roles, so the plugin gives them outfits: the overseer wears a hat and a cape, a nexus a headset, and a meow gets cat ears and a tail.

There was also work nobody sees. The first real render showed that states only changed once a minute, because I had never opened a subscription to the agent list, so short turns came and went without being drawn. A message typed into an agent can claim any sender it likes, so the office only draws a message between agents when the daemon itself recorded it with a verified sender. And because each live timeline costs the daemon something, the whole plugin keeps at most eight open, shared fairly between every view. Even the floor plan got attention: on a fleet shaped like mine, the empty hallway between rooms went from about a third of the building to 2%.

The first pull request

That evening I renamed the plugin to Agent Lobby, wrote the README, made the pictures from an invented fleet so no real workspace showed, and pushed it public. I did not expect anyone to read it.

The next day there was a pull request. Someone I had never heard of, QEXLAUWASD, had cloned the repo, found that a clean install did not compile, and fixed it. My code imported types from a development package that a fresh checkout does not have, and I had never noticed because my machine had everything installed. Someone else, devserra, had already opened an issue with the same error. So a stranger tried my thing, hit a wall, and cared enough to fix it instead of closing the tab. I still smile at that. A day later kslr sent a second one that let the office fill a wide pane, and I built zoom buttons and a draggable dock on top of it the same night.

The lesson is plain: install your own thing the way a stranger would. The nicer part is that strangers will, if you let them.

All posts

Posts