buenomini

Yet another software factory

None did exactly what I wanted, so I built vago.

4 min readai, toolingvago
xkcd comic 'How standards proliferate'. Situation: there are 14 competing standards. Someone says 14 is ridiculous and they need one universal standard that covers everyone's use cases. Soon: there are 15 competing standards.
xkcd 927 by Randall Munroe, CC BY-NC 2.5.

Agent orchestrators are pretty much at the 15 competing standards stage, and vago is one more. The repo is public now: github.com/julianbonomini/vago.

# How I got here

I think the bottleneck now is human attention. There are projects where you just want to move fast and put your attention on the product, and let something else run the agents. That's usually newer products, simple products, and self-contained things you won't have to maintain forever. Like an app for yourself (mobile, macOS, whatever) that works great and is pretty much one and done.

# A workflow per project

There are other orchestrators that do this, like Factory Missions (paid), OpenHands, Sandcastle and warren (<3). I liked a lot of them, but I want something that fits my workflow, and my workflow changes per project. From one project to the next, the deterministic checks can be super different, and so can the way I review and the way I release. I wanted something fully adaptable to all my different pet projects. Or how I put it while designing it: "the opinions are not on my workflow but rather on how my workflow is executed".

A workflow is a TOML file with a list of steps. Some are run by a coding agent with a prompt, some are plain shell commands, and your own checks go in between. This is an example of the small starter workflow I used for building vago itself:

harness = "claude-code"
model   = "claude-opus-5-5"

[[steps]]
id     = "implement"
type   = "agent"
prompt = "prompts/small-implement.md"

[[steps]]
id      = "check"
type    = "shell"
run     = "bun run check"
on_fail = "continue"   # review reads a failed check and fixes it

[[steps]]
id     = "review"
type   = "agent"
prompt = "prompts/small-review.md"

[[steps]]
id   = "merge"
type = "shell"
run  = "sh .vago/scripts/merge.sh"

vago init copies the starter workflows, prompts and scripts into your repo, and from there anyone that wants to use this can modify the shit out of them. Add steps, drop the review, have Codex review what Claude Code built, swap bun run check for whatever your project runs.

It also runs your harnesses headless. Agent steps call claude -p or codex exec (Pi is coming), the same CLIs you already use and pay for, so whatever you use works. Factory for example, runs its own agent runtime. I could give it my Claude keys, but it would still run with their agents, and I didn't love that.

You plan a goal with an agent, split it into tickets and that is kinda it. vago run takes each ticket through the workflow, and with the starters each ticket ends as one commit on the goal's branch and the goal ends as one pull request. That part depends on your workflow tho. Vago itself only gives each goal a worktree and a branch, the one PR comes from the starter's merge script.

And I like TUIs, sue me. The others I looked at were either headless, web, or micro apps. Vago is a CLI plus a full-screen TUI where you watch every goal, plan new ones with an agent and start them.

# Where it's not good

It's not good for very small changes. A workflow with a build agent and a fresh review agent costs way more than a normal session for a two-flag fix. That one gets its own post.

It's also not a token maxing thing. You can run goals in parallel, each in its own worktree, but I don't think it's at the point where you throw a massive amount of work at it at once. I haven't tested that, so maybe there's a workflow setup that allows it.

And it's probably not great for huge projects that need to be maintained over time. It's better for month-long projects, prototyping, exploring, that kind of thing.

# It builds itself

The other thing I wanted from the start was a tool that could build itself. Vago did, running a frozen build of itself: 15 goals, 88 tickets and 575 agent runs. How that works, and what turned out not to be frozen, is the next post.