Skip to main content

Bot Module Updates

When you publish a new version of your bot module, Lumio updates all installations while preserving every customization the user has made. This page explains the update lifecycle and the override resolution system.

Override resolution

Every configurable field follows a single rule:

resolved_value = COALESCE(user_override, extension_default)

If the user has set a custom value, that value is used. If not, the extension default is used. User overrides are never overwritten by extension updates.

What users can override

Users customize bot modules through the dashboard settings panel:

SettingExtension providesUser can override
Command cooldown (global)Default valueCustom value
Command cooldown (per-user)Default valueCustom value
Command min roleDefault valueRaise (not lower) the minimum role
Command enabledtrueToggle on/off
Command aliasName from manifestAlternative name (e.g. punkte for points)
Keyword enabledtrueToggle on/off per keyword
Custom keywordsNoneUser-added keywords
Timer intervalDefault intervalCustom interval
Timer enabledtrueToggle on/off
Config valuesDefaults from config_schemaCustom values

Update flow

When you publish a new version:

Developer publishes new version
|
v
API marks version as "published"
|
v
Auto-update enabled?
-> Yes: automatic install
-> No: Update badge in dashboard, user clicks "Update"
|
v
extension_installs.version_id updated
|
v
Three things happen:
1. Config migration
2. Trigger sync
3. Worker + bot reload

1. Config migration (non-destructive)

ChangeResult
New config_schema field addedDefault value inserted (user has no override yet)
config_schema field removedUser override kept as dead data, cleaned on next save
Default value changedNo effect on users with existing overrides
Default value changedUsers without overrides get the new default

2. Trigger sync (non-destructive)

ChangeResult
New command addedAppears with extension defaults, no user override
Command removedUser overrides for that command are cleaned up
Command renamedOld name removed (with override cleanup), new name appears with defaults
Cooldown/role defaults changedNo effect on users with overrides
New keyword addedAppears enabled by default
Keyword removedUser overrides cleaned up
New pattern addedAppears enabled by default
Pattern removedCleaned up
New timer addedAppears enabled with default interval
Timer removedUser overrides cleaned up
Timer interval changedNo effect on users with custom intervals
Handler logic changedNew code loaded, no config impact

User-added custom keywords are always preserved across updates.

3. Worker and bot reload

After the update:

  • Bots reload the extension trigger lists (commands, keywords, patterns, moderation flag)
  • The Worker invalidates its V8 cache, loads the new handler code, and restarts timers with current intervals

Update safety matrix

What changedUser has override?Result
Default cooldown 5s to 3sYes (10s)User keeps 10s
Default cooldown 5s to 3sNoUser gets new default 3s
New command addedN/AAppears with extension defaults
Command removedYesOverride cleaned up, command gone
New config fieldN/ADefault value inserted
Config field removedYesOverride kept (dead data, cleaned on save)
Keyword addedN/AEnabled by default
Keyword removedYes (disabled)Override cleaned up
User-added keywordN/APreserved, never touched by updates
Handler logic changedN/ANew code loaded, no config impact
Timer interval changedYes (custom)User keeps custom interval
Timer interval changedNoUser gets new default
New timer addedN/AAppears enabled with default interval

Best practices for updates

Adding new features

When adding new commands, keywords, or config fields, users get sensible defaults automatically. No migration code is needed.

{
"triggers": {
"commands": [
{ "name": "points", "description": "Existing command" },
{ "name": "leaderboard", "description": "New command in v1.1.0" }
]
},
"config_schema": [
{ "key": "pointsPerMessage", "type": "number", "label": "Points per message", "default_value": 1 },
{ "key": "leaderboardSize", "type": "number", "label": "Leaderboard entries", "default_value": 10 }
]
}

Removing features

When removing a command or config field, the user's overrides are cleaned up automatically. No manual cleanup code is needed.

Renaming commands

If you rename a command (e.g., !pts to !points), the old command is removed and the new one appears with defaults. Users who had aliases on the old command will need to reconfigure them. Consider this when renaming commands in minor versions.

Changing defaults

Changing a default cooldown or config value only affects users who have not customized that setting. Users with overrides keep their customized values. This means you can safely adjust defaults without disrupting existing users.