config.json defines the structure and default values. PostgreSQL stores runtime overrides that take effect immediately without a restart. When the bot starts, it seeds the database from config.json if the database is empty, then merges the two layers in memory.
Changes made via
/config set or the web dashboard are written to PostgreSQL and
applied immediately. You do not need to restart the bot.How the two layers work
Layer 1 —config.json is the authoritative set of defaults. It is read from disk once at startup and never written at runtime. If the database is unavailable, the bot falls back to this file.
Layer 2 — PostgreSQL stores any values that have been changed since the initial seed. Each changed key is stored as a row in the config table with a guild_id column. The special value 'global' is used for server-wide defaults; individual Discord guild IDs are used for per-server overrides.
At runtime the bot deep-merges global defaults with any guild-level overrides so that each guild sees its own effective configuration.
config.json structure
The file contains one top-level key per feature. All keys are present in the default file; features that are not yet enabled have"enabled": false.
config.json
Configurable sections
Not every key inconfig.json is writable via the API or dashboard. The SAFE_CONFIG_KEYS allowlist in src/api/utils/configAllowlist.js controls which sections can be updated at runtime. Sections that are missing from this list (for example logging) are readable but not writable through the API.
Writable sections (dashboard and API):
| Section | Description |
|---|---|
ai | AI assistant settings: channels, history, thread mode, feedback |
triage | Message triage pipeline: models, budgets, keywords, timeouts |
welcome | Member welcome messages and dynamic greeting behavior |
moderation | Alerts, DM notifications, escalation rules, role protection |
starboard | Reaction-based starboard channel and threshold |
permissions | Role assignments and per-command permission levels |
memory | Long-term user memory via mem0 |
botStatus | Online status and activity rotation |
aiAutoMod | AI-powered auto-moderation thresholds and actions |
announce | Announcement feature toggle |
afk | AFK status feature toggle |
tldr | Channel summary command settings |
engagement | Message and reaction tracking |
reputation | XP system, level thresholds, role rewards |
challenges | Daily coding challenge posts |
review | Code review request tracking |
reminders | User reminder command settings |
github | GitHub feed integration |
showcase | Project showcase feature |
snippet | Code snippet feature toggle |
poll | Poll feature toggle |
help | Help command feature toggle |
auditLog | Audit log retention settings |
Changing config at runtime
You can update configuration in two ways:/config slash command
Use
/config set, /config view, and /config reset directly in Discord. Requires the admin permission level.Web dashboard
Use the Settings pages in the web dashboard. Changes are validated against the schema before being written.
/config slash command
The/config command has three subcommands:
View the current config
section: to inspect a specific section in full.Set a value
path argument uses dot notation. Values are auto-coerced: true/false become booleans, numeric strings become numbers, null becomes null. To force a literal string, wrap the value in escaped quotes: "\"my text\"".Per-guild overrides
Every guild that uses Volvox.Bot can have its own configuration. When a user runs/config set inside a Discord server, the change is scoped to that guild’s guild_id row in the database. The bot deep-merges each guild’s overrides onto the global defaults at request time, so only the keys a guild has explicitly changed differ from the global config.
Running /config reset without a section clears all of a guild’s overrides and restores it to the global defaults.