Includes: CLAUDE.md, settings.json, agents, commands, rules, skills, hooks, contexts, evals, get-shit-done, plugin configs (installed list and marketplace sources). Excludes credentials, runtime caches, telemetry, session data, and plugin binary cache.
17 KiB
name, description
| name | description |
|---|---|
| openclaw | Operate OpenClaw - self-hosted AI gateway connecting chat apps to AI agents. Manage gateway, agents, channels, skills, plugins, sessions, hooks, webhooks, cron jobs, and configuration. |
OpenClaw Operations
Overview
OpenClaw is a self-hosted gateway connecting messaging platforms (WhatsApp, Telegram, Discord, Slack, Signal, iMessage, MS Teams, etc.) to AI coding agents. It runs on Node.js 22+ and uses a WebSocket-based control plane.
- Config:
~/.openclaw/openclaw.json(JSON5 format, hot-reloads) - Default port:
18789 - Local repo:
C:\Users\yaoji\git\OpenSource\openclaw - Docs: https://docs.openclaw.ai/
Gateway Management
Start / Stop / Status
# Run gateway foreground
openclaw gateway
openclaw gateway run
# With options
openclaw gateway --port 18789 --bind loopback --verbose
openclaw gateway --dev # dev mode, creates config if missing
openclaw gateway --allow-unconfigured # skip gateway.mode check
openclaw gateway --force # kill existing listener on port
# Service lifecycle
openclaw gateway install [--port 18789] [--token TOKEN] [--force]
openclaw gateway start
openclaw gateway stop
openclaw gateway restart
openclaw gateway uninstall
# Status and diagnostics
openclaw gateway status [--json] [--deep] [--no-probe]
openclaw gateway health --url ws://127.0.0.1:18789
openclaw gateway probe [--json]
# Discovery (Bonjour/mDNS)
openclaw gateway discover [--timeout 4000] [--json]
# Low-level RPC
openclaw gateway call <method> [--params '{"key":"value"}']
openclaw gateway call status
openclaw gateway call logs.tail --params '{"sinceMs": 60000}'
Gateway Config Keys
openclaw config set gateway.port 19001 --strict-json
openclaw config set gateway.bind "loopback"
openclaw config set gateway.auth.mode "token"
openclaw config set gateway.auth.token "my-secret"
openclaw config set gateway.http.endpoints.chatCompletions.enabled true --strict-json
Configuration
Config file: ~/.openclaw/openclaw.json
# Print config file path
openclaw config file
# Read values (dot/bracket notation)
openclaw config get agents.defaults.workspace
openclaw config get agents.list[0].id
openclaw config get channels.whatsapp.enabled
# Write values (JSON5 auto-parsed, use --strict-json for explicit)
openclaw config set agents.defaults.workspace "/path/to/workspace"
openclaw config set agents.defaults.heartbeat.every "2h"
openclaw config set channels.whatsapp.groups '["*"]' --strict-json
openclaw config set agents.list[0].tools.exec.node "node-id"
# Remove values
openclaw config unset tools.web.search.apiKey
# Validate
openclaw config validate [--json]
# Interactive wizard
openclaw configure
Config Structure Reference
{
// Identity
identity: { name: "Pi", theme: "space lobster", emoji: "" },
// Agents
agents: {
defaults: {
workspace: "~/.openclaw/workspace",
model: { primary: "anthropic/claude-sonnet-4-20250514", fallbacks: [] },
skills: [], // skill allowlist
sandbox: { mode: "off" }, // "off" | "non-main" | "all"
heartbeat: { every: "1h" },
},
list: [
{
id: "main",
default: true,
workspace: "~/.openclaw/workspace",
model: { primary: "anthropic/claude-sonnet-4-20250514" },
skills: [],
identity: { name: "Pi", emoji: "" },
runtime: { type: "embedded" }, // "embedded" | "acp"
subagents: { allowAgents: [], model: "..." },
}
]
},
// Channels
channels: {
whatsapp: { enabled: true, dmPolicy: "pairing", allowFrom: ["+15555550123"], groups: { "*": { requireMention: true } } },
telegram: { enabled: true, botToken: "...", dmPolicy: "open" },
discord: { enabled: true, token: "..." },
slack: { enabled: true, botToken: "...", signingSecret: "..." },
signal: { enabled: true, phoneNumber: "+1..." },
// imessage, googlechat, msteams, matrix, irc, line, feishu, mattermost, etc.
},
// Session
session: {
scope: "per-peer", // "main" | "per-peer" | "per-channel-peer" | "per-account-channel-peer"
reset: { mode: "idle", idleMinutes: 120 },
maintenance: { mode: "warn", pruneAfter: "30d", maxEntries: 500 },
},
// Skills
skills: {
allowBundled: [],
load: { extraDirs: [], watch: true },
install: { preferBrew: true, nodeManager: "npm" },
entries: {
"web-search": { enabled: true },
"image-gen": { enabled: true, apiKey: "..." },
}
},
// Plugins
plugins: {
enabled: true,
allow: [],
deny: [],
load: { paths: [] },
entries: {
"my-plugin": { enabled: true, config: {} }
}
},
// Tools
tools: {
web: { search: { enabled: true }, fetch: { enabled: true } },
browser: { enabled: true },
canvas: { enabled: true },
media: { audio: { enabled: true } },
},
// Gateway
gateway: {
mode: "local",
bind: "loopback", // "loopback" | "lan" | "tailnet" | "auto"
port: 18789,
auth: { mode: "token", token: "..." },
controlUi: { enabled: true },
http: {
endpoints: {
chatCompletions: { enabled: false },
responses: { enabled: false },
}
},
},
// Hooks (webhooks)
hooks: {
enabled: true,
token: "${OPENCLAW_HOOKS_TOKEN}",
path: "/hooks",
defaultSessionKey: "hook:ingress",
allowRequestSessionKey: false,
allowedAgentIds: ["main"],
// Internal hooks (event-driven)
internal: {
enabled: true,
entries: {
"session-memory": { enabled: true },
"command-logger": { enabled: false },
}
},
// Webhook mappings
mappings: [
{ match: { path: "gmail" }, action: "agent", agentId: "main", deliver: true }
],
},
// Cron
cron: { enabled: true, maxConcurrentRuns: 2 },
// ACP (Agent Control Protocol)
acp: { enabled: false, backend: "acpx", maxConcurrentSessions: 5 },
// Logging
logging: { level: "info", redactSensitive: "tools" },
// Environment
env: { vars: { MY_KEY: "value" } },
}
Agent Management
# List agents
openclaw agents list
# Add agent with workspace
openclaw agents add work --workspace ~/.openclaw/workspace-work
# Delete agent
openclaw agents delete work
# Routing bindings
openclaw agents bindings [--agent work] [--json]
openclaw agents bind --agent work --bind telegram:ops --bind discord:guild-a
openclaw agents unbind --agent work --bind telegram:ops
openclaw agents unbind --agent work --all
# Set agent identity
openclaw agents set-identity --agent main --name "Pi" --emoji ""
openclaw agents set-identity --workspace ~/.openclaw/workspace --from-identity
openclaw agents set-identity --agent main --avatar avatars/openclaw.png
Agent Config Example
{
agents: {
list: [
{
id: "main",
default: true,
workspace: "~/.openclaw/workspace",
identity: { name: "Pi", theme: "space lobster", emoji: "" },
},
{
id: "work",
workspace: "~/.openclaw/workspace-work",
model: { primary: "openai/gpt-5" },
skills: ["web-search", "code-runner"],
}
]
}
}
Bootstrap Files
Place in agent workspace root:
AGENTS.md- Operating instructions + memorySOUL.md- Persona, boundaries, toneTOOLS.md- User tool notesBOOTSTRAP.md- One-time ritual (deleted after first run)IDENTITY.md- Agent name/vibeUSER.md- User profile
Channel Management
# List and status
openclaw channels list
openclaw channels status [--probe]
openclaw channels capabilities [--channel discord --target channel:123]
# Add / remove accounts
openclaw channels add --channel telegram --token <bot-token>
openclaw channels remove --channel telegram [--delete]
# Login/logout (interactive)
openclaw channels login --channel whatsapp
openclaw channels logout --channel whatsapp
# Resolve names to IDs
openclaw channels resolve --channel slack "#general" "@jane"
openclaw channels resolve --channel discord "My Server/#support"
# Tail channel logs
openclaw channels logs --channel all
DM Policies
pairing(default) - Require pairing code approvalallowlist- Only allow specific sendersopen- Allow all DMsdisabled- Block all DMs
Sending Messages
# Send text
openclaw message send --channel telegram --target @mychat --message "Hello"
# Send with media
openclaw message send --channel discord --target channel:123 --message "See this" --media ./image.png
# Reply to message
openclaw message send --channel discord --target channel:123 --message "Reply" --reply-to 456
# Create poll
openclaw message poll --channel discord --target channel:123 \
--poll-question "Lunch?" --poll-option Pizza --poll-option Sushi --poll-multi
# React
openclaw message react --channel slack --target C123 --message-id 456 --emoji "check"
# Read messages
openclaw message read --channel discord --target channel:123 --limit 20
# Edit / delete
openclaw message edit --channel discord --target channel:123 --message-id 789 --message "Updated"
openclaw message delete --channel discord --target channel:123 --message-id 789
# Broadcast to multiple targets
openclaw message broadcast --channel all --targets user1 --targets user2 --message "Announcement"
# Thread operations (Discord)
openclaw message thread create --channel discord --target channel:123 --thread-name "Discussion"
openclaw message thread list --channel discord --guild-id 456
openclaw message thread reply --channel discord --target thread:789 --message "Reply"
Target Formats
| Channel | Format |
|---|---|
E.164 (+15551234567) or group JID |
|
| Telegram | chat id or @username |
| Discord | channel:<id> or user:<id> |
| Slack | channel:<id> or user:<id> |
| Signal | +E.164, group:<id>, username:<name> |
| iMessage | handle, chat_id:<id>, chat_guid:<guid> |
| MS Teams | conversation:<id> or user:<aad-object-id> |
Session Management
# List sessions
openclaw sessions [--agent work] [--all-agents] [--json]
openclaw sessions --active 120 # active in last 120 minutes
# Cleanup
openclaw sessions cleanup --dry-run [--agent work] [--all-agents]
openclaw sessions cleanup --enforce
Session storage: ~/.openclaw/agents/<agentId>/sessions/
Session Scopes
main- Single session per agentper-peer- One session per senderper-channel-peer- One session per sender per channelper-account-channel-peer- Full isolation
Skills Management
Skills extend agent capabilities. Three sources (precedence: workspace > managed > bundled):
- Bundled: shipped with OpenClaw (web-search, browser, canvas, cron, etc.)
- Managed:
~/.openclaw/skills/ - Workspace:
<workspace>/skills/
# List skills
openclaw skills list [--eligible] [--verbose] [--json]
# Info and check
openclaw skills info <name> [--json]
openclaw skills check
SKILL.md Format
---
name: my-skill
description: What this skill does
requires:
bins: [node, git]
env: [MY_API_KEY]
config: [tools.web.search.apiKey]
install:
- kind: node
package: my-skill-package
always: false
skillKey: MY_SKILL
emoji: ""
homepage: https://example.com
---
# My Skill
Instructions and tool definitions for the LLM agent...
Skills Config
{
skills: {
entries: {
"web-search": { enabled: true },
"browser": { enabled: true },
"image-gen": { enabled: true, apiKey: "sk-..." },
}
}
}
Plugins Management
Plugins are in-process gateway extensions with full API access.
# List, info
openclaw plugins list
openclaw plugins info <id>
# Install
openclaw plugins install <path-or-npm-spec> [--pin] [--link]
openclaw plugins install -l ./my-plugin # link local plugin
# Enable / disable
openclaw plugins enable <id>
openclaw plugins disable <id>
# Update
openclaw plugins update <id>
openclaw plugins update --all [--dry-run]
# Uninstall
openclaw plugins uninstall <id> [--keep-files] [--dry-run]
# Diagnostics
openclaw plugins doctor
Plugin Manifest
Every plugin needs openclaw.plugin.json with:
- Plugin metadata
configSchema(JSON Schema, even if empty)
Webhooks (External Triggers)
Enable in config:
{
hooks: {
enabled: true,
token: "shared-secret",
path: "/hooks",
defaultSessionKey: "hook:ingress",
}
}
Endpoints
POST /hooks/wake - Enqueue system event:
curl -X POST http://127.0.0.1:18789/hooks/wake \
-H 'Authorization: Bearer SECRET' \
-H 'Content-Type: application/json' \
-d '{"text":"New email received","mode":"now"}'
POST /hooks/agent - Run isolated agent turn:
curl -X POST http://127.0.0.1:18789/hooks/agent \
-H 'Authorization: Bearer SECRET' \
-H 'Content-Type: application/json' \
-d '{
"message": "Summarize inbox",
"name": "Email",
"agentId": "main",
"deliver": true,
"channel": "telegram",
"to": "123456789",
"model": "anthropic/claude-sonnet-4-20250514",
"timeoutSeconds": 120
}'
POST /hooks/<name> - Custom mapped hooks (via hooks.mappings).
Auth
- Header:
Authorization: Bearer <token>(recommended) - Header:
x-openclaw-token: <token> - Query string tokens are rejected
Internal Hooks (Event-Driven)
Hooks run inside the gateway on agent events.
# List / info / check
openclaw hooks list [--eligible] [--verbose] [--json]
openclaw hooks info <name> [--json]
openclaw hooks check [--json]
# Enable / disable
openclaw hooks enable <name>
openclaw hooks disable <name>
# Install hook packs
openclaw hooks install <path-or-npm-spec>
Bundled Hooks
| Hook | Event | Purpose |
|---|---|---|
| session-memory | command:new | Save session context to memory files |
| bootstrap-extra-files | agent:bootstrap | Inject extra workspace bootstrap files |
| command-logger | command | Audit log all commands to JSONL |
| boot-md | gateway:startup | Run BOOT.md on gateway start |
Creating Custom Hooks
- Create directory:
~/.openclaw/hooks/my-hook/ - Create
HOOK.md:
---
name: my-hook
description: "Does something useful"
metadata: { "openclaw": { "emoji": "", "events": ["command:new"] } }
---
# My Hook
Description here.
- Create
handler.ts:
const handler = async (event) => {
if (event.type !== "command" || event.action !== "new") return;
console.log("[my-hook] Triggered!");
event.messages.push("Hook executed!");
};
export default handler;
- Enable:
openclaw hooks enable my-hook
Event Types
command:new,command:reset,command:stopsession:compact:before,session:compact:afteragent:bootstrapgateway:startupmessage:received,message:sent,message:transcribed,message:preprocessed
Cron Jobs
# Add recurring job
openclaw cron add \
--name "Morning brief" \
--cron "0 7 * * *" \
--session isolated \
--message "Summarize overnight updates." \
--announce --channel telegram --to "123456789"
# Add one-shot job
openclaw cron add --name "Reminder" --at "2026-03-15T10:00:00" --message "Check report"
# Edit job
openclaw cron edit <job-id> --announce --channel slack --to "channel:C1234567890"
openclaw cron edit <job-id> --no-deliver
openclaw cron edit <job-id> --light-context
# Full help
openclaw cron --help
Onboarding & Setup
# Interactive onboarding wizard
openclaw onboard [--install-daemon]
# Setup workspace
openclaw setup
# System diagnostics
openclaw doctor [--fix]
openclaw status [--deep]
openclaw health
# Logs
openclaw logs [--follow]
# Update OpenClaw
openclaw update
OpenAI-Compatible API
When enabled, the gateway exposes:
POST /v1/chat/completions- OpenAI Chat Completions formatPOST /v1/responses- Open response format
Enable:
openclaw config set gateway.http.endpoints.chatCompletions.enabled true --strict-json
openclaw config set gateway.http.endpoints.responses.enabled true --strict-json
Model Providers
25+ supported providers including:
- Anthropic (Claude)
- OpenAI (GPT)
- Ollama (local)
- OpenRouter
- AWS Bedrock
- Mistral, Qwen, vLLM, Deepgram, etc.
# Discover models
openclaw models [list]
Common Workflows
Initial Setup
npm install -g openclaw@latest
openclaw onboard --install-daemon
openclaw channels login
openclaw gateway
Add New Channel
openclaw channels add --channel telegram --token BOT_TOKEN
openclaw agents bind --agent main --bind telegram
openclaw gateway restart
Multi-Agent Setup
openclaw agents add work --workspace ~/.openclaw/workspace-work
openclaw agents bind --agent work --bind telegram:ops
openclaw agents bind --agent main --bind whatsapp
Trigger Agent via API
curl -X POST http://127.0.0.1:18789/hooks/agent \
-H 'Authorization: Bearer TOKEN' \
-H 'Content-Type: application/json' \
-d '{"message":"Analyze this data","deliver":false}'
Enable Skill
openclaw config set skills.entries.web-search.enabled true --strict-json
openclaw gateway restart
Troubleshooting
openclaw doctor [--fix] # Guided diagnostics and repairs
openclaw status --deep # Full system status audit
openclaw channels status --probe # Channel connectivity check
openclaw config validate # Config schema validation
openclaw gateway probe # Debug gateway connectivity
openclaw logs --follow # Tail gateway logs