Start with the settings UI

Run /settings in an interactive session or autohand --settings from a shell for common UI, agent, session, permission, network, telemetry, auto-mode, team, and search settings. Edit the config file directly for provider blocks, hooks, MCP servers, custom themes, extension providers, and advanced policy.

autohand --setup
autohand --settings
autohand config set ui.promptSuggestions false
autohand config set sessions.awareness coordinate
autohand --permissions

Use the current file names. Autohand does not use a global settings.json. The user configuration is config.toml, config.yaml, config.yml, or config.json. The project file .autohand/settings.local.json is a narrow local overlay, not a second complete config.

Configuration files and lookup

Autohand selects one user configuration source in this order:

  1. An explicit --config <path>
  2. The AUTOHAND_CONFIG environment variable
  3. $AUTOHAND_HOME/config.toml
  4. $AUTOHAND_HOME/config.yaml
  5. $AUTOHAND_HOME/config.yml
  6. $AUTOHAND_HOME/config.json

AUTOHAND_HOME defaults to ~/.autohand. Keep only one of the four standard config files in that directory; multiple formats are rejected instead of being merged. JSON is created with safe defaults on first run when no file exists.

Project-local overlay

When a workspace is known, Autohand also reads .autohand/settings.local.json. The overlay supports provider, model, agent, network, telemetry, and permissions. Those values override or merge with the user config for that workspace.

{
  "version": 1,
  "provider": "openrouter",
  "model": "anthropic/claude-sonnet-4",
  "agent": {
    "maxIterations": 80
  },
  "permissions": {
    "allowList": ["run_command:npm test", "run_command:npm run lint"],
    "denyList": ["run_command:npm publish"]
  }
}

Keep this file local when it contains personal approvals. Project-scoped extensions, agents, skills, hooks, and MCP servers have their own documented storage and lifecycle; do not place arbitrary top-level user config inside this overlay.

Effective precedence

Explicit CLI flags control the current process. For persistent settings, the project overlay is merged over the selected user config, then supported environment variables override API and provider fields. A feature-specific runtime flag such as --no-idle-logout, --offline, or --no-browser applies last for that run.

Complete working example

This example shows the main current sections without embedding real credentials. Remove sections you do not use and provide secrets through your normal local secret-management process.

{
  "provider": "openrouter",
  "openrouter": {
    "apiKey": "replace-locally",
    "model": "anthropic/claude-sonnet-4",
    "contextWindow": 200000
  },
  "workspace": {
    "defaultRoot": "/work/projects",
    "allowDangerousOps": false
  },
  "ui": {
    "theme": "dark",
    "silentToolOutput": false,
    "showThinking": true,
    "completionReportEnabled": true,
    "promptSuggestions": true,
    "activityVerbs": ["Indexing", "Reviewing", "Testing"],
    "activityVerbsEnabled": true,
    "activitySymbol": "✳",
    "statusLine": {
      "showProviderModel": true,
      "showContext": true,
      "showWorkspacePath": true,
      "showGitBranch": true,
      "showCommandHint": true,
      "showPullRequest": true,
      "showSessionLines": false,
      "showQueue": true,
      "showActiveStatus": true,
      "showActiveMetrics": true,
      "showCancelHint": true
    }
  },
  "agent": {
    "maxIterations": 100,
    "enableRequestQueue": true,
    "idleLogoutEnabled": true,
    "idleTimeoutMs": 3600000,
    "sessionRetryLimit": 3,
    "sessionRetryDelay": 1000,
    "parallelToolConcurrency": 5,
    "toolSelectionCache": true,
    "autoMemory": true,
    "debug": false
  },
  "sessions": {
    "awareness": "warn"
  },
  "permissions": {
    "mode": "interactive",
    "allowList": ["run_command:git status --short"],
    "denyList": ["run_command:npm publish"],
    "rememberSession": true
  },
  "features": {
    "usageV2": false,
    "tokenUsageStatus": false,
    "slashGoal": false
  },
  "teams": {
    "enabled": true,
    "teammateMode": "auto",
    "maxTeammates": 5
  },
  "search": {
    "provider": "browser-profile"
  },
  "mcp": {
    "enabled": true,
    "servers": []
  },
  "hooks": {
    "enabled": true,
    "hooks": []
  },
  "telemetry": {
    "enabled": false
  },
  "autoReport": {
    "enabled": true
  },
  "sync": {
    "enabled": true,
    "interval": 300000,
    "exclude": [],
    "includeTelemetry": false,
    "includeFeedback": false
  }
}

Top-level keys

KeyPurpose
providerActive built-in, custom, or trusted extension provider.
autohandai, openrouter, ollama, llamacpp, openai, mlx, llmgateway, azure, zai, sakana, vertexai, xai, cerebras, nvidia, deepseek, bedrockBuilt-in provider-specific settings.
customProvidersUser-defined OpenAI-compatible endpoints selected as custom:<id>.
extensionProvidersSettings owned by a trusted runtime provider selected as extension:<id>.
workspaceDefault root and dangerous-operation preference.
uiTheme, terminal output, activity, notification, prompt, and status-line behavior.
agentIteration, queue, retry, parallelism, memory, and idle-session behavior.
sessionsConcurrent-session awareness for the same workspace.
permissionsPermission mode, allow/deny policy, rules, and decision caching.
networkRetry, timeout, and retry-delay values.
externalAgentsDiscovery of configured external agent directories.
api, authAutohand service endpoint, account state, and bare-mode API-key helper.
communitySkillsCommunity skill discovery, suggestions, and backup.
hooksConfigured shell lifecycle hooks.
automodeAutonomous-loop limits, checkpoints, worktree behavior, and circuit breakers.
share, syncSession sharing and cross-device settings/data sync.
telemetry, autoReportOpt-in telemetry and opt-out operational error reporting.
featuresLocal experimental flags and opt-outs for eligible remote flags.
searchWeb-search provider and provider-specific API keys.
mcpMCP enablement and server definitions.
teamsMulti-agent team enablement, display mode, and concurrency.
chromeBrowser bridge settings. The config key remains chrome; the public command is /browser.

Provider settings

Set the top-level provider to the provider Autohand should use. Common provider fields are model, apiKey, baseUrl, port, contextWindow, and reasoningEffort. Provider-specific integrations add fields such as Azure deployment/authentication data, Vertex project and region, xAI OAuth state, NVIDIA chat-template options, or Bedrock region and API mode.

Provider valueNotes
openrouterDefault provider; requires an API key and model.
ollama, llamacpp, mlxLocal server providers; configure model and optional base URL or port.
openaiAPI-key or ChatGPT authentication.
azure, vertexai, bedrockCloud-platform provider settings and platform credentials.
llmgateway, zai, sakana, xai, cerebras, nvidia, deepseekDirect provider integrations.
autohandaiAutohand Cloud or Apple Silicon local plan; hidden unless features.autohand_inference is enabled.
custom:<id>A configured OpenAI-compatible endpoint from customProviders.
extension:<id>A provider registered by an installed, enabled, trusted runtime extension.

Custom OpenAI-compatible providers

{
  "provider": "custom:company-gateway",
  "customProviders": {
    "company-gateway": {
      "id": "company-gateway",
      "displayName": "Company Gateway",
      "apiFormat": "openai-compatible",
      "baseUrl": "https://models.example.com/v1",
      "apiKey": "replace-locally",
      "apiKeyRequired": true,
      "model": "company-code",
      "contextWindow": 131072,
      "models": [
        {
          "id": "company-code",
          "label": "Company Code",
          "contextWindow": 131072,
          "reasoningEffort": "high"
        }
      ]
    }
  }
}

The object key and its id must match. apiFormat is currently openai-compatible. Set disabled to hide the provider without deleting its saved settings.

Trusted extension providers

{
  "provider": "extension:company-release",
  "extensionProviders": {
    "extension:company-release": {
      "model": "release-model",
      "apiKey": "replace-locally",
      "baseUrl": "https://models.example.com"
    }
  }
}

The extension controls additional fields, but every provider entry requires a non-empty model. The matching extension must be installed, enabled, trusted, and successfully activated. See Extension API v1.

UI settings

FieldDefaultDescription
theme"dark"Built-in, Ghostty, file-based, or inline custom theme name.
customThemes{}Inline theme definitions keyed by name.
autoConfirmfalseSkip confirmation for operations already considered safe; it does not override immutable security.
readFileCharLimit300Terminal display limit for read/find output; full output remains available to the model.
silentToolOutputfalseHide tool-output blocks without removing their transcript/model context.
showCompletionNotificationtrueShow an OS notification when work completes.
completionReportEnabledtrueAsk for a concise completion report after action turns.
showThinkingtrueDisplay returned model thinking/reasoning blocks.
terminalBelltrueRing the terminal bell on completion.
checkForUpdatestrueCheck for CLI releases on startup.
updateCheckInterval24Hours between update checks.
activityVerbsBuilt-in poolOne fixed string or a non-empty string array for the working indicator.
activityVerbsEnabledtrueRotate activity labels; when false, show Working....
activitySymbol"✳"Symbol before the working label.
localeDetectedDisplay locale such as en, fr, or ja.
notificationstrueBoolean or { enabled, title, sound } native-notification settings.
promptSuggestionstrueShow generated next-step suggestions in the prompt placeholder.
useInkRendererIgnoredDeprecated. Ink 7 + React 19 is the interactive renderer.

Status line

Every ui.statusLine field defaults to true except showSessionLines, which defaults to false.

FieldControls
showProviderModelProvider and model.
showContextRemaining or occupied context.
showWorkspacePathCurrent workspace path.
showGitBranchBranch or worktree label.
showCommandHintComposer hints for commands, mentions, skills, and shell entry.
showPullRequestAssociated pull request number.
showSessionLinesLines added and removed in the current session.
showQueueQueued request count.
showActiveStatusCurrent turn status.
showActiveMetricsElapsed time and token metrics.
showCancelHintEscape-key cancellation hint.

Use /statusline for the interactive editor.

Agent and concurrent-session settings

FieldDefaultDescription
agent.maxIterations100Maximum tool iterations for one request.
agent.enableRequestQueuetrueAllow follow-up input while an active turn runs.
agent.idleLogoutEnabledtrueLog out an authenticated interactive session after inactivity.
agent.idleTimeoutMs3600000Positive idle duration in milliseconds before logout.
agent.sessionRetryLimit3Maximum session-level retries.
agent.sessionRetryDelay1000Delay between retries in milliseconds.
agent.parallelToolConcurrency5Maximum parallel tool calls; use 1 for sequential execution.
agent.toolSelectionCachetrueCache local tool-schema selection for equivalent turns.
agent.autoMemorytruePersist durable, evidence-backed lessons after successful, failed, and cancelled interactive turns.
agent.debugfalseEnable verbose internal logging.
sessions.awareness"warn"How this session reacts to other live sessions in the same workspace.
Awareness modeBehavior
passivePublish presence and expose peer status without proactive warnings.
warnWarn about overlapping sessions and repository drift.
coordinateAdd coordination claims so concurrent agents can see active work ownership.
{
  "agent": {
    "autoMemory": true,
    "idleLogoutEnabled": true,
    "idleTimeoutMs": 7200000
  },
  "sessions": {
    "awareness": "coordinate"
  }
}

Use --no-idle-logout for one long-running process without changing the saved config. Run autohand agents --once to print the live local agent/session snapshot.

Permission settings

Autohand's immutable security checks run before configurable policy. Configuration can narrow or approve supported actions, but it cannot override the immutable blacklist.

{
  "permissions": {
    "mode": "interactive",
    "allowList": [
      "run_command:git status --short",
      "run_command:npm test"
    ],
    "denyList": [
      "run_command:npm publish"
    ],
    "rules": [
      {
        "tool": "run_command",
        "pattern": "git diff *",
        "action": "allow"
      }
    ],
    "rememberSession": true
  }
}
FieldDescription
modeinteractive, unrestricted, restricted, or programmatic external.
allowListCanonical exact or glob-like tool/context entries that do not require another prompt.
denyListCanonical entries that are always denied.
whitelist, blacklistDeprecated compatibility aliases for allowList and denyList.
rulesObjects with tool, optional pattern, and action of allow, deny, or prompt.
rememberSessionCache approval decisions for the current session; defaults to true.
allowPatterns, denyPatternsStructured tool patterns with kind and optional argument.
availableTools, excludedToolsStructured allow-only and deny tool filters.
allPathsAllowed, allUrlsAllowedApprove file-path or URL-fetching tool classes after higher-priority denials.

Use /permissions or autohand --permissions to inspect the effective user, project, and session policy. Saved “always” decisions may be written to user or project scope; keep project-local approvals reviewable.

Features and experiments

Use autohand experiments list or /experiments to see the effective feature state. Local flags persist to their config path. Eligible server-controlled flags may be turned off locally through features.remoteOverrides, but a local config cannot force on a server-disabled remote flag.

Feature idConfig pathDefault
mcpmcp.enabledOn
hookshooks.enabledOn
teamsteams.enabledOn
community_skillscommunitySkills.enabledOn
prompt_suggestionsui.promptSuggestionsOn
request_queueagent.enableRequestQueueOn
thinking_displayui.showThinkingOn
completion_notificationsui.showCompletionNotificationOn
terminal_bellui.terminalBellOn
tool_selection_cacheagent.toolSelectionCacheOn
usage_v2features.usageV2Off
cli_usage_v2features.cliUsageV2On
aws_bedrock_providerfeatures.awsBedrockProviderOn; restart required
slash_goalfeatures.slashGoalOff
token_usage_statusfeatures.tokenUsageStatusOff
experimental_forkfeatures.experimentalForkOff
experimental_clonefeatures.experimentalCloneOff
experimental_handofffeatures.experimentalHandoffOff
chrome_integrationchrome.enabledByDefaultOff; restart required
telemetrytelemetry.enabledOff
autohand experiments list
autohand experiments status token_usage_status
autohand experiments enable token_usage_status
autohand experiments disable token_usage_status
autohand experiments refresh

Autohand inference rollout flag

features.autohand_inference separately gates the Autohand Cloud/local provider, setup choices, model discovery, RPC, and ACP surfaces. It is off unless deliberately enabled in config or with AUTOHAND_FEATURE_AUTOHAND_INFERENCE=1 (also accepted in AUTOHAND_FEATURES).

Auto-mode and teams

Auto-mode fieldDefaultDescription
maxIterations50Maximum autonomous-loop iterations.
maxRuntime120Maximum runtime in minutes.
maxCost10Maximum estimated API cost in dollars.
checkpointInterval5Iterations between Git checkpoints.
completionPromise"DONE"Completion marker.
useWorktreetrueUse an isolated Git worktree by default.
noProgressThreshold3No-change circuit breaker.
sameErrorThreshold5Repeated-error circuit breaker.
testOnlyThreshold3Repeated test-only iteration breaker.
sameFileThreshold3Repeated same-file-only iteration breaker.
Team fieldDefaultDescription
enabledtrueEnable team commands and teammate execution.
teammateMode"auto"auto, in-process, or tmux display/execution mode.
maxTeammates5Maximum simultaneous teammates.

Network, search, telemetry, and reporting

FieldDefaultDescription
network.maxRetries3Maximum request retries, capped at five where enforced.
network.timeout30000Request timeout in milliseconds.
network.retryDelay1000Delay between retries in milliseconds.
search.provider"browser-profile"browser-profile, exa, google, brave, duckduckgo, or parallel.
search.braveApiKeyUnsetBrave Search API key.
search.parallelApiKeyUnsetParallel API key.
search.exaApiKeyUnsetExa API key.
telemetry.enabledfalseOpt in to product telemetry.
telemetry.apiBaseUrlAutohand APITelemetry endpoint override.
telemetry.enableSessionSynctrue when telemetry is activeEnable session sync in the telemetry client.
telemetry.companySecretUnsetCompany API authentication value.
autoReport.enabledtrueOpt out of automatic operational-error reports by setting false.

--offline disables startup network operations such as model-catalog and feature/announcement refreshes while preserving useful cached local state.

MCP and hooks

MCP servers

{
  "mcp": {
    "enabled": true,
    "servers": [
      {
        "name": "repository-tools",
        "transport": "stdio",
        "command": "npx",
        "args": ["-y", "@company/repository-mcp"],
        "env": {
          "LOG_LEVEL": "warn"
        },
        "autoConnect": true
      },
      {
        "name": "remote-tools",
        "transport": "http",
        "url": "https://mcp.example.com/mcp",
        "headers": {
          "Authorization": "Bearer replace-locally"
        },
        "autoConnect": true
      }
    ]
  }
}

A server requires name and transport. stdio requires command; http and sse require url. Optional fields are args, env, headers, and autoConnect. Manage servers with autohand mcp or /mcp. See MCP servers.

Lifecycle hooks

{
  "hooks": {
    "enabled": true,
    "hooks": [
      {
        "event": "post-tool",
        "command": "./scripts/record-tool-result.sh",
        "description": "Record completed tool calls",
        "enabled": true,
        "timeout": 5000,
        "async": false,
        "filter": {
          "tool": ["run_command"]
        }
      }
    ]
  }
}

Each definition requires event and command. It may also set description, enabled, timeout, async, matcher, and a tool/path filter. Current events cover tool, prompt, response, file, session, permission, notification, sub-agent, auto-mode, auto-research, learning, goals, teams, review, mode, and context lifecycles. See Hooks and events for the event payload and control-flow contract.

Authentication, community skills, sharing, and sync

SectionFields
authtoken, user, expiresAt, and apiKeyHelper. The helper prints an explicit API key for bare mode.
apibaseUrl and companySecret; environment overrides are preferred for deployment-specific values.
communitySkillsenabled, showSuggestionsOnStartup, and autoBackup; each defaults to true.
shareenabled; defaults to true for the /share surface.
syncenabled, interval in milliseconds, glob exclude, includeTelemetry, and includeFeedback.
externalAgentsenabled and an array of directory paths.
{
  "communitySkills": {
    "enabled": true,
    "showSuggestionsOnStartup": true,
    "autoBackup": true
  },
  "share": {
    "enabled": false
  },
  "sync": {
    "enabled": true,
    "interval": 300000,
    "exclude": ["temp/*"],
    "includeTelemetry": false,
    "includeFeedback": false
  },
  "externalAgents": {
    "enabled": true,
    "paths": ["/work/shared-agents"]
  }
}

Sync handles canonical memory event logs by event id instead of overwriting one device's history with another. Derived memory caches and locks are not synced. Sensitive config fields are encrypted for account sync, but you should still avoid committing secrets to a repository.

Browser integration

The historical config object remains chrome for compatibility. The public CLI and slash-command surface is browser-neutral: --browser, --no-browser, and /browser. The older --chrome aliases remain hidden compatibility inputs.

{
  "chrome": {
    "extensionId": "installed-extension-id",
    "browser": "auto",
    "userDataDir": "/path/to/browser/user-data",
    "profileDirectory": "Default",
    "installUrl": "https://autohand.ai/chrome",
    "enabledByDefault": false
  }
}
FieldDescription
extensionIdInstalled extension id for direct handoff.
browserauto, chrome, chromium, brave, or edge.
userDataDirBrowser user-data root.
profileDirectoryProfile directory such as Default or Profile 1.
installUrlFallback install/continue URL.
enabledByDefaultStart the bridge with the CLI; defaults to false.

Environment variables

VariablePurpose
AUTOHAND_HOMEBase directory for user config, extensions, agents, skills, sessions, memory, and caches.
AUTOHAND_CONFIGExplicit config path when --config is not supplied.
AUTOHAND_MODELS_CATALOGCustom provider-model catalog path.
AUTOHAND_API_URLAutohand API base URL; overrides api.baseUrl.
AUTOHAND_AUTH_URLSign-in and account-sync origin.
AUTOHAND_SECRETCompany secret; overrides api.companySecret.
AUTOHAND_API_KEYExplicit Autohand API key, including bare-mode authentication.
AUTOHAND_AI_PLAN, AUTOHAND_AI_API_KEY, AUTOHAND_AI_BASE_URLAutohand AI provider overrides when the rollout flag is enabled.
AUTOHAND_FEATURE_AUTOHAND_INFERENCE, AUTOHAND_FEATURESEnable the gated Autohand inference surface.
AZURE_OPENAI_KEY, AZURE_OPENAI_ENDPOINT, AZURE_OPENAI_DEPLOYMENT, AZURE_OPENAI_API_VERSIONAzure OpenAI overrides.
AZURE_TENANT_ID, AZURE_CLIENT_ID, AZURE_CLIENT_SECRETAzure Entra/service-principal authentication.
AWS_REGION, AWS_DEFAULT_REGIONBedrock region fallback.
AUTOHAND_PERMISSION_CALLBACK_URL, AUTOHAND_PERMISSION_CALLBACK_TIMEOUTExperimental external permission callback.
AUTOHAND_NON_INTERACTIVE, AUTOHAND_YESNon-interactive and auto-confirm runtime controls.
AUTOHAND_NO_BANNER, AUTOHAND_STREAM_TOOL_OUTPUT, AUTOHAND_DEBUGTerminal and diagnostic controls.
AUTOHAND_THINKING_LEVELnone, normal, or extended reasoning depth.
AUTOHAND_CODE_SIMPLEEnable bare mode without --bare.
AUTOHAND_SKIP_UPDATE_CHECKSkip startup release checks.

Runtime-only controls

Some current CLI capabilities intentionally do not persist as config:

ControlContract
--bareMinimal startup: disables ambient hooks, LSP, plugin sync/loading, attribution, auto-memory, background prefetches, keychain/browser login fallback, AGENTS.md discovery, telemetry/reporting/sync, and slash commands. Explicit extensions, MCP config, agents, plugin directories, system prompts, and added directories remain available through their normal explicit inputs.
--offlineSuppress startup network refreshes while retaining local/cached state.
--output-format stream-jsonOne JSON object per command lifecycle event for a one-shot prompt.
--json streamAlias for streamed JSON Lines.
--json localOne final machine-readable result object.
--no-idle-logoutDisable idle logout for this process.
--browser, --no-browserEnable or disable browser integration for the current run.

Structured output requires a one-shot prompt. --output-format stream-json cannot be combined with --json local.