OpenCode: technische tutorial
OpenCode: ReviewInstalleren & instellenNieuwsTechnische tutorial
Stand september 2026, samengesteld uit onze eigen notities en nieuwsarchief; tekst machinaal opgesteld en redactioneel gecontroleerd. Controleer versies en commando's in de officiële documentatie.
Deze tutorial gaat over het inrichten van OpenCode voor serieus werk: configuratielagen, eigen en lokale modelproviders (ook via je eigen router), eigen agents, permissies op patroon, MCP-servers en onbewaakt gebruik via opencode run, opencode serve en GitHub Actions. Sleutels en commando's zijn gecontroleerd tegen de officiële documentatie (stand september 2026).
Configuratie: bestanden en volgorde
OpenCode leest opencode.json of opencode.jsonc (JSON met commentaar). De lagen worden samengevoegd, niet vervangen; een latere laag wint bij hetzelfde veld:
- Configuratie op afstand (
.well-known/opencode, voor organisaties). - Globaal:
~/.config/opencode/opencode.json. - Een eigen pad via de omgevingsvariabele
OPENCODE_CONFIG. - Project:
opencode.jsonin de root. - Inline configuratie.
- Beheerde configuratiebestanden en, op macOS, beheerde voorkeuren (de hoogste prioriteit).
Zet altijd de schema-regel bovenaan voor autocomplete en validatie in je editor. Twee soorten variabelen houden geheimen uit je bestanden:
{env:NAAM}: de waarde van een omgevingsvariabele.{file:pad/naar/bestand}: de inhoud van een bestand.
{
"$schema": "https://opencode.ai/config.json",
"model": "anthropic/claude-opus-5-5",
"small_model": "anthropic/claude-haiku-4-5",
"instructions": ["./docs/conventies.md", "packages/*/AGENTS.md"],
"share": "disabled",
"autoupdate": "notify"
}
- Model-ID's hebben de vorm
provider/model; de exacte ID's per provider zie je in de modelkiezer van OpenCode. small_modelwordt gebruikt voor lichte taken, zoals sessietitels. Een goedkoop model is hier genoeg.instructionsvoegt extra instructiebestanden toe naastAGENTS.md; paden en globs zijn toegestaan.share: "disabled"voorkomt dat sessies gedeeld kunnen worden. Verstandig voor bedrijfscode.
Eigen, lokale en router-providers
Elke dienst met een OpenAI-compatibele API voeg je toe via het pakket @ai-sdk/openai-compatible. Eerst de sleutel: /connect → Other → een eigen ID → sleutel plakken. Daarna in de configuratie:
{
"provider": {
"mijnrouter": {
"npm": "@ai-sdk/openai-compatible",
"name": "Eigen LLM-router",
"options": { "baseURL": "https://router.example.com/v1" },
"models": {
"code": { "name": "Router: code" },
"goedkoop": { "name": "Router: goedkoop" }
}
}
},
"model": "mijnrouter/code",
"small_model": "mijnrouter/goedkoop"
}
Zo loopt al het verkeer van OpenCode via één router, die zelf de sleutels van de providers beheert en kosten per client kan bijhouden. De modelnamen zijn dan aliassen die de router vertaalt.
Lokaal met Ollama:
{
"provider": {
"ollama": {
"npm": "@ai-sdk/openai-compatible",
"name": "Ollama (lokaal)",
"options": { "baseURL": "http://localhost:11434/v1" },
"models": { "qwen3-coder:30b": { "name": "Qwen3 Coder 30B" } }
}
}
}
Voor LM Studio gebruik je http://127.0.0.1:1234/v1 als baseURL. Modellen moet je bij beide handmatig opsommen. Kleine lokale modellen gaan vaak slecht om met toolaanroepen; test een model eerst met een kleine taak in Plan-modus.
Agents
OpenCode heeft twee hoofdagents, waartussen je met Tab wisselt:
- Build: alle tools.
- Plan: analyse zonder codewijzigingen.
Daarnaast zijn er subagents die je met @ aanroept:
- General: taken in meerdere stappen, met volledige toegang.
- Explore: snel en alleen-lezen door de codebase zoeken.
- Scout: alleen-lezen onderzoek naar dependencies en documentatie.
Eigen agents definieer je als markdownbestand in .opencode/agents/ (per project) of ~/.config/opencode/agents/ (globaal). Een voorbeeld, .opencode/agents/reviewer.md:
---
description: Beoordeelt code op beveiliging en onderhoudbaarheid
mode: subagent
model: anthropic/claude-opus-5-5
temperature: 0.1
permission:
edit: deny
bash: deny
---
Je bent een strenge code-reviewer. Zoek naar injectie, lekken van
geheimen en ontbrekende foutafhandeling. Noem per bevinding het
bestand en de regel. Wijzig zelf niets.
modekanprimary(via Tab),subagent(via@) ofallzijn.- Hetzelfde kan in
opencode.jsononder de sleutelagent. - Met
opencode agent createmaak je er interactief een aan.
Permissies op patroon
Elke tool heeft een permissie met de waarde allow, ask of deny. Bekende sleutels zijn read, edit, glob, grep, bash, task, skill, webfetch, websearch, external_directory en doom_loop. De meeste staan standaard op allow. Uitzonderingen: external_directory (buiten je project werken) en doom_loop (een agent die in een herhaling vastzit) staan op ask, en read weigert standaard .env-bestanden.
Voor bash en andere tools kun je per patroon kiezen. De laatste regel die past, wint, dus zet de algemene regel bovenaan:
{
"permission": {
"*": "ask",
"read": "allow",
"grep": "allow",
"bash": {
"*": "ask",
"git *": "allow",
"npm test": "allow",
"rm *": "deny",
"git push *": "deny"
},
"webfetch": "ask"
}
}
* staat voor willekeurige tekens, ? voor precies één teken.
MCP-servers
In opencode.json onder mcp. Een lokale server; let op dat command een array is:
{
"mcp": {
"database": {
"type": "local",
"command": ["npx", "-y", "mijn-db-mcp"],
"environment": { "DATABASE_URL": "{env:DATABASE_URL}" },
"enabled": true
}
}
}
Een externe server:
{
"mcp": {
"docs": {
"type": "remote",
"url": "https://docs.example.com/mcp",
"headers": { "Authorization": "Bearer {env:DOCS_TOKEN}" },
"enabled": true
}
}
}
OAuth wordt bij externe servers automatisch herkend. Zet "oauth": false als je dat niet wilt, bijvoorbeeld omdat je met een vaste header werkt. Met "enabled": false zet je een server tijdelijk uit zonder de configuratie te verwijderen. Elke server voegt tools toe aan de context, dus zet alleen aan wat je voor het project nodig hebt.
Onbewaakt: run, serve en GitHub
opencode run voert één opdracht uit zonder interface:
opencode run --agent plan -m anthropic/claude-opus-5-5 \
"Beschrijf de architectuur van dit project in vijf punten"
opencode run --format json "Draai de tests en repareer wat faalt" > run.jsonl
--format jsongeeft de ruwe gebeurtenissen als JSON.- Met
-cof--continuega je verder met de vorige sessie, met-s <id>met een specifieke sessie.
opencode serve start een headless HTTP-server, zodat je OpenCode vanuit andere programma's aanstuurt. Zet altijd een wachtwoord:
OPENCODE_SERVER_PASSWORD="sterk-wachtwoord" opencode serve
Stel die server nooit zonder wachtwoord bloot aan een netwerk: wie erbij kan, kan commando's op je machine laten draaien.
GitHub Actions: opencode github install zet een workflow in je repository. In de action draait opencode github run de agent, bijvoorbeeld als reactie op een opmerking in een issue of pull request. Zet de sleutels als repository-secrets en geef de agent in CI geen ruimere permissies dan nodig.
Problemen oplossen
- "Provider not found": het ID in
model(provider/model) komt niet overeen met de sleutel onderprovider, of je hebt nog geen credential gekoppeld met/connect. - Lokaal model roept geen tools aan: het model ondersteunt function calling slecht; kies een model dat daarop getraind is, of gebruik het alleen in Plan.
- Een regel in
permissionlijkt genegeerd: een latere, algemenere regel wint. Zet de specifieke regels onderaan. - MCP-server start niet:
commandis een string in plaats van een array, of een variabele achter{env:...}ontbreekt. - Instructies ontbreken: controleer of
AGENTS.mdgecommit is en of de paden ininstructionskloppen, gezien vanaf de projectroot.
Documentatie: opencode.ai/docs.