the agent-native workspace, on your Mac
a desktop app where agents do real work on your machine. the conversation is on the left, and an artifact panel on the right shows what they build as it streams in: documents, data, code, decks, live browsers, even the iOS Simulator. it runs on five engines (Claude Code, Codex, Gemini, Grok and Mantis), drives a real Chrome, syncs sessions across your Macs, and gives every agent its own memory that builds up over time.
electron, five engines, 23 tool servers, ~/.universe as the record
typescript · electron · react · node · sqlite · postgres · fastapi · mcp · claude agent sdk · sse · streamable http · content addressed sync · zod
The agent works in the repo you already have checked out, drives the Chrome profile you're already signed into, and writes files you can open in Finder. None of that works from a server, so the model call happens on your machine and is billed to your own account. The server never sees prompts, completions or token counts. The client reports its own usage.
Everything else has to work within that. Sharing, resuming on a second machine, and several people in one conversation all depend on a record that lives on a laptop that's asleep half the time. ~/.universe is the source of truth. The SQLite file next to it is only a cache, and rebuilding it takes one walk of the directory.
A space carries folder access, an agent, a model and a memory into every session filed under it. The desktop decides what a space contains, the server decides who can open it, and one uuid names the local row, the remote row and the folder on disk. Spaces you never share never reach the server.
A room is a session that several people prompt from different Macs, and its id is the session id. Each Mac calls the model itself, so there's no shared clock. The server assigns the sequence number and the client creates the id, so two Macs writing to the same room merge instead of racing. Messages between people cost no model call, and the model only sees them if it asks.
A crew shares one working directory, so agents can collaborate through artifacts/ without any protocol. What the filesystem can't provide is addressing, and that's what the six crew tools are for: a roster, a mailbox, and a read-only view of what another member is doing. Models address each other as @2, the number shown in the rail, because asking a model to copy a 36-character uuid goes wrong.
There are no locks, leases or per-worker worktrees. Each member gets the roster and a list of what changed in the tree since it last ran, capped at 25 paths. Concurrent writes are last-writer-wins, which is fine at eight members and wouldn't be at eighty. A crew message is filed as a row and a line in mail.jsonl, read without being consumed, and only marked done when the recipient's run finishes.
The Agent SDK doesn't start claude directly. It starts whatever pathToClaudeCodeExecutable points to, so pointing that at a small bridge runs the same session on another machine, with the event parser, persistence and UI unchanged. The first version piped stdio back over the network and broke straight away. herds ends a session when whatever holds its stdio goes away, and closing a laptop does exactly that.
So the far Mac starts claude under nohup, appends stream-json to a file and writes the exit code next to it, and the bridge only tails that file. When the app comes back, it trusts the far machine's filesystem over its own notes, because the app may have been killed before it wrote anything down. Copying the session over takes 0.49s through the relay, against 9s directly. A session out there runs without the in-process tool servers, since those live in this app, and reattaching after the app relaunches isn't wired up yet.
Somebody else's Mac works differently. The prompt goes into a queue, whichever machine holds the runner lease picks it up, and it runs there as an ordinary local session with all 171 tools. The transcript comes back every 700ms.
Every tool server is built in-process, so a tool call is a function call that already holds the SQLite handle and the CDP connection to Chrome. There are 171 tools across 23 servers. Nineteen servers are always registered and four depend on the session: space tools only for a filed session, chain tools only while a session is driving itself, training only for runs started from the agent library, and the simulator and Blender only on macOS.
Codex and Mantis are separate binaries and can't be handed an in-process object, so the app listens on 127.0.0.1 on a random port and serves one path per session, agent and server. The path does all the routing. The token is 32 random bytes, compared in constant time and never written to disk. Each request gets a fresh server instance, because one instance can only hold one transport at a time.
| claude, in-process | codex, over loopback |
|---|---|
| a function call | json over http |
| the approval hook runs first | no approval hook |
| every path argument is policy-checked | only the sandbox limits it |
| servers built once per runner | servers built per request |
The planner used to be a fork of the session, taken at the end of each round: same model, same memory, asked what to do next. It ran with no tools and no servers, resumed a transcript full of browser and crew calls, and concluded the only thing it could from inside, that every server had disconnected. Now the session decides while it's still running, and the Stop hook blocks exactly once, because a session that can't end can't be closed, synced or billed.
The other two went unnoticed for weeks. Message groups over 300 KB were replaced with a stub meant for a read-only viewer. Rooms have no viewer, so the Mac that wrote the group read its own stub back and saved it over the real one. Separately, opening a room rewrote a bookkeeping file that was inside the synced manifest, so the sync layer treated the new hash as a local edit and set aside every incoming version from then on.
One message group: an agent avatar, six tool calls with their results, and a thinking block.
It ships as a signed and notarized DMG, currently 0.4.35, and updates itself. Spaces, rooms, crews, the relay, resuming on a second machine, five engines, 23 tool servers and search across every session all work end to end.
The decision I'd defend hardest is the record. Every problem above got easier once a session stopped being rows in a database file and became a directory with an append-only log in it.
| working end to end | still open |
|---|---|
| rooms stay ordered across Macs | each Mac's agent has its own memory |
| sessions placed on another Mac | all 171 schemas sent on every call |
| crews of eight on one tree | no lock on the shared tree |
| cross-room reads by reference | an agent can't speak in a room |
| search across every session | writing across rooms is refused |