> ## Documentation Index
> Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Voice wake

OpenClaw treats **wake words as a single global list** owned by the **Gateway**.

* There are **no per-node custom wake words**.
* **Any node/app UI may edit** the list; changes are persisted by the Gateway and broadcast to everyone.
* macOS and iOS keep local **Voice Wake enabled/disabled** toggles (local UX + permissions differ).
* Android currently keeps Voice Wake off and uses a manual mic flow in the Voice tab.

## Storage (Gateway host)

Wake words are stored on the gateway machine at:

* `~/.openclaw/settings/voicewake.json`

Shape:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{ "triggers": ["openclaw", "claude", "computer"], "updatedAtMs": 1730000000000 }
```

## Protocol

### Methods

* `voicewake.get` → `{ triggers: string[] }`
* `voicewake.set` with params `{ triggers: string[] }` → `{ triggers: string[] }`

Notes:

* Triggers are normalized (trimmed, empties dropped). Empty lists fall back to defaults.
* Limits are enforced for safety (count/length caps).

### Routing methods (trigger → target)

* `voicewake.routing.get` → `{ config: VoiceWakeRoutingConfig }`
* `voicewake.routing.set` with params `{ config: VoiceWakeRoutingConfig }` → `{ config: VoiceWakeRoutingConfig }`

`VoiceWakeRoutingConfig` shape:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "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" }`

### Events

* `voicewake.changed` payload `{ triggers: string[] }`
* `voicewake.routing.changed` payload `{ config: VoiceWakeRoutingConfig }`

Who receives it:

* All WebSocket clients (macOS app, WebChat, etc.)
* All connected nodes (iOS/Android), and also on node connect as an initial "current state" push.

## Client behavior

### macOS app

* Uses the global list to gate `VoiceWakeRuntime` triggers.
* Editing "Trigger words" in Voice Wake settings calls `voicewake.set` and then relies on the broadcast to keep other clients in sync.

### iOS node

* Uses the global list for `VoiceWakeManager` trigger detection.
* Editing Wake Words in Settings calls `voicewake.set` (over the Gateway WS) and also keeps local wake-word detection responsive.

### Android node

* Voice Wake is currently disabled in Android runtime/Settings.
* Android voice uses manual mic capture in the Voice tab instead of wake-word triggers.

## Related

* [Talk mode](/nodes/talk)
* [Audio and voice notes](/nodes/audio)
* [Media understanding](/nodes/media-understanding)
