
I wrote:
An AI chatbot is a conversation partern, not a co-worker. I need AI that works on my files, not me working inside its chat.
I still believe that. But after a few weeks of using Onesist every day, one piece of friction wouldn't go away: I kept switching windows. The FSD was open in Onesist while the agent ran in a terminal next to it. Every time the agent finished writing output/erd/schema.dbml, I switched to Onesist to look at it, then back to the terminal to ask for a revision.
It was tool fatigue again, on a small scale, and this time I had built it myselft.
So in v.0.1.45 Onesist got a per-project Chat
tasks/import, rtm/import/apply), so the Tasks and RTM tabs update too. Those calls show up in the transcript. Nothing writes to the database behind your back.The principle didn't need replacing, only sharpening: a chat is fine, as long as what gets stored is files.
The first version of the chat used bring-your-own-key providers through the Vercel AI SDK (23 presets, your own key, stored on your machine). But a lot of system analysts, me included, already pay for a coding-agent CLI. Paying twice for the same thing makes no sense.
So v0.4.0 made five CLI agents available in the chat: Opencode, Claude Code, Codex, Antigravity and Pi, each using the binary already installed on your machine.
The most interesting part is the part you don't see. The five CLIs speak five different protocols: an HTTP server, an SDK, JSON-RPC over stdio, one process per turn, and an RPC mode with line-delimited JSON. If those differences leaked into the chat code, it would be full of if (agent === "codex"). Instead, every CLI sits behind one interface, CliRuntime, with probe, listModels, startTurn, and capabilities. Adding a sixth CLI means adding one runtime, not combing through the app.
Permissions were the hardest part. Claude Code has a callback. Codex sends approval requests over JSON-RPC. Antigravity, when headless, can't ask at all. Pi has no permission gate whatsoever. Next post shows how each one maps onto the same approval card in the chat.
One rule holds for all of them: Onesist never writes to the user's CLI configuration. If you uninstall Onesist tomorrow, your Claude Code or Pi setup is exactly as you left in.
Once there were five agents, a question came up that I hadn't thought about before: what if I start in Claude Code and want to continue in Codex?
input/code/<repo>, or in a new Git worktree, so two threads can try two ERD designs on two branches without overwriting each other.Next post covers the algorithm and the safety rules (worktrees live outside the project, are never deleted automatically, and never take their branch with them).
Outward: Onesist runs an MCP server with five onesist_* tools that are read-only by design. An outside agent's permission prompt is not Onesist's approval flow, so if Claude Code in your terminal wants to read your tasks or RTM, it can. If it wants to change them, that has to go through Onesist.
Inward (v0.4.2): Settings -> MCP now has presets for Github, Figma, Miro, Monday and Custom. That fits a system analyst's week well: designs in Figma, flows in Miro, tasks in Monday, code on Github. The agent can read all of them without copy-pasting.
The next post is mostly about the security decisions: credentials are only written when you press Save, Github goes through the gh CLI because it doesn't support dynamic OAuth client registration, and there's an SSRF guard that resolves hostnames and follows redirects by hand.
A system analyst rarely looks at just one document. Onesist now has split view, and since v0.4.0 a tab can open in its own desktop window (up to five), for example the ERD on a second monitor.
That created a new problem: two windows editing the same document. The answer is one writer per document. A server-side lock belongs to whichever window claimed it first, and is released automatically when taht window's last SSE stream closes, so a crashed windows can never hold a document hostage. The code is in the next post.
I could show off features, but the most valuable lessons of theses 53 days came from bugs:
no such table after zipping data.db. The migration journal claimed tables the file didn't have. A schema guard now replays idempotent DDL, at a cost of 0.5 ms on a healthy DB.task/../../../chat/threads/<id> go through, and it really did delete a chat thread when I tested it.Every one of these is now a "Do / Don't" rule in the repo's AGENTS.md, so the agents working on this codebase don't repeat them. The next post has the full stories.
CliRuntime made the fifth CLI as easy as the second. Without it, every new agent would have added debt.Onesist started as a dashboard for looking at SA artifacts. At v0.4.2 it's place where an analyst works with agents, with files still holding the truth.