Picks up tickets, plans the work, asks before touching anything, codes it, tests it, opens the PR. One binary. Your codebase. Your rules.
Two gates pause the workflow until you approve — via web, Telegram, or terminal.
Goon polls your board, picks a ticket, and runs the full engineering pipeline. You only see it at the two gates — everything else is automatic.
Reads the ticket, your repo, and memory notes. Produces a step-by-step plan.
Pauses and notifies you. Accept with one click — or reject with feedback and goon re-plans.
🛑 gateRuns tools inside your chosen repo: write files, run commands, run tests. No hallucinated paths.
Re-reads the code it wrote. Runs verify loops. Opens a PR on your git host with a structured description.
$ goon start --web=:8080 ✔ LLM anthropic claude-sonnet-4-5 ✔ board jira EB-5234 "auth: refresh token on 401" ✔ repo ~/code/backend (confirmed) ▶ plan 1. Locate the HTTP client middleware 2. Add token refresh retry on 401 3. Write unit tests for the refresh path 4. Run tests — 3 verify loops ⏸ waiting for plan approval… ✔ approved via Telegram ▶ execute step 1/4 search_code "HTTP client" read_file internal/http/client.go write_file internal/http/client.go run_command "go test ./internal/http/..." ✔ all tests pass (3 runs) ✔ PR opened github.com/acme/backend/pull/214
One binary, configured through the web UI. No Node, no Python, no Docker.
Polls your board on a cron. Drop workflow.json in your repo root and goon picks it up on the next tick — no restart.
Confirm repo and approve plan are the only interrupts. Reject with plain-English feedback and goon re-plans from scratch. Up to 3 re-plans.
Ticket data, tool output, and SOUL.md are all XML-delimited. Plan steps are sanitized before execute. SOUL.md is write-protected by default.
Replace the built-in pipeline with declarative JSON: llm, agent, notify, http, loop. Fan-out, retry loops, reject routing — all in config.
A workflow can spawn_agents to fan out tasks across isolated child processes. Each child gets its own storage. Cap concurrency with GOON_MAX_AGENTS.
SOUL.md injects your codebase conventions into every prompt. HISTORY.md logs every completed task. While idle, goon reflects on your repo and writes new learnings.
Route plan, execute, chat, and review to different models or providers. Each role inherits the default when unset.
Approve gates, chat with goon, get PR review drafts, and receive notifications — all from your phone without opening the web UI.
Ask in Chat: "what meetings today?", "check my email from finance", "search logs for payment failed". Read-only. Zero external deps — pure Go stdlib OAuth2.
The Code tab runs the same agent loop as goon "task" in a directory you pick — reads, edits, runs commands, streams each step live. Claude Code in a tab, with the safety validator on.
Set one provider or route each role to a different model.
# pick a provider goon config set GOON_LLM_PROVIDER anthropic goon config set ANTHROPIC_API_KEY sk-ant-... # route per role (optional) goon config set GOON_LLM_CODE anthropic:claude-sonnet-4-5 goon config set GOON_LLM_PLAN gemini:gemini-2.5-flash goon config set GOON_LLM_CHAT gpt-4o-mini goon config set GOON_LLM_REVIEW anthropic # verify everything is reachable goon doctor
OpenAI · Anthropic · Gemini · Ollama (local) · any OpenAI-compatible endpoint
All three share the same ./storage/ state. Switch freely.
One-off tasks, scripts, and CI pipelines. Dry-run by default — nothing executes unless you say so.
goon "fix the typo" --autoApprove gates, manage workflows, browse PRs, edit the pipeline, chat with goon, and run agentic coding sessions (Code tab) — all from a browser.
goon start --web=:8080Mobile approvals, PR review drafts, chat, and notifications. Authenticate once with /auth <secret>.
Install, start the web UI, configure your LLM and board. That's it.
go install github.com/harisaginting/goon@latest
click to copy
$ goon start --web=:8080 # → open http://localhost:8080 # → Settings → add your LLM key # → Settings → connect Jira or GitHub Issues # → goon doctor (verify all green)