The loop engineering framework for GitHub.
Any agent, no server.
brew install uberblick-ai/tap/ub-agents
macOS or Linux. You need git, an authenticated gh, and the agent CLIs you want to run.
It runs coding agents on your GitHub issues and pull requests. You start a launcher on your own computer. It watches the repository, claims an item whose label matches one of your agents, runs that agent, and records the result.
Labels are the queue. Put ready on an issue and the implementer picks it up. When it opens a pull request, that PR gets needs-review and the reviewer takes over. You decide what each label means and what happens after each outcome.
GitHub is the only state. Claims, attempts and outcomes are comments on the issue or PR, so a restarted launcher rebuilds everything from there. There is no database and nothing to host.
Use the agents you already have. Each role names a CLI such as claude or codex, a model, and instructions that live in your repository. Launchers on several machines share one queue.
╭─ Work · pass complete ─────────────────────╮ ╭─ Log ──────────────────────────────────────────────────────────╮ │ │ │ │ │ Running · 1 ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ │ │ 1 Log 2 Issue 3 Runs │ Formatted Raw │ │ ⠹ #248 Refresh the queue while an… 04:12 │ │ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ │ │ implementer · this launcher · attempt… │ │ #248 Refresh the queue while an agent runs │ │ │ │ implementer · claude · attempt 1 │ │ Needs attention · 1 ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ │ │ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ │ │ ? #255 Keep run scratch outside the… 19h │ │ 07:48:02 launcher claimed #248 · lease 30m │ │ implementer · needs-human · decide wh… │ │ 07:48:03 launcher worktree ready · start claude │ │ │ │ │ │ Eligible · 2 ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ │ │ 07:48:19 ▸ Read src/ub_agents/view_work.py │ │ ● ⌥252 Drop inherited agent variab… next │ │ 07:48:31 ▸ Read src/ub_agents/polling.py │ │ reviewer │ │ 07:48:52 The queue only refreshes between runs. I'll poll r… │ │ │ │ 07:49:40 ▸ Edit src/ub_agents/view_work.py +48 -12 │ │ ● #191 Shorter ub-agents doctor o… ready │ │ 07:50:12 ▸ Edit tests/test_view_ui.py +31 │ │ implementer · 1/5 failures │ │ 07:51:30 ▸ Bash python -m tests ✓ passed │ │ │ │ 07:51:44 ▸ Bash git push -u origin ub-agents/248-implementer │ │ Recent activity · 4 today ┄┄┄┄┄┄┄┄┄┄┄┄┄┄ │ │ │ │ ✓ ⌥269 Send fixable check failur… merged │ │ │ │ integrator · 07:41 · squash-merged │ │ │ │ ✓ ⌥269 Send fixable check fail… approved │ │ │ │ reviewer · 07:22 │ │ │ │ ✓ ⌥267 Release 0.1.13 merged │ │ │ │ integrator · 07:05 · squash-merged │ │ │ │ ✓ ⌥264 Open selected GitHub item… merged │ │ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ │ │ integrator · 06:48 · squash-merged │ │ ⠹ implementer running · following │ ╰────────────────────────────────────────────╯ ╰────────────────────────────────────────────────────────────────╯ ub-agents · running assignment ↑↓ select ⏎ open 1-3 tabs ? keys q quit
ub-agents launch opens this view of its own session. Example session on the ub-agents repository.$ cd your-project
$ ub-agents init # ub-agents.yaml and .agents/ policy and roles
$ ub-agents doctor # checks gh, labels and agent CLIs
$ ub-agents launch # runs the loop; q stops after the current run
The starter workflow has four roles: issue preparer, implementer, reviewer and integrator. Commit the files init writes and change them like any other code. The installation guide walks through it.
implementer:
runtime: "codex:gpt-6.1-sol:high"
trigger: [ready, needs-changes]
outcomes:
handed-off: {add: [needs-review]}
instructions: .agents/implementer.md
worktree: true
Every key has a short page in the configuration docs.