Zero runtime dependencies · Go 1.21+

Your autonomous
AI engineer

Picks up tickets, plans the work, asks before touching anything, codes it, tests it, opens the PR. One binary. Your codebase. Your rules.

board
Jira / GitHub
plan
LLM
confirm repo
gate
approve plan
gate
execute
agent
test
make
verify
LLM × N
PR
GitHub / GitLab / BB

Two gates pause the workflow until you approve — via web, Telegram, or terminal.


Autonomous end-to-end,
with human control

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.

1

Plan

Reads the ticket, your repo, and memory notes. Produces a step-by-step plan.

2

Confirm repo & approve plan

Pauses and notifies you. Accept with one click — or reject with feedback and goon re-plans.

🛑 gate
3

Execute

Runs tools inside your chosen repo: write files, run commands, run tests. No hallucinated paths.

4

Verify & open PR

Re-reads the code it wrote. Runs verify loops. Opens a PR on your git host with a structured description.

daemon log
$ 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

Everything it takes to ship

One binary, configured through the web UI. No Node, no Python, no Docker.

Daemon + hot-reload

Polls your board on a cron. Drop workflow.json in your repo root and goon picks it up on the next tick — no restart.

Two approval gates

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.

Prompt injection defense

Ticket data, tool output, and SOUL.md are all XML-delimited. Plan steps are sanitized before execute. SOUL.md is write-protected by default.

Custom workflow stages

Replace the built-in pipeline with declarative JSON: llm, agent, notify, http, loop. Fan-out, retry loops, reject routing — all in config.

Parallel child agents

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.

Persistent memory

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.

Per-role model routing

Route plan, execute, chat, and review to different models or providers. Each role inherits the default when unset.

Telegram everywhere

Approve gates, chat with goon, get PR review drafts, and receive notifications — all from your phone without opening the web UI.

Google Workspace

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.

Code in the browser

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.


Works with every major model

Set one provider or route each role to a different model.

config
# 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


Work the way you want

All three share the same ./storage/ state. Switch freely.

CLI

One-off tasks, scripts, and CI pipelines. Dry-run by default — nothing executes unless you say so.

goon "fix the typo" --auto

Web UI

Approve 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=:8080

Telegram

Mobile approvals, PR review drafts, chat, and notifications. Authenticate once with /auth <secret>.

TELEGRAM_BOT_TOKEN=...

Zero to autonomous in 60 seconds

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)
Copied to clipboard