🏢 THE OFFICEofficefloor.ai

Your agent org, as a floor you can walk.

The Office is an isometric, live-updating picture of every seat in an agent fleet — who is at their desk, who is blocked, who walked a finished branch over to the CEO, who went dark holding an unread directive. Its whole authority is that everything you see is true: it reads state your org already writes, and it invents nothing.

▶  Open the demo floor
● read-only any model — Claude, Codex, or local stdlib Python — no build step MIT · binds 127.0.0.1
the office — demo floor DEMO — simulated fleet, not a live org open fullscreen ↗

That is the whole product, in one self-contained HTML file with no server behind it. The seats, names and roles on it are invented for the demo; the floor plan, the icons and the rules are the real ones.

Any model, any harness

It doesn't care whose model you run.

The floor never calls a model. It reads the files and git history your agents already produce — there are no API keys here, and no vendor to be locked into.

Out of the box

Claude Code & Codex, recognized.

Point it at a fleet running either and every seat shows up with no configuration.

One line of data

Add any harness by name.

Drop an engines.json naming how yours appears — no server code to edit. A bad entry is refused out loud, never guessed.

Even a bare model

A raw local model, on the floor.

A protocol-safe worker runs any OpenAI-compatible endpoint — Ollama, vLLM, llama.cpp — as a first-class seat.

Why it's worth trusting

It invents nothing.

The floor is a read-only projection of state your fleet already produces. There is no new source of truth here, and no agent has to change anything — or even know the office exists — to appear on it. Every glyph below is measured. When something can't be measured, the floor says so instead of guessing.

On the floorWhat it actually means
🟢at the deska process is running with that agent's working directory — the same signal a liveness check would use, not a self-report
📦deliveringthe agent's last status block says its work is ready, and no review is open on that branch yet — so it walks the branch to the CEO's desk
at the doora decision is parked and that agent is stopped until someone rules on it
🚧blockedit wrote down a blocker and stayed at its desk
✉️unread directiveits inbox is newer than its outbox — it has been told something it hasn't answered
🧊frozenthe process is alive but its CPU time hasn't moved for a continuous 180 seconds (the default; tunable)
☠️darknothing is running and there's an unread directive — the expensive failure, and the loudest thing on the floor
💤benchednothing running, nothing owed. Off duty, so it walks to the lounge
👻no folderthe roster names this seat but there is nothing on disk for it
unknownthe office could not measure liveness on this machine and refuses to render a guess as a fact
Rule one

A finished seat outranks a live one.

Work waiting to be collected is checked before liveness. An agent that finishes and exits is the normal end state and the most expensive thing to miss — order it the obvious way and finished work files itself under "idle" and sits there for hours.

Rule two

Counters come from facts, not icons.

An avatar can only wear one icon, so a seat that is both holding a branch and dark shows as delivering — but it is still counted in the dark total, because the count is computed from the underlying state.

Rule three

Unknown is a rendered state.

No process list, no liveness — so the floor draws ❔ and says which panel it cannot honestly build. An empty-but-confident list is the one thing it will not show you.

The daily question

“What does the org need from me right now?”

That question is the entire reason the office exists, and 🙋 needs me is the answer to it — one ranked list of everything waiting on a human, so the morning check is a badge count instead of a lap of the building. Four groups, in escalation order, oldest wait first:

❓ First

Decisions parked at your door

An agent is stopped until you rule on something.

📦 Then

Branches waiting to be collected

Finished work that nobody has harvested yet.

☠️ Then

Dark, holding an unread directive

Nothing is running to read what you sent.

🪫 Last

About to run out of context

A running agent past 85% — a benched one's burned context isn't an action.

Five minutes

Run it on your own fleet.

Python 3 and a terminal. Standard library only — no npm, no dependencies, no build step, no account, nothing to configure before the first run.

Install it

One package, pure Python. If you can run python3, you can run the office.

pip install officefloor

See a floor immediately

Demo mode runs on any machine, with or without an org around it — the same fleet as the demo above.

python3 serve.py --demo
# open http://127.0.0.1:8787

Point it at your agents

Drop the flag and give it the directory your fleet lives in. An agent folder is a seat — no manifest to maintain.

python3 serve.py --allrepos ~/your/agents
One thing to know before you share a bake: the standalone build carries your roster — names, roles and models. It carries no branches, no status text, no context gauges and no process ids, but the roster is still yours. Treat a bake of your live fleet as internal, and hand out the demo build instead.
Honest about scope

It reads. It does not write.

The office is read-only today, and that is a design position rather than a gap on a roadmap — it is what makes the floor safe to leave open. Being precise about what it doesn't do is part of the pitch:

  • It never writes to your agents. Nothing is written into an agent's folder, and no script of yours is run.
  • It cannot task, stop or start anything. The floor is a viewport, not a control panel. Clicking a seat opens an inspector, not a command.
  • No accounts, no profiles, no server-side state. There is nothing to sign up for.
  • No telemetry, ever. It binds to localhost; nothing leaves your machine, including how you use it.
  • No ranking, scoring or leaderboards of agents. Permanently refused, not unbuilt.
  • No cloud, no hosted version, no API keys. It is a script you run.
  • It does render an honest unknown. Whenever a fact isn't measurable on your machine, you get ❔ and a reason — never a confident blank.