Configuration
Configuration is a stack of JSON files on a mounted volume. One file per concern. The dashboard is the normal editor.
Mental model
Configuration lives in three layers. The dashboard edits almost all of it; understanding the storage model matters only when you operate on disk, debug persistence, or script deployments.
The reader should picture configuration as a stack of JSON files on a mounted volume, each owning one runtime concern. Nothing is stored in a central database. Nothing is stored in the image. Restarting the container without the volume wipes everything except what is baked into the image.
Three layers
Workspace storage
The mounted volume at STORAGE_PATH. Holds sessions, preferences, skills, memory, traces, artifacts. The only place persistent state lives.
Disk
Runtime sections
Separate JSON files under preferences/ — llm-providers, model-router, tools, memory, skills, mcp, voice, hive, webhooks. Each owns one concern.
Runtime
User preferences
Operator-facing settings surface. The dashboard reads and writes the JSON files directly. Changes take effect without restart unless noted.
UI
Runtime sections
Runtime sections are separate files on purpose. A single giant config blob would force readers through everything to change one setting, complicate merge conflicts, and make diff review painful. Splitting by concern keeps changes scoped and inspectable.
workspace/
└── preferences/
├── llm-providers.json # API keys, provider type
├── model-router.json # Tier mappings
├── tools.json # Filesystem, shell, limits
├── memory.json # Recall, promotion, disclosure
├── skills.json # Skill management flags
├── mcp.json # MCP global flag and timeouts
├── voice.json # TTS/STT providers
├── hive.json # Hive integration
├── webhooks.json # Webhook endpoints and secret
└── admin.json # Admin accountPersistence and volume strategy
Without a mounted volume, every container restart wipes sessions, settings, admin credentials, skills, memory, and traces. Always mount a persistent volume in production.
docker run -d \
-e STORAGE_PATH=/app/workspace \
-e TOOLS_WORKSPACE=/app/sandbox \
-v golemcore-bot-data:/app/workspace \
-v golemcore-bot-sandbox:/app/sandbox \
-p 8080:8080 \
ghcr.io/alexk-dev/golemcore-bot:latestdocker inspect golemcore-bot --format '{{ range .Mounts }}{{ .Source }} → {{ .Destination }}{{ "\n" }}{{ end }}'/var/lib/docker/volumes/golemcore-bot-data/_data → /app/workspace
/var/lib/docker/volumes/golemcore-bot-sandbox/_data → /app/sandbox