Skip to main content

Documentation Index

Fetch the complete documentation index at: https://soulforge.proxysoul.com/llms.txt

Use this file to discover all available pages before exploring further.

Config lives in two files. Project wins.
ScopePath
Global~/.soulforge/config.json
Project.soulforge/config.json

Full example

{
  "defaultModel": "anthropic/claude-sonnet-4-6",
  "thinking": { "mode": "adaptive" },
  "repoMap": true,
  "semanticSummaries": "ast",
  "diffStyle": "default",
  "chatStyle": "accent",
  "toolTimeout": 2,
  "compaction": {
    "strategy": "v2",
    "triggerThreshold": 0.7,
    "keepRecent": 4
  },
  "taskRouter": {
    "spark":      "anthropic/claude-haiku-4",
    "ember":      "anthropic/claude-sonnet-4-6",
    "compact":    "google/gemini-2.5-flash"
  },
  "agentFeatures": {
    "desloppify": true,
    "tierRouting": true,
    "dispatchCache": true,
    "targetFileValidation": true
  },
  "retry": { "maxAttempts": 5, "baseDelayMs": 3000 }
}

Fields

Model

FieldDefaultWhat it does
defaultModel"none"Active model ID. "none" forces picker on launch.
thinking.mode"off""off", "adaptive", "enabled"
thinking.budgetTokens when mode: "enabled" (1024, 2048, 5000, 10000, 20000)

Display

FieldDefaultWhat it does
diffStyle"default""default", "sidebyside", "compact"
chatStyle"accent""accent", "bubble"
vimHintstrueShow Vim keybinding hints
nerdFonttrueNerd Font icons (off shows ASCII)

Intelligence

FieldDefaultWhat it does
repoMaptrueBuild the codebase graph on launch
semanticSummaries"ast""ast", "llm", "off"
toolTimeout2Tool call timeout in minutes. 0 disables.

Compaction

See compaction for what these do.
"compaction": {
  "strategy": "v2",
  "triggerThreshold": 0.7,
  "resetThreshold": 0.4,
  "keepRecent": 4,
  "maxToolResults": 30,
  "llmExtraction": true
}

Retry

For 429s and transient errors. Delays double each attempt.
"retry": { "maxAttempts": 5, "baseDelayMs": 3000 }

Task router

Assign different models to different jobs. See the task router recipe for tuning tips.
"taskRouter": {
  "spark":      "anthropic/claude-haiku-4",
  "ember":      "anthropic/claude-sonnet-4-6",
  "webSearch":  "anthropic/claude-haiku-4",
  "desloppify": "anthropic/claude-haiku-4",
  "verify":     "anthropic/claude-haiku-4",
  "compact":    "google/gemini-2.5-flash",
  "semantic":   "anthropic/claude-haiku-4",
  "default":    null
}
SlotRuns when
sparkRead-only research agents
emberCode-writing agents
webSearchWeb search agent
desloppifyCleanup pass after code edits
verifyAdversarial review after code edits
compactContext compaction
semanticRepo map one-line summaries
defaultFallback for background tasks
Resolution: taskRouter[slot]taskRouter.default → active model.

Agent features

"agentFeatures": {
  "desloppify": true,
  "tierRouting": true,
  "dispatchCache": true,
  "targetFileValidation": true
}
FeatureWhat it does
desloppifyRun cleanup agent after code agents
tierRoutingAuto-route trivial tasks to cheap model
dispatchCacheShare file reads across dispatches
targetFileValidationRequire file paths on dispatch tasks
Toggle in the TUI with /agent-features.

Providers

Pick keys and add custom providers on the dedicated pages:

Auth & key storage

Keys go to your OS keychain when available, with a file fallback otherwise.
PlatformBackend
macOSLogin Keychain (security), service soulforge
Linuxlibsecret via secret-tool (GNOME Keyring, KWallet)
Linux without secret-tool~/.soulforge/secrets.json, mode 0600
Windows (WSL)Same as Linux above
soulforge --set-key <provider> <key> writes to whichever backend is active. Inspect with soulforge --list-providers.

Lookup order

{ "keyPriority": "env" }
ValueOrder
"env" (default)env var → keychain → file
"app"keychain → file → env var
Use "app" when shell-exported keys keep overriding stored ones.

Pass a key per-launch

Env vars work for the TUI too — useful for one-off sessions or CI:
LLM_GATEWAY_API_KEY=sk-... soulforge
ANTHROPIC_API_KEY=sk-ant-... soulforge
Nothing is persisted. There is no --key flag — the TUI only reads stored keys and env vars.

Remove a key

/keys inside the TUI lists every provider with delete shortcuts. Or delete from the keychain directly (security delete-generic-password -a soulforge -s anthropic-api-key on macOS).

Instruction files

Auto-load project rules from AI-tool markdown files:
{ "instructionFiles": ["soulforge", "claude", "cursorrules"] }
KeyFileDefault
soulforgeSOULFORGE.mdon
claudeCLAUDE.mdoff
cursorrules.cursorrulesoff
copilot.github/copilot-instructions.mdoff
cline.clinerulesoff
windsurf.windsurfrulesoff
aider.aider.conf.ymloff
codexAGENTS.mdoff
opencode.opencode/instructions.mdoff
ampAMPLIFY.mdoff
Toggle in TUI with /instructions.

Privacy

Block files from the agent:
/privacy add .env
/privacy add secrets/**
Built-ins already cover .env, .pem, credentials, id_rsa, .npmrc, .netrc, shadow, passwd.

Environment variables

VariableDefaultPurpose
SOULFORGE_NO_REPOMAPunsetSkip the repo-map scan at startup.
SOULFORGE_MAX_OUTPUT_TOKENS32000Per-step output cap for all agents (forge + subagents + web-search). Raise for reasoning models that hit finish_reason=length; the agent loop exits silently on truncation, so increasing this prevents mid-thought stops.

Hooks

Covered on the hooks page. Short version: SoulForge reads hooks.{Event} from all 5 config sources (Claude Code’s three + SoulForge’s two), fires all matches.

Storage

/storage shows per-component disk usage (repo map, sessions, plans, memory, input history, binaries, fonts) with one-click cleanup.

Scope priority

Session → Project → Global. Changes via commands land in whatever scope the command targets. Use /model-scope to move the active model between project and global.