Skip to content
Download

Operate and reference

Configuration reference ​

This page documents the user-facing keys of config.yaml for sMind by Spacing Mind, where the file lives and the default of each key. It is for people who tune or operate the daemon.

sMind by Spacing Mind, version 0.17.0. This page describes the 0.17.0 release.

The daemon reads one file, config.yaml. Every key is optional. A missing key keeps its default, and a missing file is fine.

Where config.yaml lives ​

The file is config.yaml inside the smind home directory. The home directory is ~/.smind unless the SMIND_HOME environment variable names another one. The daemon log, daemon.log, lives in the same directory.

sh
SMIND_HOME=/srv/smind smind serve

The CLI and the daemon must see the same SMIND_HOME. smind status prints the home directory and config file path the CLI uses.

Change settings from the command line ​

smind config edits the file for you and keeps its comments.

sh
smind config get                       # all settable keys
smind config get server.port           # one key
smind config set server.port 4650
smind config unset server.port         # back to the default

Only these paths can be set:

PathValue
server.portA port from 1 to 65535.
server.listenhost:port to bind.
server.hostnamesComma-separated host names.
providers.<id>.defaultModelA model name. <id> is claude-native, codex-native, glm or kimi.

server.passwordHash can only be removed with smind config unset. Set it with smind set-password. Every other key below is edited by hand in config.yaml.

Changes apply when the daemon restarts. If the file does not parse or a value fails the checks below, the daemon logs a config: error and carries on with its default settings, so check the log after you edit by hand.

Keys ​

config get shows values as stored in the file. It does not show defaults or environment overrides.

server ​

KeyDefaultNotes
server.port4648Port of the default listen address.
server.listenemptyhost:port. Empty means 127.0.0.1 and server.port. If it also names a port, that port must match server.port.
server.hostnamesemptyExtra Host header names accepted besides localhost and IP addresses. A leading . matches the domain and its subdomains, such as .example.com. No ports, schemes or wildcards.
server.passwordHashemptyA bcrypt hash written by smind set-password.

A non-loopback server.listen (for example 0.0.0.0:4648) needs a password. The daemon refuses to start without one. The daemon always also listens on 127.0.0.1 so local clients keep working.

orchestration ​

KeyDefaultNotes
orchestration.maxDepth2How many ancestors a task may have. A root task is depth 0.
orchestration.maxConcurrentRunsPerTree4Runs that may be active at once in one task tree. Must be 1 or more.
orchestration.notifyParenttrueWhen a child task goes quiet, queue one message on the parent chat.
orchestration.notifyDebounceSeconds20Hold a parent message so several finished children merge into one. 0 sends at once.
orchestration.stallAlertMinutes15Raise a "tree stalled" notification after this long with unfinished work and nothing running or queued. 0 turns it off.

worktrees ​

KeyDefaultNotes
worktrees.setupTimeoutSeconds600Time limit for a task's setup script.
worktrees.teardownTimeoutSeconds120Time limit for a teardown script.
worktrees.ports.rangeemptylo-hi inside 1024-65535. Empty turns per-task port allocation off.

providers ​

yaml
providers:
  claude-native:
    defaultModel: sonnet
    env:
      CLAUDE_CONFIG_DIR: ~/.claude-work
KeyDefaultNotes
providers.<id>.defaultModelemptyModel a run uses when nothing else names one. Empty keeps the provider's own default. Up to 100 characters from letters, digits and . _ : / @ [ ] -; it may not start with -.
providers.<id>.env.CLAUDE_CONFIG_DIRemptyclaude-native only. An absolute path, or one starting with ~/.
providers.<id>.env.CODEX_HOMEemptycodex-native only. Same rules.
providers.customemptyA list of extra providers: instances of Claude Code or Codex with their own config directory (extends), and custom ACP agents (command). See Provider instances.

An unknown provider id under providers.<id> is an error. See Providers for the launch environment.

agents ​

KeyDefaultNotes
agents.glm.maxTurnsunsetTurn limit passed to the GLM agent. From 1 to 10000. Unset keeps the agent's own default.
agents.sharedCachestrueAgent runs reuse your normal Go, npm and bun caches (GOMODCACHE, GOCACHE, npm_config_cache, BUN_INSTALL_CACHE_DIR), so a temporary HOME does not re-download or rebuild. A value the agent's own env already sets is never overridden.

accountUsage ​

KeyDefaultNotes
accountUsage.enabledtrueTurn off to stop every outbound usage request.
accountUsage.ttlSeconds300How long a usage snapshot stays fresh. It can only be raised; the minimum is 300.
accountUsage.routingtrueRoute around accounts whose usage window is exhausted.
accountUsage.exhaustThresholdPct100Usage percent at which an account counts as exhausted. From 1 to 100.
accountUsage.passivetrueWatch runs passively and cool down accounts that hit a limit.

relay ​

KeyDefaultNotes
relay.maxDevices16How many paired devices may be connected at once. Must be 1 or more.
relay.legacyDevicesfalseAdmits older apps that cannot prove a device identity, without approval. Leave it off.

push ​

KeyDefaultNotes
push.enabledtrueSend mobile push notifications. A daemon with no registered phone sends nothing.
push.expoAccessTokenemptyOnly needed if your push project requires it. Prefer the SMIND_EXPO_ACCESS_TOKEN variable over writing it here.

log ​

KeyDefaultNotes
log.maxSizeMB10Size at which daemon.log rotates. Must be 1 or more.
log.maxFiles5Log files kept, including the active one. Must be 1 or more.

fleet ​

KeyDefaultMeaning
fleet.enabledfalseTurns on connected hosts. Only a hand edit of this file turns it on, and it needs a restart. With it off no key is created and nothing dials out.
fleet.maxHosts16The most hosts one daemon may be paired with.
fleet.handshakeSeconds10How long a peer handshake may take.
fleet.replayWindowMinutes10How long a request id is remembered to refuse a replay.
fleet.auditRetentionDays30How long the fleet audit trail is kept.

automations ​

KeyDefaultMeaning
automations.enabledfalseRuns the automation engine. With it off nothing polls and nothing fires. Read on every tick.
automations.pausedfalseRecords every signal as paused and fires nothing, keeping all state.
automations.maxBudgetUsd10The most a single automation run's budget may be.
automations.allowRemoteManagefalseLets a direct non-loopback connection create, enable, resume or fire automations. Relay sessions and agents are refused either way.
automations.allowUnattendedModesfalseLets an automation use autoAccept or a full-access permission mode.

plugins ​

KeyDefaultNotes
plugins.enabledfalseTurns plugins on. With it off, no plugin adds anything. Read on every request, no restart needed.
plugins.allowRemoteManagefalseLets a direct connection that is not a loopback connection install, enable, disable, remove, update or reload plugins. Read on every request.

With plugins.allowRemoteManage off, those actions need a loopback connection. A same-host reverse proxy that terminates TLS counts as loopback. Paired phones (the relay) and agents cannot manage plugins whatever this is set to. See Plugins.

steward ​

KeyDefaultMeaning
steward.policy.enabledfalseTurn on the standing permission policy in ~/.smind/steward/policy.yaml (see Scripting and permissions). Read on every decision.
steward.enabledfalseTurn on the Steward review engine. Read on every decision.
steward.autoReview[]Workspace titles (exact match) whose finished root Lead runs with a pushed branch are reviewed without being asked.
steward.annotatefalseLet the review seat attach an advisory recommendation to an escalated permission request.
steward.budgetUsd1.5Cost cap of one review. 0 means the default.
steward.maxBudgetUsd5Ceiling for budgetUsd; at most 5.
steward.maxMinutes20Time cap of one review, at most 60.
steward.maxReviewsPerHour6Reviews across all tasks per hour, at most 24.
steward.maxReviewsPerTask5Reviews per task.

learning ​

Learning is on by default. Set learning.enabled: false to stop collection and delivery everywhere. Defaults for the other keys are tuned already; change them only if you know you need to.

KeyDefault
learning.enabledtrue
learning.cadenceToolCalls50
learning.tailFlushPending10
learning.tailIdleMinutes30
learning.cooldownMinutes30
learning.windowKB120
learning.recordKB4
learning.inputKB1
learning.resultKB1
learning.failureResultKB2
learning.dailyBudgetUSD0.25
learning.dailyBudgetTokens150000
learning.probationRuns25
learning.capacity30
learning.curatorEveryLandings5
learning.curatorMinSkills8
learning.curatorMinIntervalDays7
learning.prefaceBudgetBytes6144
learning.claudeIndexPrefacefalse
learning.similarity.duplicate0.85
learning.similarity.possible0.6
learning.reflectorModelclaude-haiku-5-5
learning.curatorModelclaude-haiku-5-5
learning.probe.prevalenceDays30
learning.probe.prevalenceMaxEvents20000
learning.probe.perProbeBudgetUSD1.5
learning.probe.dailyBudgetUSD3
learning.probe.quotaSkipPercent80
learning.probe.armTimeoutMinutes15
learning.probe.maxTurnsCap80
learning.probe.retentionDays14
learning.probe.outputCapKB256

Every number must be 1 or more. Budgets must be above 0, and learning.probe.perProbeBudgetUSD may not exceed learning.probe.dailyBudgetUSD. learning.similarity needs 0 < possible < duplicate <= 1.

Environment variables ​

VariableEffect
SMIND_HOMEHome directory instead of ~/.smind.
SMIND_LISTENOverrides server.listen.
SMIND_HOSTNAMESOverrides server.hostnames. Separate names with commas or spaces.
SMIND_PASSWORDPassword for remote clients, hashed in memory at start. It is never read from or written to config.yaml. Handy for containers.
SMIND_PUSH0, false, off, no, n, f or disabled turns push notifications off.
SMIND_EXPO_ACCESS_TOKENOverrides push.expoAccessToken.
SMIND_LEARNINGThe same off values force learning.enabled off.
SMIND_VERSION, SMIND_INSTALL_DIR, SMIND_APP_DIRRead by the install scripts. See Getting started.

Environment variables win over the file.