One manager agent you talk to dispatches the rest across your repos, on your own CLIs. It writes what the fleet learns into a brief that stays in the project. Sessions live in a local daemon, so closing the window never stops the work.
a394bd4d. Reverted the logic to prove the test was load-bearing, watched it fail, restored it. No change needed.a394bd4d. Recorded so the stale report does not get re-fixed a third time.go test -race ./internal/bus/...
Four agents is one too many to watch. And every one of them starts tomorrow from zero. Attention and amnesia are the same problem wearing two coats. You are the only thing holding the fleet together, and you don't scale.
work{spacer} answers both with the same move: stop being the orchestrator. One agent takes the dispatching, and writes down what the fleet learns in the project, where the next one will read it.
Every project keeps a brief at .workspacer/brief.md, in the repo, in plain markdown. The manager writes it as work lands. You read the same file, and you can edit it; your words are authoritative and nothing overwrites them.
agentTitler.ts was already doing a one-shot.a394bd4d. Proved the coverage is load-bearing rather than just reading it: reverted the logic, watched the test fail, restored, confirmed green. Recorded so the stale bug report does not get re-fixed a third time.The manager writes it at the moment a dispatch reports back. Not you, and not the worker that did the job. One file, two audiences: the next agent is handed it, and so are you.
## Now is a live list, and a line leaves the moment its work lands. ## Direction is durable. ## Recently is a dated log, newest first, and the only section that grows. Three retention policies in four headings, which is three more than a chat transcript has.
/checkpoint keeps the newest entries and moves the overflow to brief.archive.md beside it, so nothing is deleted. On the brief board, archiving is a drag. A memory that only ever grows stops being read, and then it may as well not exist.
A manager updates a brief at the same moment a worker in that project is editing it, because the trigger for both is the same worker finishing. brief_append inserts one line under a lock, re-reading the file inside it, so concurrent updates all land and your own edits are never rewritten.
Rejected designs, and the reasoning that killed them. Beliefs that turned out to be wrong, marked as retractions rather than quietly deleted, plus do-not-re-dispatch markers. A task list records what happened; a brief records what not to try again.
In a fast fleet, a line can be wrong within hours: the thing it describes gets fixed by someone else while the note still says it's broken. This repo's own log numbers its misses, and each one cost a dispatch:
The brief is operational memory: who did what, what was decided, what not to try again. It is not a map of your code. work{spacer} doesn't read, index or understand your repo, and when a finding is architectural the manager is told to file it into whatever code-context tooling the project already has. Every brief is also a board you can drag, and a tab on your phone.
Open the Fleet Manager from the Overview and it comes up as a real agent session on your own CLI, rooted at the parent directory of your projects, holding the work{spacer} tools at the operator tier. You give it work in a sentence and it does the dispatching.
No edits, no builds, no long investigations of its own. Staying available is its job, so every turn ends in seconds and you can always reach it. It picks the model to match the work: a cheap fast one for a rename, the strongest one for a gnarly bug, and never a frontier model on a chore.
No status loops, no “just checking on the workers”. That isn't monitoring, it's a hang, and it locks you out of the conversation. A turn that ends right after dispatching is the manager working correctly. It can afford that because it doesn't have to look: it gets woken.
When a dispatch lands, one dated line goes to the top of that project's ## Recently and the matching line leaves ## Now. Ask it where things stand and it answers from the briefs, including its own, which is how it survives being restarted.
The wake is the mechanism. Five things can reach the manager, and they all arrive through one channel as an ordinary message it can act on:
Wakes are parent-keyed, so replacing a manager means the successor adopts its in-flight workers as its first act. Otherwise their results report to a session that's gone. One limit: that manager→worker graph lives in the desktop app's memory. Sessions survive a restart; the parentage doesn't.
Every dispatch is one of two shapes, and the manager picks. A ship task changes code. A scout task only looks. They are dispatched differently, and that difference is enforced by the hub rather than requested in a prompt.
Code changes go to a fresh wks/ branch in a worktree under ~/.workspacer/worktrees, so two agents in one repo never collide. node_modules is linked in and your setup hooks run. It isolates branches and files, not your machine: same dependencies, same ports, same network.
An investigation is dispatched at the view tier: the hub mints that session its own capability token whose allowlist has no spawn, no approve, no shell. The hub refuses the call itself, so no prompt has to be trusted.
Each project carries how work should land, either a pull request or a local merge once you approve. The manager bakes it into the worker's first message so the instructions and the outcome can't diverge. It is advisory to the manager, not a hard gate.
A dispatch can carry a JSON Schema. The worker ends with a fenced result block, it's validated before the manager ever sees it, and you get a card. If it doesn't parse, the wake says so, instead of leaving the manager to guess that the worker reported nothing.
wks-result, validated before the manager sees it and rendered as a cardYou stay in the loop by default: the manager resolves in-scope authority for actions inside the repo it dispatched to, and asks you before anything destructive, external, credential-touching, cross-repo, or otherwise unauthorized. Per-project yolo turns prompts off for that project's workers only.
Each one is a full agent you can open, drive, interrupt, re-model and approve, or ignore and let the manager handle it. They are not invisible subagents that return a paragraph and vanish. The delegation is optional; the sessions are real either way.
A status dot per agent and a live N waiting count. The inbox collects everything waiting on you, and stays quiet for the agent you're already watching.
Spawn any of them from the same dialog, yourself or through the manager. Pick a repo, a model, a profile, and go; they all land in the same fleet, on your subscriptions.
Everything an agent needs around it, in the same window. Each agent keeps its own tabs and panes in the daemon, separate from the window, so you can close the app and nothing dies.
$EDITOR in a terminal panebrief.archive.mdArrange it your way: fleet and focus modes flip in one key between watching every agent and quieting the sidebar to the one you're in, without remounting a pane. Plus a command palette, remappable keybindings with leader chords, 18 themes and a theme maker, and layout templates, all in the docs.
The same fleet from the desktop, a browser, your phone, a terminal, or another agent. They all talk to the same bus, so they never disagree about what the fleet is doing.
/m you install from a QR code. It reads as a fleet manager: Fleet, Waiting, Flows, Briefs and Dispatch tabs, with big approve buttons for clearing approvals from the couch./app, with tmux-style layout mirroring between desktop and web.workspacer serve runs the same fleet on a headless box, though the box does have to be on. Nothing runs in a cloud, because there isn't one. Sharing is off by default, and tokens can be scoped view-only.wks-tui is a Rust client on the same bus, with a ctrl-k palette and vim keys.The primary GUI. Spawns the daemons, renders the panes, forwards events to every client.
Owns the sessions and PTYs, runs the per-provider adapters, streams conversation and usage.
The event bus, capability router, token tiers, plugin system, jobs, and the MCP facade.
Sessions live in the daemon, not the window. Closing a window never kills an agent, and quitting the app doesn't either. Read the internals →
work{spacer} is alpha and built in the open by one person. Here is the list you'd otherwise find out the hard way. Every line of it is something we'd rather tell you now than have you discover in week two.
workspacer serve is headless, but something still has to be powered on. Your code never leaves it either.wks-tui is a Rust client on the same bus, with a ctrl-k palette and vim keys.work{spacer} is in alpha and the builds are unsigned, so expect sharp edges and an objection from your OS the first time you open it. Installers for Linux, macOS, and Windows, plus a standalone server bundle for a box with no desktop.
.dmg, drag Workspacer to Applications, then clear the quarantine flag yourself:
xattr -dr com.apple.quarantine /Applications/Workspacer.app