ConfigurationHow-to

Configuration basics

Where configuration lives, how it loads, and how overrides resolve.

On this page
  1. Files and roles
  2. Extension trust policy
  3. Project trust
  4. The resolution ladder
  5. geode config explain
  6. Reload semantics
  7. The daemon and model env keys
  8. Failure modes
  9. Next

GEODE configuration follows one rule. Credentials live in auth.toml, which GEODE manages, or in .env as env vars you set by hand. Behavior lives in config.toml. When the same key exists in several layers, the closer layer wins, and geode config explain shows you which one won.

Files and roles

FileRole
~/.geode/auth.tomlCredentials stored by geode setup, /login and /key. See Auth and OAuth.
~/.geode/.envOptional global env layer: env-var credentials and integration secrets you set by hand. For the same key it outranks the project .env.
Project .env (cwd)Project secrets layer, read only in a trusted folder. Fills only the keys the global file lacks; it never shadows a global key (Hermes, 2026-06-15). Keep secrets in the global file by default.
~/.geode/config.tomlGlobal behavior settings. Also hosts the [self_improving_loop.*] sections.
.geode/config.tomlProject behavior settings. Outranks the global toml; keys that widen capability apply only in a trusted folder. Default write target of /model. The project .geode/ folder is local; GEODE adds it to the workspace .gitignore.
core/config/routing.tomlShipped routing manifest: model defaults, provider prefixes, credential patterns. ~/.geode/routing.toml overrides it section by section.
~/.geode/extension-policy.jsonOperator trust policy applied before third-party hooks, LLM adapters, skills, or MCP servers load executable code.

"Secrets-only .env" is a contract the tools keep. /model no longer writesGEODE_MODEL to .env; it persists toconfig.toml only. Model lines left behind by older releases are auto-removed right after the picker's toml write, with a printed notice (remove_env incore/config/env_io.py). Only the API-key fields are env-only (_TOML_ENV_ONLY_FIELDS in core/config/__init__.py); every other field has a config.toml key. The gateway, for example, is enabled with [gateway] enabled = true in ~/.geode/config.toml, and an exported GEODE_GATEWAY_ENABLED stays a session override.

Extension trust policy

Bundled GEODE features are classified as first-party code. Other filesystem hooks, package LLM adapters, project or personal skills, and MCP servers are first discovered from their existing manifests, then authorized by~/.geode/extension-policy.json. With no policy or no matching stable ID, executable code is not loaded.

{
  "version": 1,
  "extensions": {
    "hook:failure-metrics": {
      "enabled": true,
      "trusted": true,
      "execution": "trusted",
      "capabilities": ["events"]
    },
    "llm-adapter:acme-payg": {
      "enabled": true,
      "trusted": true,
      "execution": "trusted"
    },
    "skill:project-review": {
      "enabled": true,
      "trusted": true,
      "execution": "trusted",
      "capabilities": ["shell"]
    },
    "mcp:filesystem": {
      "enabled": true,
      "trusted": false,
      "execution": "brokered",
      "capabilities": ["stdio"]
    }
  }
}

trusted is an in-process API boundary for code you trust; it is not a sandbox. A brokered MCP server starts with an exact environment and isolated scratch directory only when a supported OS sandbox is available. Otherwise it staysDEGRADED and is not launched. To use another policy path, set GEODE_EXTENSION_POLICY_OVERRIDE to the JSON file. The override is strict, so a missing file or invalid JSON fails startup. Decisions are frozen at startup and appear under extensions in runtime health.

Project trust

A repository can ship .geode/config.toml,.env and .claude/mcp_servers.json. Until you trust the folder, GEODE does not apply project settings that widen what the agent may do: the project .env, project MCP servers and gateway config, and keys such as the sandbox mode, computer use, webhooks, notifications and storage paths. Keys that grant nothing, such as the model choice, and restrictions such as[policy.org] denied_tools apply immediately.

geode config trust              # trust the current folder
geode config trust --list       # list trusted folders
geode config trust PATH --revoke

As in Codex, trust is recorded only in the global~/.geode/config.toml under[projects."path"], and a project's own config.toml is never consulted, so a repository cannot trust itself.hitl.dangerously_skip_permissions andcomputer_use.helper_path are never read from project config, even in a trusted folder. Ignored entries appear in a warning log and in geode config explain.

The resolution ladder

Every Settings field rides the same ladder. Higher wins (LAYERS in core/config/explain.py).

1. os.environ            shell exports. session-scoped manual override
2. global .env           ~/.geode/.env (authoritative secrets)
3. project .env          .env in the cwd (trusted folders only; fills only keys global lacks)
4. project config.toml   .geode/config.toml (capability keys: trusted folders only)
5. global config.toml    ~/.geode/config.toml
6. code default

Secrets (.env) and behavior (config.toml) order global vs project in opposite directions. For .env the global file is higher (authoritative); for config.toml the project file is higher (project tuning). The same key never appears in both layers (secrets-only, behavior-only, C-2), so one ladder is enough. Before v0.99.216 the .env pair was also project-first, but an empty project .env could shadow a real global key, so it was flipped to global-authoritative (the Hermes alignment).

Narrowed to model resolution, the same ladder reads: CLI args > env layer (os.environ plus the .env files) > project toml > global toml > routing default. Because the env layer outranks every toml, a single forgotten .envline masks all future toml edits. That is the classic trap this design removes from the tools and leaves only to deliberate hands.

The GEODE_CONFIG_TOML env var redirects the globalconfig.toml path. The main settings loader,geode config explain, and global /modelreads, writes, and confirmation use the same path resolver. MCP server loading, gateway reads and change watching, and seed role and voter overrides also use this global path. Project-scoped picks still write to .geode/config.toml, and the project TOML continues to override global settings. The geode-eval config migrate-petri-toml preview and--yes write use that same global destination.

geode config explain

The standard diagnosis for "I changed the config but the effective value did not move". For a key it prints a per-layer candidate table, marks exactly one layer asWINNER and every set lower layer asmasked, with file paths, so you see exactly which line to edit or remove.

geode config explain model     # key defaults to model
geode about                    # effective model + one-line mask warning

Always verify against the effective state. The modelgeode about reports is the model that gets called, and the same screen warns when an env layer masks a toml pick. Reading config.toml content is not verification.

Reload semantics

At session boundaries reload_settings_from_disk()re-reads .env, GEODE_* env, and config.toml into a fresh candidate, then validates and prepares it before updating the existing singleton. Field validation, preparation, or routing refresh failures propagate while keeping the previous Settings values. Correct the source and reload again to update the same captured references. The reload also callsreload_routing_constants(), clearing the routing-manifest cache and rebinding the routing constants oncore.config. The honest limit: importers that copied values at module load time still hold boot-time copies. Restart the process to refresh those paths.

The daemon and model env keys

At startup the serve daemon drops behavior (model-pick) env keys from its inherited environment and skips them during.env promotion (load_daemon_env incore/cli/bootstrap.py). This fixes the failure where a model key promoted into the daemon's environment outlived every /model switch. The key list isBEHAVIOR_ENV_KEYS incore/config/env_io.py.

GEODE_MODEL  GEODE_ACT_MODEL  GEODE_JUDGE_MODEL
GEODE_COGNITIVE_REFLECTION_MODEL  GEODE_LEARNING_EXTRACT_MODEL
GEODE_AGENTIC_EFFORT
GEODE_ANTHROPIC_CREDENTIAL_SOURCE  GEODE_OPENAI_CREDENTIAL_SOURCE

To pin the daemon's model via env on purpose, setGEODE_SERVE_KEEP_MODEL_ENV=1. Since C-4 the flag is honored from the process env, the global .env, or, in a trusted folder, the project .env. Promotion precedence is manual exports > global.env > project .env (global is authoritative; the project file only fills keys global lacks); files never clobber pre-existing process env, and empty values never clobber anything.

Failure modes

SymptomCauseFix
/model switch does not stickA model line in the env layer masks the tomlRun geode config explain model, find the WINNER layer and file, remove the line. Current pickers also auto-clean it on the next toml write.
Thin CLI sees the new model, the daemon keeps the old oneGEODE_SERVE_KEEP_MODEL_ENV=1 is set, or a pre-C-3 daemonUnset the flag or restart the daemon: pkill -f "geode serve", then re-enter.
Edits to ~/.geode/routing.toml do not landA module path holding a boot-time copySession reload refreshes manifest readers. If a path still lags, restart the process.
A secret set in the project .env is ignored and the global value winsThe global ~/.geode/.env holds the same key, and global is authoritative (Hermes, 2026-06-15)This is intended. Keep secrets in the global file; the project file only fills keys global lacks. Run geode config explain <KEY> to see the WINNER layer.
The project .env, MCP servers or sandbox setting do not applyThe folder is not trusted. Startup logs a warning ending in "until you run `geode config trust`"Review the repository, run geode config trust in that folder, and open a new session.
A global /model pick disappears with a redirected configAn older picker wrote to the default global fileUpgrade and compare the save-confirmation path with the global path in geode config explain.

Next

Moved from the GEODE repository’s documentation site. Source commit de077a4 · View the source on GitHub