Setup Guide
Prerequisites
- Go 1.25+ — check with
go version - gocognit (for complexity checks):
go install github.com/uudashr/gocognit/cmd/gocognit@latest - gocyclo (for cyclomatic complexity):
go install github.com/fzipp/gocyclo/cmd/gocyclo@latest
Installation
# Clone the repository
git clone <repo-url> goa
cd goa
# Build the binary
make build
# (Optional) Install to GOPATH/bin
make install
# Verify
./goa --help
First Run
When you run ./goa for the first time, the Setup Wizard launches interactively:
⟡ First run detected — launching setup wizard
┌─ Welcome to Goa ─┐
│ │
│ Let's get you │
│ set up. │
│ │
│ [ Next → ] │
└───────────────────┘
The wizard guides you through these steps:
- Welcome — Project overview, what to expect
- Provider — Configure your LLM provider
- Endpoint URL (e.g.,
http://localhost:1234/v1/chat/completions) - Model name (e.g.,
gpt-4o,llama-3.2-1b-instruct) - API key (optional, for OpenAI/managed services)
- Endpoint URL (e.g.,
- WebFetch Summarization — Enable sub-agent summarization for fetched pages
- Memory Dreams — Enable automatic memory consolidation
Yes— Periodically merge.goa/memory/*.mdinto a single cleaned fileNo— Keep memories as individual files only
- Companion Model — Use the same model for the companion agent or configure separately
- Mode — Choose a major mode
coder— Implements code changesplanner— Decomposes and plans workreviewer— Reviews and provides feedback
- Autonomy — Choose execution mode
yolo— Auto-approve all tool callsconfirm— Pause before each tool callreview— Queue writes for batch approval
- Advanced Options — Compression, tool limits, fuzzy edits
- Prompts & Workflows — Copy built-in prompts/workflows to
.goa/ - Done — Summary and save
Configuration is saved to ~/.goa/config.yaml. You can edit it directly at any time.
Manual Configuration
If you prefer to skip the wizard, create ~/.goa/config.yaml manually:
active_provider: local
active_model: llama-3.2-1b-instruct
mode:
default:
major: coder
autonomy: solo
execution:
mode: yolo
retries: 3
token_warning: 70
token_critical: 85
loop_warning: 5
loop_interrupt: 10
providers:
- id: local
name: Local LLM
endpoint: http://localhost:1234/v1/chat/completions
default_model: llama-3.2-1b-instruct
preferred: true
- id: openai
name: OpenAI
endpoint: https://api.openai.com/v1/chat/completions
api_key: ${OPENAI_API_KEY}
default_model: gpt-4o
preferred: false
tui:
theme: dark
layout: default
Running
# Start the TUI
./goa
# Start with a specific model
./goa --model gpt-4o
# Start with a specific mode
./goa --profile planner
# Start with a specific config
./goa --config ~/.goa/custom-config.yaml
Web UI (goa server)
goa server runs the same interactive session against a virtual terminal and
serves the screen to browsers. Nothing else changes: same engine, same agent,
same commands, same overlays.
# Serve on loopback (default 127.0.0.1:8080), no credentials
./goa server
# Serve beyond this machine: credentials are mandatory off-loopback
export GOA_SERVER_AUTH_TOKEN=$(openssl rand -hex 32)
./goa server --server-addr 0.0.0.0:7331 --server-auth=token
# Basic auth instead of a token
./goa server --server-auth=basic --server-auth-user you # password: GOA_SERVER_AUTH_PASSWORD
# Screen sharing: browsers see the session, keystrokes and uploads are refused
./goa server --server-read-only
- Startup refuses a non-loopback bind without credentials;
--insecure-no-authis the explicit, typed opt-out. - Opening
http://127.0.0.1:8080/redirects to the live session (/s/<id>);/s/<id>/textis a plain-text mirror of the screen.
Attach a terminal (goa attach)
A real terminal can be a client of the served session — the same screen, colors and keystrokes as the TUI, with the transcript in your terminal's own scrollback:
./goa attach --server 127.0.0.1:7331 # attach
./goa attach --server 127.0.0.1:7331 --session <id> # a specific session
Ctrl+] detaches; the session keeps running server-side. Requires the server
credentials when auth is on (--server-auth-token / --server-auth-user +
GOA_SERVER_AUTH_PASSWORD).
One server, many projects (--server-projects-root)
export GOA_SERVER_AUTH_TOKEN=$(openssl rand -hex 32)
./goa server --server-projects-root ~/repos --server-addr 0.0.0.0:7331 --server-auth=token
./goa attach --server 127.0.0.1:7331 --path ~/repos/goa
Each project directory gets its own full session (its own config, plugins,
skills) on demand; http://host:7331/ lists the live sessions with an
open-project form. Paths must live under the root.
- The same flags apply over SSH port-forwarding, so a remote box stays
loopback-only and you still reach it from your laptop:
ssh -L 8080:127.0.0.1:8080 host.
See WEBUI.md for the security model, transports and the full URL map.
Config File Locations
Goa searches for config in this order (later overrides earlier):
| Priority | Location | Description |
|---|---|---|
| 1 | Embedded | Compiled-in defaults (config/defaults.go) |
| 2 | ~/.goa/config.yaml |
Home/global config |
| 3 | .goa/config.yaml |
Project-level config |
| 4 | .goa/config.local.yaml |
Local overrides (gitignored) |
| 5 | GOA_* env vars |
Environment overrides |
| 6 | CLI flags (--model, etc.) |
Highest priority |
See CONFIGURATION.md for all available settings.