Skip to main content
Navigation
HomeTechnical ReferenceJournalGitHubGitHub
Sidebar — toggle document categories via the logo
Categories

OpenCode Configuration Guide

Overview

OpenCode is an AI coding agent that runs in the terminal. It provides slash commands, custom agents, provider integrations, and extensible skills — all configured through ~/.config/opencode/. This reference covers configuration, Docker sandboxing, keyboard shortcuts, and common patterns.

Configuration file

The main configuration lives at ~/.config/opencode/config.json (or opencode.json in the project root for per-project overrides).

Basic structure

{
"$schema": "https://opencode.ai/config.json",
"model": "google/gemini-2.5-pro",
"default_agent": "nexus",
"agent": {
"build": { "disable": true },
"plan": { "disable": true }
},
"provider": { ... }
}
KeyPurpose
modelDefault model for the default agent (provider/model-name).
default_agentAgent used when no specific agent is invoked.
agent.<name>.disableDisable built-in agents (e.g., disable build and plan if unused).
providerCustom AI provider configurations.

Provider configuration

Define each model provider with its API endpoint, key, and available models:

{
"provider": {
"deepseek": {
"name": "DeepSeek",
"npm": "@ai-sdk/openai-compatible",
"options": {
"baseURL": "https://api.deepseek.com",
"apiKey": "sk-..."
},
"models": {
"deepseek-v4-flash": {
"name": "DeepSeek v4 Flash"
},
"deepseek-v4-pro": {
"name": "DeepSeek v4 Pro"
}
}
},
"google": {
"name": "Google AI",
"options": {
"apiKey": "..."
}
},
"ollama": {
"npm": "@ai-sdk/openai-compatible",
"name": "Ollama (local)",
"options": {
"baseURL": "http://localhost:11434/v1"
},
"models": {
"llama3.1:8b": {
"name": "Llama 3.1 8B",
"limit": { "context": 131072, "output": 8192 }
},
"qwen2.5-coder:14b": {
"name": "Qwen 2.5 Coder 14B",
"limit": { "context": 32768, "output": 8192 }
},
"deepseek-r1:32b": {
"name": "DeepSeek R1 32B",
"reasoning": true,
"limit": { "context": 131072, "output": 8192 }
}
}
}
}
}
Provider fieldPurpose
nameDisplay name for the provider.
npmSDK package. Use @ai-sdk/openai-compatible for OpenAI-compatible APIs.
options.baseURLAPI endpoint URL.
options.apiKeyAPI key (can also reference environment variables).
models.<key>.limitToken limits: context (input), output (generation).
models.<key>.reasoningMark model as reasoning-capable (true).

Custom agents

Agents are defined as Markdown files in ~/.config/opencode/agents/. Each agent specifies its model, permissions, and system prompt.

Agent definition

---
name: Builder
description: Senior software engineer for building and shipping production code.
mode: primary
model: deepseek/deepseek-v4-pro
permission:
edit: allow
bash: allow
---

You are **Nexus**, a senior software engineer. You design, build, review,
and ship production-quality code across any language or framework.

- Read the codebase thoroughly before writing code — understand existing
patterns, naming, and conventions.
- Prefer editing existing files over creating new ones.
- Run tests, typechecks, and linters after making changes.
- Write concise commit messages that match the project's style.
- When unsure about architecture, ask clarifying questions before guessing.
- Think like a senior engineer: maintainability, edge cases, performance,
security, and testing.

Agent frontmatter fields

FieldPurpose
nameAgent display name.
descriptionShort description shown in agent lists.
modeprimary (runs by default) or subagent (invoked by name).
modelDefault model for this agent: provider/model-name.
permission.editallow or deny — can the agent edit files?
permission.bashallow or deny — can the agent run shell commands?

Using agents

Switch agents during a session or invoke specific agents for specific tasks. The default agent loads at startup unless overridden by --agent:

opencode --agent builder

Custom skills

Skills extend OpenCode with specialized workflows. They live in ~/.config/opencode/skills/.

Skill structure

Each skill is a directory with a SKILL.md file:

~/.config/opencode/skills/
├── my-skill/
│ └── SKILL.md # Skill definition and instructions
└── ui-ux-pro-max/
└── SKILL.md

Skills are loaded automatically at startup. The agent's system prompt references available skills, and you invoke them via the skill tool during a session.

Keyboard shortcuts

ShortcutAction
Ctrl+Alt+EnterInsert a new line at cursor position.
Ctrl+Shift+VPaste multiple lines from clipboard.
Ctrl+CInterrupt the current agent action.
Ctrl+DExit session (EOF).

Docker sandbox

Running OpenCode inside Docker provides an isolated workspace with consistent tooling. This is the recommended setup for security and reproducibility.

Dockerfile

FROM debian:bookworm-slim

RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates curl wget git unzip gnupg \
build-essential gcc g++ make \
python3 python3-pip python3-venv \
jq vim nano htop dnsutils iputils-ping netcat-openbsd ssh-client \
&& rm -rf /var/lib/apt/lists/*

# Node.js 22
RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \
&& apt-get update \
&& apt-get install -y nodejs \
&& rm -rf /var/lib/apt/lists/*

# Create non-root user
RUN groupadd --gid 1001 oc \
&& useradd --uid 1000 --gid 1001 --create-home \
--home-dir /home/oc --shell /bin/bash oc

# Install OpenCode globally
RUN npm install -g opencode-ai

# Prepare directories
RUN mkdir -p \
/home/oc/.config/opencode \
/home/oc/.local/share/opencode \
/home/oc/.local/state \
/workspace \
&& chown -R oc:oc /home/oc /workspace

USER oc
ENV HOME=/home/oc
WORKDIR /workspace

# Install Rust (optional, for Rust-based tools)
# RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
RUN chmod g+s /workspace

COPY entrypoint.sh /usr/local/bin/entrypoint.sh
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]

Entrypoint script

#!/usr/bin/env bash
set -e

# Ensure workspace permissions
sudo chown -R oc:oc /workspace 2>/dev/null || true

exec "$@"

Note: Ensure oc user and group created on host system

Launch script

Place this at ~/.config/opencode/run.sh:

#!/usr/bin/env bash
set -e

IMAGE_NAME="opencode-powerful:latest"
SCRIPT_DIR="$HOME/.config/opencode"

# Build image if it doesn't exist
if ! docker image inspect "$IMAGE_NAME" >/dev/null 2>&1; then
echo "⚙️ Building Docker image..."
docker build -t "$IMAGE_NAME" "$SCRIPT_DIR"
fi

# Ensure config directories exist on host
mkdir -p "$HOME/.config/opencode"
mkdir -p "$HOME/.local/share/opencode"

echo "🚀 Launching OpenCode sandbox..."
echo "📂 Workspace: $PWD"

docker run -it --rm \
--name "opencode_$(basename "$PWD")" \
--network host \
--workdir /workspace \
--user oc \
-v "$PWD":/workspace \
-v "$HOME/.config/opencode":/home/oc/.config/opencode \
-v "$HOME/.local/share/opencode":/home/oc/.local/share/opencode \
-v "$HOME/.local/state":/home/oc/.local/state \
"$IMAGE_NAME" \
"$@"

Make it executable:

chmod +x ~/.config/opencode/run-opencode.sh

Usage

# Launch in current project directory
~/.config/opencode/run-opencode.sh

# With custom arguments
~/.config/opencode/run-opencode.sh -s $SESSION_ID

See also

  • Spec Kit — spec-driven development workflow
  • OpenSpec — spec-driven development workflow