vago

Set the Goal.
Go do something else.

Vago runs your Workflow on a Goal in your repo, one Ticket at a time, and leaves you a PR.

One screen for every Goal

A replay of Vago's TUI on acme-shop, an example Project made up for this page. Nothing here is running.

Or drive it yourself: click the screen and use its keys, or tap these.

One screen for every Goal

A replay of Vago's TUI on acme-shop, an example Project made up for this page. Nothing here is running. Scroll, and it shows you each part.

Goals

Every Goal in the Project with its progress and cost, and what it's doing right now.

Tickets

Open a Goal and its Tickets run top to bottom, one at a time. Here 03 is the one running.

Ticket

What the running Ticket asks for, and the Steps your Workflow takes it through.

Runs

Every time a Step runs is a Run, with its time and cost. A retry is one more Run.

Run activity

The live Run as it happens. You see each file the agent writes and each test it runs.

Stop babysitting your agents

You already know how agents should work on your code. You've got the skills, the prompts and the checks. What's left is the sitting: correcting a session, rebriefing the next one when the context fills up, fixing small things by hand.

Vago builds itself. Most of its own repo came out of Goals run through it.

Here's gift-cards, one Goal in acme-shop, from the file you write to the PR you merge. Scroll, and the TUI follows along.

You write the Goal

What you want and why, what's in scope and what isn't, the way you'd brief a colleague. It's a Markdown file in your repo, and its header names the Workflow that runs it.

.vago-goals/gift-cards/goal.md
+++workflow = "small"created = 2026-10-21T12:45:00.000Z+++# Customers can pay with a gift card## Problem StatementCustomers ask for gift cards every December and the shop has nothing to sell them. Staff work around it with discount codes, which can't hold a balance, so a code is either used up in one order or shared around. Nobody can say how much credit is still out there.## Solution…

You split it into Tickets

Write them yourself, or plan them with an agent in the TUI and accept what it proposes. A Ticket can wait on another: 03 starts once 01 is done.

.vago-goals/gift-cards/tickets/
✓ 01-gift-card-codes.md✓ 02-redeem-at-checkout.md  after 01● 03-balance-page.md  after 01○ 04-staff-issue-cards.md  after 01○ 05-refunds-to-card.md  after 02

Each Ticket runs your Workflow

A Workflow is a short TOML file of Steps. An agent Step runs on Claude Code or Codex with the prompt you wrote. A shell Step runs a command: a branch, your checks, a merge.

.vago/workflows/small.toml
harness = "claude-code"model   = "claude-opus-5-5"idle_timeout = "10m"[[steps]]id   = "branch"name = "New branch"type = "shell"run  = "sh .vago/scripts/branch.sh"[[steps]]id     = "implement"name   = "Build"type   = "agent"prompt = "prompts/small-implement.md"[[steps]]id      = "check"name    = "Checks"type    = "shell"run     = "bun run check"on_fail = "continue"# then Review, Goal review, Squash merge

Watch a Run, or don't

Each time a Step runs is a Run. The TUI streams what the agent reads, edits and runs. In your terminal, vago run prints a line as each Step starts and ends, with what it took and cost.

vago run gift-cards
03-balance-page  2026-10-21T14:20:00Z                  New branch started  2026-10-21T14:20:00Z    0.1s          New branch ok  2026-10-21T14:20:00Z                  Build started  2026-10-21T14:29:12Z   9m12s   $0.86  Build ok  2026-10-21T14:29:12Z                  Checks started  2026-10-21T14:30:50Z   1m38s          Checks ok  2026-10-21T14:30:51Z                  Review started  2026-10-21T14:34:25Z   3m34s   $0.31  Review ok  2026-10-21T14:34:25Z                  Goal review skipped  2026-10-21T14:34:25Z                  Squash merge started  2026-10-21T14:34:32Z    6.7s          Squash merge ok

One Ticket, one commit

Each Ticket is built on its own branch. Once its Steps pass, the Workflow's merge Step squashes it onto the Goal's branch as one commit, and the next Ticket starts.

git log --oneline vago/gift-cards
4e0c2d8 03 balance page9679a1b 02 redeem at checkoutbd49572 01 gift card codes

One Goal, one PR

The first merge opens the Goal's PR. After the last Ticket, two Goal Steps write its description from the Goal's report and mark it ready for review. Reviewing and merging it is yours. Here's low-stock-email, a Goal of acme-shop that's finished.

The PR goes through gh, so it needs a GitHub repo.

acme-example/acme-shop #34
Owners get an email before stock runs outvago/low-stock-email into main · Ready for reviewRunsWorkflow: smallTicket                Runs    Took   Cost01-threshold-setting     5  11m58s  $1.0002-daily-check           5  16m04s  $0.7503-email-template        6  12m51s  $1.40after_all                2   46.2s  $0.14Total                   18  41m41s  $3.30

When a Step keeps failing

An agent Step that fails resumes its own session and tries again, three times. Then the Ticket is stuck and waits for you. Fix what it needs, run vago run again, and it picks up at that Step on the same branch.

vago run order-export
  2026-10-19T09:47:43Z                  Build started  2026-10-19T09:49:52Z   2m09s   $0.21  Build exit 102-date-range-filter is stuck after Build: exit 1  log:    .vago-goals/order-export/logs/02-implement-5.jsonl  resume: claude --resume 301ac8cf-44a8-4da8-a21b-67f46b3ce090  again:  vago run order-export  reset:  vago ticket reset order-export 02
acme-shop 4 done · 1 ready · 1 running · 1 stuck, lost or broken · $18.93 spent
Goals 1/8
STATE GOAL TICKETS RUN TIME COST NOW TITLE
● running gift-cards 2/5 32m 10s $2.01 03 Build Customers can pay w…
✗ stuck order-export 1/3 22m 12s $2.04 02 stuck after Build exit 1 Store owners can ex…
◇ planning self-service-returns 0/0 proposal ready
○ ready dark-mode 0/3 0s $0.00 ready to start The storefront foll…
✓ done low-stock-email 3/3 41m 41s $3.30 finished Owners get an email…
✓ done search-typos 4/4 1h 1m $4.85 finished Product search find…
✓ done responsive-images 3/3 42m 18s $3.20 finished Product images load…
✓ done saved-addresses 3/3 44m 0s $3.53 finished Returning customers…
gift-cards Workflow small · created 2026-10-21 · last activity 4m 36s ago
Customers can pay with a gift card
2/5 Tickets
STEP RUNS TOOK COST GOAL
New branch 3 0s Problem Statement
Build 3 20m 4s $1.39
Checks 2 2m 55s Customers ask for gift cards every December and the shop has nothing to sell
Review 2 8m 55s $0.63 them. Staff work around it with discount codes, which can't hold a balance,
Squash merge 2 13s so a code is either used up in one order or shared around. Nobody can say how
total 12 32m 10s $2.01 much credit is still out there.
Solution
A gift card is a code with a balance. Customers buy one like any product,
spend it at checkout over one or several orders, and check what's left on a
page of its own. Staff can issue a card by hand, and a refund on an order
paid by card goes back to the card.
↑↓ Goal Enter Open s Start n New Goal g G First, last PgUp PgDn Scroll ? Help q Quit

Scrolling drives it. Click it to take over.

What happens after you leave

All of gift-cards on one line. You write the Goal and its Tickets, Vago runs the rest, and you come back to a PR. Scroll, and Ticket 03 goes through.

  1. Goal

    You write it.

    goal.md# Customers can pay with a gift card
  2. Tickets

    You split it, or plan them with an agent.

    ✓ 01-gift-card-codes✓ 02-redeem-at-checkout○●✓ 03-balance-page○ 04-staff-issue-cards○ 05-refunds-to-card
  3. Steps

    Your Workflow, on the Ticket's own branch.

    ·●✓ New branch   shell   0.1s      ·●✓ Build        agent  9m12s $0.86·●✓ Checks       shell  1m38s      ·●✓ Review       agent  3m34s $0.31·●✓ Squash merge shell   6.7s      
  4. Commits

    One per Ticket, on vago/gift-cards.

    4e0c2d8 03 balance page9679a1b 02 redeem at checkoutbd49572 01 gift card codes
  5. PR

    Yours to review and merge.

    vago/gift-cardsWorkflow small2 of 5 Tickets3 of 5 Tickets27m 34s, $2.0142m 5s, $3.18

One Ticket at a time, for now. Goals can run side by side; the Tickets of one Goal can't.

Your Workflow is a short file

Vago has opinions about how a Workflow runs and none about what it is. That part is yours, per Project, in .vago/workflows/.

Vago takes care of

  • A worktree per Goal, so your checkout stays yours
  • Retries that resume the agent's own session
  • Ticket and Run state in plain files in your repo
  • Picking up a stuck Ticket, or a crashed run, where it stopped

You decide

  • The Steps and their order
  • Every prompt an agent Step gets
  • Which agent and model, per Step
  • The scripts that branch, check and merge

It ships two to start from. A solo project can merge straight to main, a work repo can wait for reviews and checks, and an open source contribution can follow that project's rules without anything personal landing in its repo. Each is a change to the file and its scripts.

.vago/workflows/small.toml. For small Tickets that are already clear. One agent builds, a fresh one reviews.

harness = "claude-code"model   = "claude-opus-5-5"idle_timeout = "10m"[[steps]]id   = "branch"name = "New branch"type = "shell"run  = "sh .vago/scripts/branch.sh"[[steps]]id     = "implement"name   = "Build"type   = "agent"prompt = "prompts/small-implement.md"[[steps]]id      = "check"name    = "Checks"type    = "shell"run     = "bun run check"on_fail = "continue"[[steps]]id     = "review"name   = "Review"type   = "agent"prompt = "prompts/small-review.md"[[steps]]id     = "goal-review"name   = "Goal review"type   = "agent"prompt = "prompts/goal-review.md"when   = "last-ticket"[[steps]]id   = "merge"name = "Squash merge"type = "shell"run  = "sh .vago/scripts/merge.sh"[[after_all]]id     = "describe"name   = "PR description"type   = "agent"prompt = "prompts/describe.md"[[after_all]]id   = "ready"name = "Ready for review"type = "shell"run  = "sh .vago/scripts/ready.sh"

gift-cards

acme-shop 4 done · 1 ready · 1 running · 1 stuck, lost or broken · $18.93 spent
● gift-cards Customers can pay with a gift card
RUNNING 32m 10s run time 3.3M tokens $2.01 Workflow small Goal 1 of 8
2/5 Tickets
Tickets 3/6 Ticket 03 2 Runs · 4m 36s · $0.00
✓ 01 A gift card is a code with a balance Customers can check a card's balance
✓ 02 Checkout takes a gift card code after 01
● 03 Build Customers can check a card's ba…
○ 04 Staff issue gift cards from the admin ✓ New branch ● Build · Checks · Review · Goal review
○ 05 A refund on a gift card order goes bac… · Squash merge
○ after_all Goal Steps
What to build
A page at `/gift-cards/balance` where anyone types a code and sees
its balance and its last five uses. It doesn't need an account. Five
wrong codes from one address in ten minutes slow the next try down.
Runs of Ticket 03
1 New branch ✓ ok 0s Acceptance criteria
2 Build ● live 4m 36s
Run 2 · 03 Build ● live 4m 36s · 1.2M tokens · $0.34
limiter instead of writing another one.
Write test/gift-card-balance.test.ts (17 lines)
Execute Run the new tests, expecting them to fail
✗ test/gift-card-balance.test.ts:
⁘ Four failing tests, as expected. Now the lookup: it reads the card by code and its last five uses in one query.
⁘ working
↑↓ Move ←→ Run Tab Pane PgUp PgDn Scroll s Start t r Full screen G Follow e d Diff Esc Goals ? Help

Ticket 03 · Build

A replay of Vago's TUI on an example Project. The TUI drew every frame itself, from acme-shop, a Project invented for this page, so nothing here is running.

Try it on a small Goal

Pick something you'd finish in an afternoon. Write the Goal, split it into two or three Tickets and run it with the small Workflow.

Install

$ brew install julianbonomini/tap/vago$ cd ~/code/your-project && vago init

Without Homebrew, download the binary for your machine from the latest release. init copies the starter Workflows, prompts and scripts into .vago/.

First Goal

$ vago goal new search --workflow small --body-file goal.md$ vago ticket add search index --body-file index.md$ vago run search

Then run vago on its own to watch it, and go do something else.