docs/nodes/voicewake.md
OpenClaw treats wake words as a single global list owned by the Gateway.
Wake words and routing rules are stored in the gateway state database:
~/.openclaw/state/openclaw.sqliteThe active tables are:
voicewake_triggersvoicewake_routing_configvoicewake_routing_routesLegacy settings/voicewake.json and settings/voicewake-routing.json files are
doctor migration inputs only; runtime reads and writes the SQLite tables.
voicewake.get → { triggers: string[] }voicewake.set with params { triggers: string[] } → { triggers: string[] }Notes:
voicewake.routing.get → { config: VoiceWakeRoutingConfig }voicewake.routing.set with params { config: VoiceWakeRoutingConfig } → { config: VoiceWakeRoutingConfig }VoiceWakeRoutingConfig shape:
{
"version": 1,
"defaultTarget": { "mode": "current" },
"routes": [{ "trigger": "robot wake", "target": { "sessionKey": "agent:main:main" } }],
"updatedAtMs": 1730000000000
}
Route targets support exactly one of:
{ "mode": "current" }{ "agentId": "main" }{ "sessionKey": "agent:main:main" }voicewake.changed payload { triggers: string[] }voicewake.routing.changed payload { config: VoiceWakeRoutingConfig }Who receives it:
VoiceWakeRuntime triggers.voicewake.set and then relies on the broadcast to keep other clients in sync.VoiceWakeManager trigger detection.voicewake.set (over the Gateway WS) and also keeps local wake-word detection responsive.