Assign issues to AI coding agents. Review the diff. Ship.
oneshot-ai is a self-hosted issue board for Claude Code. Each issue gets its own git worktree and branch. Watch the agent work live, review the diff, then merge, open a pull request, or leave feedback and the agent picks up in the same session.
- A Gopioneers product
- Runs on your machine
- One binary, one SQLite file
- Powered by Claude Code
oneshot · acme/web · 127.0.0.1:7420
#12
Fix redirect loop after OAuth login
#11
Paginate the issues endpoint
#13
Explain the session store
#12 · running
Fix redirect loop after OAuth login
oneshot/12-fix-oauth-redirect
- systemsession 3f9c2a · cwd worktrees/12
- thinkingThe callback reads
nextfrom a cookie but never clears it. - Readinternal/auth/callback.go
- Editinternal/auth/callback.go
- Bashgo test ./internal/auth/...
- resultok internal/auth 0.41s
- textCookie is cleared before redirect. Adding a regression test
Interface preview. oneshot-ai is in active development.
Why oneshot-ai
Coding agents are fast. Keeping track of them is the hard part.
Running Claude Code in a terminal works well for one task. oneshot-ai is for developers, and later small teams, who want several tasks in flight and need somewhere to queue the work, isolate each change and review what comes back.
01
Terminal tabs don't scale
Which session was fixing the login bug? Did it finish? What did it change? With several agents running, the answers end up scattered across scrollback.
02
Agents collide in one checkout
Two agents editing the same working copy overwrite each other, and your own uncommitted changes get caught in the middle.
03
Review is the real bottleneck
Work is done only when someone has read the diff. That step needs its own place, with the run history, the cost, and a way to send the agent back.
How it works
From issue to merged branch, with you in the loop
Agents do the work on their own branch. You decide what lands.
- 1
Write the issue
Describe the task the way you would for a teammate: a title, the details, what done looks like.
- 2
Assign an agent
Pick an agent profile. oneshot-ai creates a branch and a git worktree for the issue, queues the run and starts Claude Code inside that worktree.
- 3
Watch it work
Text, reasoning, tool calls and test output stream to the board as they happen. Cancel at any time.
- 4
Review and ship
Read the diff against your base branch. Merge it, open a pull request, or leave feedback and the agent continues where it stopped.
#11 Paginate the issues endpoint · in review
- internal/server/issues.go+58 −21
- internal/store/queries/issues.sql+12 −4
- internal/server/issues_test.go+72 −13
@@ -41,9 +41,14 @@
func (h *Handler) ListIssues(w http.ResponseWriter, r *http.Request) {
- issues, err := h.q.ListIssues(ctx, projectID)
+ limit := parseLimit(r, 50)
+ issues, err := h.q.ListIssuesPage(ctx, store.ListIssuesPageParams{
+ ProjectID: projectID,
+ AfterPos: cursor,
+ Limit: limit,
+ })
Also return next_cursor in the response body.
resumes session 3f9c2a in the same worktree
Features
Everything between “assign” and “merged”
The MVP covers one person running Claude Code against their own repositories. Each piece below is part of the current build plan.
One issue, one worktree
Every issue runs on its own branch and git worktree, so agents never touch your working copy or each other's.
Live run log
Text, reasoning, tool calls and results stream over Server-Sent Events. Each run's log is stored and can be replayed.
Diff-first review
See the files changed and the full diff against the merge-base before anything reaches your main branch.
Feedback keeps context
A comment starts a new run that resumes the same Claude Code session in the same worktree. No re-explaining.
Merge or open a PR
Merge locally in one click, or push the branch and open a pull request through the GitHub CLI.
Cost and turns per run
Every run records tokens, turns, duration and cost, with a running total for each issue.
Agent profiles
Save the model, instructions, permission mode and allowed tools as a profile, then reuse it across issues.
A board that tells the truth
Queued, Running, In review and Failed are driven by real run state. You only drag between Todo and Done.
Built on Claude
Claude Code does the work. oneshot-ai runs the loop.
oneshot-ai is not a wrapper around a chat API. It drives Claude Code, Anthropic's agentic coding tool, in headless mode and turns every run into something you can follow, review and resume.
Headless runs with structured output
Each run is
claude -pwith--output-format stream-json, started inside the issue's worktree in its own process group, so it can be cancelled cleanly.Sessions that survive review
The session ID from the init event is saved. Feedback runs
--resumein the same directory, so Claude keeps the full context of what it did and why.Profiles map to real flags
--model,--append-system-prompt,--permission-modeand--allowedToolscome straight from the agent profile.Usage you can account for
Cost, turns, tokens and duration are read from every result event and stored per run.
Built with Claude, too
We build oneshot-ai with Claude Code. Once the MVP is done, oneshot-ai becomes the tool we use to build oneshot-ai.
run 01K7… · issue #12 · worktrees/12
$ claude -p "$ISSUE_PROMPT" \ --output-format stream-json --verbose \ --model sonnet --permission-mode acceptEdits \ --append-system-prompt "$AGENT_INSTRUCTIONS" \ --resume 3f9c2a…
stream-json → oneshot-ai
- system · initsave session_id for --resume
- assistant · text, thinking, tool_usestream to the live log
- user · tool_resultappend to the run's event history
- result · successrecord cost, turns, usage and summary
Self-hosted
Your repository stays on your machine
oneshot-ai has no cloud service of its own. The board, the database and the worktrees all live on your computer, next to the code.
One binary, one database
A single Go binary with the web UI built in. All state lives in one SQLite file under ~/.oneshot.
Local by default
The server binds to 127.0.0.1, and the API checks Host and Origin headers so other websites can't call it from your browser.
Agents don't push
Runs are told not to push. Nothing leaves the issue branch until you merge it or open a pull request.
Claude Code first
Agents sit behind an adapter interface. Claude Code comes first, and a Codex adapter is on the roadmap.
~/code/acme-web
$ oneshot serve data ~/.oneshot checks git ✓ claude ✓ gh ✓ listening http://127.0.0.1:7420
Planned CLI. Details may change.
Roadmap
Where the project is today
oneshot-ai is in the product development stage. We're building the MVP in the open and will start using oneshot-ai to build oneshot-ai as soon as it's done.
- P0In progress
Personal MVP
- Single binary with the web UI embedded
- Projects and agent profiles
- Issue board with live sync across tabs
- Agent runs: worktrees, live log, cancel, crash recovery
- Review: diff, merge, pull request, feedback, retry
- Cost per run, clear errors, install guide
- P1Planned
Daily driver
- Shared skills folder for all agents
- Several agents running in parallel
- Cost by day, project and agent
- Codex adapter
- Clean up worktrees once PRs are merged
- P2Planned
Small teams
- Sign-in, multiple users and workspaces
- Postgres as an alternative to SQLite
- Agent daemons on other machines
FAQ
Questions, answered
Can I use oneshot-ai today?
Not yet. oneshot-ai is in the product development stage and the MVP is being built now. Follow Gopioneers on GitHub or email us to hear when an early build is ready.
Which coding agents does it support?
Claude Code first. Agents sit behind an adapter interface, and a Codex adapter is planned for the next phase.
Does my code leave my machine?
oneshot-ai itself runs entirely on your computer and has no cloud service. The agent is Claude Code, which sends context to Anthropic's API the same way it does when you run it in a terminal.
Do I need an Anthropic API key?
oneshot-ai uses the Claude Code installation and login you already have, whether that's an API key or a Claude subscription. On a subscription, the cost shown for each run is an estimate.
Will an agent push to my remote or touch main?
No. Each agent works in its own worktree on its own branch and is told not to push. Code reaches your base branch only when you click Merge, and your remote only when you click Create PR.
What happens when an agent gets it wrong?
Leave feedback on the issue. A new run resumes the same Claude Code session in the same worktree, so the agent reads your comment with its earlier context intact. You can also retry from scratch or cancel a run.
Who is behind oneshot-ai?
oneshot-ai is a product of Gopioneers, founded by Son Tran. You can reach the team at oneshotai@gopioneers.space.
Follow the build
oneshot-ai is in active development at Gopioneers. Follow us on GitHub for progress, or write to us if you'd like to try an early build or talk about the project.