Installation
This page covers every install path plus post-install configuration. For the fastest path (pre-built binary + setup wizard), see the Quick start on the project README.
Tip
New here? Run the installer script below, then yottacode setup. No sudo required.
Requirements
- Go 1.25+ for building from source
- A modern terminal for the interactive TUI
- A model provider: Ollama, OpenAI, Anthropic, Gemini, xAI, ChatGPT OAuth through
openai-auth, GitHub Copilot throughcopilot-auth, or any OpenAI-compatible/v1API
Installer script (recommended)
curl -fsSL https://yottacode.ai/cli/install.sh | bashThe script detects your OS/arch (Linux + macOS, amd64 + arm64), resolves the latest GitHub release (or honors VERSION=0.4.0 if set), verifies the archive against SHA256SUMS, and installs to $HOME/.yottacode/bin/yottacode. No sudo required. It then offers to append a PATH export to your shell rc file (zsh / bash / fish / sh detected from $SHELL), backing up the rc first.
Useful flags and env:
VERSION=0.4.0— pin a version instead of “latest”.INSTALL_DIR=/custom/path— override the install location.--no-modify-rc— skip the rc-file edit (useful when you managePATHyourself).--yes/-y— non-interactive: assume “yes” to prompts (required in CI).NO_COLOR=1— disable ANSI colors and animations.
Re-running the installer upgrades in place: same flow, the rc edit is detected and skipped via sentinel comments.
Homebrew
brew install yottadynamics/yottacode/yottacodeThat taps yottadynamics/homebrew-yottacode on first use and installs the latest stable release binary for your CPU (macOS Apple silicon and Intel). It is a Homebrew formula: Homebrew downloads the same release archive the installer script uses and checks its pinned SHA-256; it never builds from source or from main. The binary is linked into Homebrew’s PATH ($(brew --prefix)/bin), so no rc-file edit is needed.
Tap contents are generated as a formula under Formula/yottacode.rb.
The release workflow validates the generated archive matrix and updates the tap
only for stable tags.
On Linux, use the installer script above.
Equivalent two-step form:
brew tap yottadynamics/yottacode
brew install yottacodeUpgrade and remove with the usual commands:
brew upgrade yottacode
brew uninstall yottacodeOnly stable releases reach the tap. Pre-release tags such as v0.5.0-rc.2 are GitHub prereleases only; use the installer script with VERSION= to try one. Uninstalling leaves ~/.yottacode (config, memory, sessions) in place.
Pick one install method per machine. The installer script keeps its own copy in $HOME/.yottacode/bin, and whichever directory comes first on PATH wins.
Updating
yottacode checks GitHub for a newer release once per day on TUI startup. The check runs in the background after the TUI starts, is cached at ~/.yottacode/cache/update-check.json, and runs only when the root interactive command launches into a real terminal — yottacode run, yottacode --version, scripts, and pipes never trigger it. GitHub, DNS, or network slowness never blocks first paint. When a newer release exists, you’ll see a one-line in-session notice:
⚠ update · new release · 0.4.0 available · current 0.3.0 · https://github.com/yottadynamics/yottacode/releases/tag/v0.4.0To upgrade, re-run the installer, run brew upgrade yottacode if you installed with Homebrew (the tap picks up a new stable release shortly after it is tagged), or download the new release from the linked release notes.
To disable the check entirely (CI, privacy, sandboxes): export YOTTACODE_NO_UPDATE_CHECK=1. To force a refresh: rm ~/.yottacode/cache/update-check.json.
Manual binary install
Pinned download + manual extract
VERSION=0.4.0
# Swap linux/darwin and amd64/arm64 to match your machine
curl -fsSL https://github.com/yottadynamics/yottacode/releases/download/v${VERSION}/yottacode_${VERSION}_linux_amd64.tar.gz \
| tar -xz
install -m 0755 ./yottacode "$HOME/.yottacode/bin/yottacode"Archive matrix: yottacode_${VERSION}_{linux,darwin}_{amd64,arm64}.tar.gz. Each release also publishes a SHA256SUMS file for verification.
Build from source
git clone https://github.com/yottadynamics/yottacode.git
cd yottacode
go build -o yottacode ./cmd/yottacodeRun it from the repo:
./yottacode --helpInstall it onto your PATH:
sudo install -m 0755 ./yottacode /usr/local/bin/yottacodeOr install into a user-local bin directory:
mkdir -p ~/.local/bin
install -m 0755 ./yottacode ~/.local/bin/yottacodeMake sure ~/.local/bin is on your PATH.
Go install from a local checkout
From the repository root:
go install ./cmd/yottacodeThis writes the binary to $(go env GOPATH)/bin.
Cross-compile
GOOS=darwin GOARCH=arm64 go build -o yottacode-darwin-arm64 ./cmd/yottacode
GOOS=darwin GOARCH=amd64 go build -o yottacode-darwin-amd64 ./cmd/yottacode
GOOS=linux GOARCH=arm64 go build -o yottacode-linux-arm64 ./cmd/yottacode
GOOS=linux GOARCH=amd64 go build -o yottacode-linux-amd64 ./cmd/yottacodeSupported platforms
- Linux: supported by source builds and release binaries
- macOS: supported by source builds and release binaries
- Windows: not a release target; run yottacode under WSL
Sandbox image packages
The optional Podman command sandbox pulls two GHCR images when enabled:
ghcr.io/yottadynamics/yottacode-sandbox:latestforrun_bashandrun_testsghcr.io/yottadynamics/yottacode-documents:latestfor document subprocess helpers
Published releases also tag both images with the release tag (for example
ghcr.io/yottadynamics/yottacode-sandbox:v0.4.0) plus a UTC date tag. If a pull
returns 401 or not found, the image package is private or not linked for
anonymous pulls; the image workflows verify anonymous pulls after publish so that
misconfiguration fails CI.
Run the setup wizard (recommended)
Important
yottacode has no default model — you must set a model and base URL before the first run. The wizard is the easiest way.
yottacode does not guess a default model or endpoint. The fastest post-install path is the interactive wizard:
yottacode setupThe wizard writes ~/.yottacode/config.toml and ~/.yottacode/.env, probes providers where possible, and can be rerun later with /setup from inside the TUI. Before writing, it shows a review panel with the destination paths, active provider/model, optional router/search settings, and explicit Write config, Back, and Abort actions.
Or configure manually
You need a model id, a base URL, and (for some providers) an API key. Each provider has its own page with both TUI and command-line setup; here are three common command-line examples.
Local Ollama — no API key, run a model locally:
ollama serve
ollama pull <your-model-id>
export YOTTACODE_PROVIDER=ollama
export YOTTACODE_MODEL=<your-model-id>
export YOTTACODE_BASE_URL=http://localhost:11434/v1
yottacodeChatGPT OAuth — use your ChatGPT account via OAuth:
yottacode openai-auth login
export YOTTACODE_PROVIDER=openai-auth
export YOTTACODE_MODEL=<your-model-id> # /model list shows what your account allows
export YOTTACODE_BASE_URL=https://chatgpt.com/backend-api/codex
yottacodeopenai-auth stores tokens under ~/.yottacode/auth/ with restrictive permissions; that directory is blocked from model reads and writes.
GitHub Copilot — bill against your GitHub Copilot subscription:
yottacode copilot-auth login
export YOTTACODE_PROVIDER=copilot
export YOTTACODE_MODEL=claude-haiku-4.5
export YOTTACODE_BASE_URL=https://api.githubcopilot.com
yottacodecopilot uses GitHub’s device code flow and bills against your Copilot subscription. Tokens and model cache live under ~/.yottacode/auth/.
Other OpenAI-compatible endpoints (NVIDIA NIM’s free tier, Groq, vLLM, …) work the same way — see Configuring providers.