Config
Using the OpenCode JSON config.
You can configure OpenCode using a JSON config file.
Format
OpenCode supports both JSON and JSONC (JSON with Comments) formats.
{ "$schema": "https://opencode.ai/config.json", "model": "anthropic/claude-sonnet-4-5", "autoupdate": true, "server": { "port": 4096, },}Locations
You can place your config in a couple of different locations and they have a different order of precedence.
Configuration files are merged together, not replaced. Settings from the following config locations are combined. Later configs override earlier ones only for conflicting keys. Non-conflicting settings from all configs are preserved.
For example, if your global config sets autoupdate: true and your project config sets model: "anthropic/claude-sonnet-4-5", the final configuration will include both settings.
Precedence order
Config sources are loaded in this order (later sources override earlier ones):
- Remote config (from
.well-known/opencode) - organizational defaults - Global config (
~/.config/opencode/opencode.json) - user preferences - Custom config (
OPENCODE_CONFIGenv var) - custom overrides - Project config (
opencode.jsonin project) - project-specific settings .opencodedirectories - agents, commands, plugins- Inline config (
OPENCODE_CONFIG_CONTENTenv var) - runtime overrides - Managed config files (
/Library/Application Support/opencode/on macOS) - admin-controlled - macOS managed preferences (
.mobileconfigvia MDM) - highest priority, not user-overridable
This means project configs can override global defaults, and global configs can override remote organizational defaults. Managed settings override everything.
Remote
Organizations can provide default configuration via the .well-known/opencode endpoint. This is fetched automatically when you authenticate with a provider that supports it.
Remote config is loaded first, serving as the base layer. All other config sources (global, project) can override these defaults.
For example, if your organization provides MCP servers that are disabled by default:
{ "mcp": { "jira": { "type": "remote", "url": "https://jira.example.com/mcp", "enabled": false } }}You can enable specific servers in your local config:
{ "mcp": { "jira": { "type": "remote", "url": "https://jira.example.com/mcp", "enabled": true } }}Global
Place your global OpenCode config in ~/.config/opencode/opencode.json. Use global config for user-wide server/runtime preferences like providers, models, and permissions.
For TUI-specific settings, use ~/.config/opencode/tui.json.
Global config overrides remote organizational defaults.
Per project
Add opencode.json in your project root. Project config has the highest precedence among standard config files - it overrides both global and remote configs.
For project-specific TUI settings, add tui.json alongside it.
When OpenCode starts up, it first looks for a config file in the current directory, then traverses up to the nearest Git directory.
This is also safe to be checked into Git and uses the same schema as the global one.
Custom path
Specify a custom config file path using the OPENCODE_CONFIG environment variable.
export OPENCODE_CONFIG=/path/to/my/custom-config.jsonopencode run "Hello world"Custom config is loaded between global and project configs in the precedence order.
Custom directory
Specify a custom config directory using the OPENCODE_CONFIG_DIR
environment variable. This directory will be searched for agents, commands,
modes, and plugins just like the standard .opencode directory, and should
follow the same structure.
export OPENCODE_CONFIG_DIR=/path/to/my/config-directoryopencode run "Hello world"The custom directory is loaded after the global config and .opencode directories, so it can override their settings.
Managed settings
Organizations can enforce configuration that users cannot override. Managed settings are loaded at the highest priority tier.
File-based
Drop an opencode.json or opencode.jsonc file in the system managed config directory:
| Platform | Path |
|---|---|
| macOS | /Library/Application Support/opencode/ |
| Linux | /etc/opencode/ |
| Windows | %ProgramData%\opencode |
These directories require admin/root access to write, so users cannot modify them.
macOS managed preferences
On macOS, OpenCode reads managed preferences from the ai.opencode.managed preference domain. Deploy a .mobileconfig via MDM (Jamf, Kandji, FleetDM) and the settings are enforced automatically.
OpenCode checks these paths:
/Library/Managed Preferences/<user>/ai.opencode.managed.plist/Library/Managed Preferences/ai.opencode.managed.plist
The plist keys map directly to opencode.json fields. MDM metadata keys (PayloadUUID, PayloadType, etc.) are stripped automatically.
Creating a .mobileconfig
Use the ai.opencode.managed PayloadType. The OpenCode config keys go directly in the payload dict:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict> <key>PayloadContent</key> <array> <dict> <key>PayloadType</key> <string>ai.opencode.managed</string> <key>PayloadIdentifier</key> <string>com.example.opencode.config</string> <key>PayloadUUID</key> <string>GENERATE-YOUR-OWN-UUID</string> <key>PayloadVersion</key> <integer>1</integer> <key>share</key> <string>disabled</string> <key>server</