Hooks are small scripts that run when something happens inside the Gateway. They can be discovered from directories and inspected withDocumentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
openclaw hooks. The Gateway loads internal hooks only after you enable hooks or configure at least one hook entry, hook pack, legacy handler, or extra hook directory.
There are two kinds of hooks in OpenClaw:
- Internal hooks (this page): run inside the Gateway when agent events fire, like
/new,/reset,/stop, or lifecycle events. - Webhooks: external HTTP endpoints that let other systems trigger work in OpenClaw. See Webhooks.
openclaw hooks list shows both standalone hooks and plugin-managed hooks.
Quick start
Event types
| Event | When it fires |
|---|---|
command:new | /new command issued |
command:reset | /reset command issued |
command:stop | /stop command issued |
command | Any command event (general listener) |
session:compact:before | Before compaction summarizes history |
session:compact:after | After compaction completes |
session:patch | When session properties are modified |
agent:bootstrap | Before workspace bootstrap files are injected |
gateway:startup | After channels start and hooks are loaded |
gateway:shutdown | When gateway shutdown begins |
gateway:pre-restart | Before an expected gateway restart |
message:received | Inbound message from any channel |
message:transcribed | After audio transcription completes |
message:preprocessed | After media and link preprocessing completes or is skipped |
message:sent | Outbound message delivered |
Writing hooks
Hook structure
Each hook is a directory containing two files:HOOK.md format
metadata.openclaw):
| Field | Description |
|---|---|
emoji | Display emoji for CLI |
events | Array of events to listen for |
export | Named export to use (defaults to "default") |
os | Required platforms (e.g., ["darwin", "linux"]) |
requires | Required bins, anyBins, env, or config paths |
always | Bypass eligibility checks (boolean) |
install | Installation methods |
Handler implementation
type, action, sessionKey, timestamp, messages (push to send to user), and context (event-specific data). Agent and tool plugin hook contexts can also include trace, a read-only W3C-compatible diagnostic trace context that plugins may pass into structured logs for OTEL correlation.
Event context highlights
Command events (command:new, command:reset): context.sessionEntry, context.previousSessionEntry, context.commandSource, context.workspaceDir, context.cfg.
Message events (message:received): context.from, context.content, context.channelId, context.metadata (provider-specific data including senderId, senderName, guildId).
Message events (message:sent): context.to, context.content, context.success, context.channelId.
Message events (message:transcribed): context.transcript, context.from, context.channelId, context.mediaPath.
Message events (message:preprocessed): context.bodyForAgent (final enriched body), context.from, context.channelId.
Bootstrap events (agent:bootstrap): context.bootstrapFiles (mutable array), context.agentId.
Session patch events (session:patch): context.sessionEntry, context.patch (only changed fields), context.cfg. Only privileged clients can trigger patch events.
Compaction events: session:compact:before includes messageCount, tokenCount. session:compact:after adds compactedCount, summaryLength, tokensBefore, tokensAfter.
command:stop observes the user issuing /stop; it is cancellation/command
lifecycle, not an agent-finalization gate. Plugins that need to inspect a
natural final answer and ask the agent for one more pass should use the typed
plugin hook before_agent_finalize instead. See Plugin hooks.
Gateway lifecycle events: gateway:shutdown includes reason and restartExpectedMs and fires when gateway shutdown begins. gateway:pre-restart includes the same context but only fires when shutdown is part of an expected restart and a finite restartExpectedMs value is supplied. During shutdown, each lifecycle hook wait is best-effort and bounded so shutdown continues if a handler stalls.
Hook discovery
Hooks are discovered from these directories, in order of increasing override precedence:- Bundled hooks: shipped with OpenClaw
- Plugin hooks: hooks bundled inside installed plugins
- Managed hooks:
~/.openclaw/hooks/(user-installed, shared across workspaces). Extra directories fromhooks.internal.load.extraDirsshare this precedence. - Workspace hooks:
<workspace>/hooks/(per-agent, disabled by default until explicitly enabled)
openclaw hooks enable <name>, install a hook pack, or set hooks.internal.enabled=true to opt in. When you enable one named hook, the Gateway loads only that hook’s handler; hooks.internal.enabled=true, extra hook directories, and legacy handlers opt into broad discovery.
Hook packs
Hook packs are npm packages that export hooks viaopenclaw.hooks in package.json. Install with:
Bundled hooks
| Hook | Events | What it does |
|---|---|---|
| session-memory | command:new, command:reset | Saves session context to <workspace>/memory/ |
| bootstrap-extra-files | agent:bootstrap | Injects additional bootstrap files from glob patterns |
| command-logger | command | Logs all commands to ~/.openclaw/logs/commands.log |
| boot-md | gateway:startup | Runs BOOT.md when the gateway starts |
session-memory details
Extracts the last 15 user/assistant messages, generates a descriptive filename slug via LLM, and saves to<workspace>/memory/YYYY-MM-DD-slug.md using the host local date. Requires workspace.dir to be configured.
bootstrap-extra-files config
AGENTS.md, SOUL.md, TOOLS.md, IDENTITY.md, USER.md, HEARTBEAT.md, BOOTSTRAP.md, MEMORY.md).
command-logger details
Logs every slash command to~/.openclaw/logs/commands.log.
boot-md details
RunsBOOT.md from the active workspace when the gateway starts.
Plugin hooks
Plugins can register typed hooks through the Plugin SDK for deeper integration: intercepting tool calls, modifying prompts, controlling message flow, and more. Use plugin hooks when you needbefore_tool_call, before_agent_reply,
before_install, or other in-process lifecycle hooks.
For the complete plugin hook reference, see Plugin hooks.
Configuration
The legacy
hooks.internal.handlers array config format is still supported for backwards compatibility, but new hooks should use the discovery-based system.CLI reference
Best practices
- Keep handlers fast. Hooks run during command processing. Fire-and-forget heavy work with
void processInBackground(event). - Handle errors gracefully. Wrap risky operations in try/catch; do not throw so other handlers can run.
- Filter events early. Return immediately if the event type/action is not relevant.
- Use specific event keys. Prefer
"events": ["command:new"]over"events": ["command"]to reduce overhead.
Troubleshooting
Hook not discovered
Hook not eligible
Hook not executing
- Verify the hook is enabled:
openclaw hooks list - Restart your gateway process so hooks reload.
- Check gateway logs:
./scripts/clawlog.sh | grep hook
Related
- CLI Reference: hooks
- Webhooks
- Plugin hooks — in-process plugin lifecycle hooks
- Configuration