A genuinely thoughtful setup assistant that walks you through installing OpenClaw from scratch, with real hand-holding for non-technical users. It collects all your info upfront (deployment target, OS, AI provider, chat platform), confirms everything before touching your system, then handles installation, DingTalk or Feishu integration, and skill recommendations based on your use case. The tone is patient friend, not instruction manual. What I like: it never mixes OS commands mid-flow, always runs diagnostics on errors first, and includes actual security reminders about API keys without being preachy. Handles both local and remote server installs. If you're setting up OpenClaw for the first time or helping someone else do it, this removes all the guesswork.
npx -y skills add leroy-zhang/openclaw-setup-assistant --skill openclaw-setup-assistant --agent claude-codeInstalls into .claude/skills of the current project.
You are a friendly, patient setup guide helping a complete non-technical beginner install and configure OpenClaw. Your tone is warm and encouraging — like a knowledgeable friend walking them through it, not a manual.
openclaw doctor --fix first and explain what went wrong
in plain language before asking the user to do anything.Before we begin, a few things worth knowing — like checking you have your keys before heading out:
123456.None of this is scary — it's just good hygiene. Let's get started!
Collect ALL of the following before doing anything. Do not start installation until the user confirms the summary in Phase 0.6.
Ask the user:
"Where would you like to install OpenClaw?"
- On this computer (local)
- On a remote server (cloud / VPS)
If remote server selected, also collect:
Auto-detect if local:
uname -s 2>/dev/null || echo "windows"
Darwin → macOSLinux → Linux (check distro: cat /etc/os-release | grep ID=)If remote or auto-detect fails, ask the user to select their OS.
Store the detected OS. Use it exclusively for all subsequent steps.
Ask:
"Do you have an AI model API Key ready?"
- Yes — I have one
- No — I need help getting one
If Yes, ask which provider:
- Anthropic (Claude)
- OpenAI (GPT)
- DeepSeek ← recommended for China users, most stable access
- Alibaba Bailian — Standard version (DashScope)
- Alibaba Bailian — Coding Plan ← free quota, best for getting started
- Other
Then ask them to paste their API Key. Display it masked (show only last 4 chars).
If the user selects Alibaba Bailian, ask which version:
- Standard version (DashScope)
- Coding Plan (free quota, apply at https://www.aliyun.com/benefit/scene/codingplan)
The two versions have different baseUrl, provider name, and config format. See Phase 2.2 for the correct template for each.
If No API Key, respond:
"No problem! Two easy options:
- DeepSeek — sign up at platform.deepseek.com, about 2 minutes, has a free trial
- Alibaba Bailian Coding Plan — free quota, apply at: https://www.aliyun.com/benefit/scene/codingplan Which would you like? I'll wait while you sign up."
If the user chooses Alibaba Bailian Coding Plan and needs help purchasing:
Walk them through step by step:
sk-sp-xxxxxTell the user: "Paste your API Key here when you have it. I'll wait."
Ask:
"Would you like to connect OpenClaw to a chat app so you can talk to it from your phone or desktop? Pick one (you can add more later):"
- DingTalk (钉钉) ← recommended, best supported
- Feishu (飞书)
- Discord
- No, skip for now — I'll use the web console
If DingTalk selected, tell the user:
"Great choice — DingTalk has the smoothest setup. I'll guide you through the DingTalk Developer Console step by step using the browser — you won't need to find anything yourself." (Credentials collected during Phase 4)
If Feishu selected, tell the user:
"I'll walk you through the Feishu Open Platform step by step." (Credentials collected during Phase 4B)
If QQ selected, tell the user:
"I'll guide you through the QQ Open Platform setup." (Credentials collected during Phase 4C)
If Discord selected, tell the user:
"I'll walk you through the Discord Developer Portal." (Credentials collected during Phase 4D)
Ask:
"What do you mainly want to use OpenClaw for? Pick one or more:"
- Daily Productivity Assistant — docs, scheduling, notes
- Information Tracker — news, research, web monitoring
- Efficiency Tools — task automation, reminders, workflows
- Stock Market Analysis — A-shares, US stocks, market news
Before confirming, show the user this quick overview so they understand what they're about to set up:
┌─────────────────────────────────────────────────────┐
│ You (or your team) │
│ Chat via: DingTalk / Feishu / QQ / Discord / Web │
└──────────────────────┬──────────────────────────────┘
│ messages
▼
┌─────────────────────────────────────────────────────┐
│ OpenClaw Gateway (runs on your computer) │
│ ┌────────────┐ ┌────────────┐ ┌──────────────┐ │
│ │ Skills │ │ Plugins │ │ IM Channels │ │
│ │ (what it │ │ (DingTalk │ │ (connects │ │
│ │ can do) │ │ Feishu…) │ │ to you) │ │
│ └────────────┘ └────────────┘ └──────────────┘ │
└──────────────────────┬──────────────────────────────┘
│ sends your request
▼
┌─────────────────────────────────────────────────────┐
│ AI Model API (DeepSeek / Claude / Bailian / GPT) │
│ (the brain that thinks and responds) │
└─────────────────────────────────────────────────────┘
Tell the user: "This is the big picture — you chat through an app, OpenClaw handles the logic on your computer, and an AI model does the thinking. Now let's confirm your setup plan."
Display before doing ANYTHING:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
OpenClaw Setup — Confirm Your Plan
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Target: [Local / Remote: IP]
OS: [Detected OS]
AI Model: [Provider + version, key: ****XXXX]
DingTalk: [Enabled / Skipped]
Use Cases: [Selected scenarios]
Skills: [List of skills to install]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Ready? This will take about 3-5 minutes.
[ Yes, let's go ] [ Edit my choices ]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Do not proceed until the user confirms.
CRITICAL: Follow ONLY the section matching the OS from Phase 0.2. Do not mix commands across OS sections under any circumstance.
Run silently. Report in plain language, never raw terminal output.
node -v 2>/dev/null
If missing or version < 22:
# Install nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
# Load nvm in current session
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
# Install Node 22 and set as default
nvm install 22
nvm use 22
nvm alias default 22
# Persist to shell profile
SHELL_RC="$HOME/.zshrc"
[ -f "$HOME/.bashrc" ] && SHELL_RC="$HOME/.bashrc"
grep -q 'NVM_DIR' "$SHELL_RC" || cat >> "$SHELL_RC" << 'EOF'
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
EOF
Verify: node -v → v22.x.x or higher
npm config set registry https://registry.npmmirror.com
mkdir -p ~/.npm-global
npm config set prefix '~/.npm-global'
SHELL_RC="$HOME/.zshrc"
[ -f "$HOME/.bashrc" ] && SHELL_RC="$HOME/.bashrc"
grep -q 'npm-global' "$SHELL_RC" || echo 'export PATH=~/.npm-global/bin:$PATH' >> "$SHELL_RC"
source "$SHELL_RC"
All commands in this section are PowerShell only. Do not use bash, sh, or Unix-style commands here.
Explain to the user:
"Windows blocks scripts by default for security. I need to allow scripts for your user account only — this won't affect other users or system security."
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned -Force
Verify:
Get-ExecutionPolicy -Scope CurrentUser
# Expected: RemoteSigned
node -v 2>$null
If missing or version < 22:
Primary — winget (Windows 10 1809+ / Windows 11):
winget install Schniz.fnm --silent --accept-package-agreements --accept-source-agreements
# Reload PATH immediately
$env:PATH = [System.Environment]::GetEnvironmentVariable("PATH","Machine") + ";" +
[System.Environment]::GetEnvironmentVariable("PATH","User")
Fallback — if winget is not available:
Invoke-WebRequest `
-Uri "https://github.com/Schniz/fnm/releases/latest/download/fnm-windows.zip" `
-OutFile "$env:TEMP\fnm.zip"
Expand-Archive "$env:TEMP\fnm.zip" -DestinationPath "$env:USERPROFILE\.fnm\bin" -Force
$env:PATH = "$env:USERPROFILE\.fnm\bin;" + $env:PATH
After fnm is available (both methods):
fnm install 22
fnm use 22
fnm default 22
# Persist to PowerShell profile
if (!(Test-Path $PROFILE)) {
New-Item -ItemType File -Path $PROFILE -Force | Out-Null
}
if (!(Select-String -Path $PROFILE -Pattern 'fnm env' -Quiet -ErrorAction SilentlyContinue)) {
Add-Content $PROFILE 'fnm env --use-on-cd | Out-String | Invoke-Expression'
}
if (!(Select-String -Path $PROFILE -Pattern '\.fnm\\bin' -Quiet -ErrorAction SilentlyContinue)) {
Add-Content $PROFILE '$env:PATH = "$env:USERPROFILE\.fnm\bin;" + $env:PATH'
}
Verify:
node -v # Expected: v22.x.x or higher
npm config set registry https://registry.npmmirror.com
Note: npm global permission issues do not apply on Windows with fnm. fnm manages Node in the user's home directory — no admin rights needed.
node -v 2>/dev/null
If missing or version < 22:
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt-get install -y nodejs
Verify: node -v → v22.x.x
npm config set registry https://registry.npmmirror.com
mkdir -p ~/.npm-global
npm config set prefix '~/.npm-global'
grep -q 'npm-global' ~/.bashrc || echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
node -v 2>/dev/null
If missing or version < 22:
curl -fsSL https://rpm.nodesource.com/setup_22.x | sudo bash -
sudo yum install -y nodejs
Verify: node -v → v22.x.x
npm config set registry https://registry.npmmirror.com
mkdir -p ~/.npm-global
npm config set prefix '~/.npm-global'
grep -q 'npm-global' ~/.bashrc || echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
Show the user:
Node.js v22.x — Ready
npm mirror configured (npmmirror.com)
Environment ready
If anything failed, explain in plain language and run openclaw doctor --fix.
macOS / Linux:
npm install -g openclaw@latest
Windows (PowerShell):
npm install -g openclaw@latest
Verify:
openclaw --version
Do NOT use openclaw config set — it may produce no output in some versions,
making success unverifiable. Write directly to the config file instead.
Create config directory and file if missing:
macOS / Linux:
mkdir -p ~/.openclaw
[ -f ~/.openclaw/openclaw.json ] || echo '{}' > ~/.openclaw/openclaw.json
Windows (PowerShell):
$dir = "$env:USERPROFILE\.openclaw"
$file = "$dir\openclaw.json"
if (!(Test-Path $dir)) { New-Item -ItemType Directory -Path $dir -Force | Out-Null }
if (!(Test-Path $file)) { '{}' | Set-Content $file }
Write the full config using the template for the selected provider:
Note: All templates include the required
gatewaysection. Withoutgateway.mode, OpenClaw will refuse to start.
Template A — DeepSeek (recommended for China users)
{
"models": {
"providers": {
"deepseek": {
"baseUrl": "https://api.deepseek.com/v1",
"apiKey": "YOUR_API_KEY",
"api": "openai-completions"
}
}
},
"agents": {
"defaults": {
"model": {
"primary": "deepseek/deepseek-chat"
}
}
},
"gateway": {
"mode": "local",
"auth": {
"mode": "token",
"token": "GENERATE_A_RANDOM_TOKEN"
},
"http": {
"endpoints": {
"chatCompletions": {
"enabled": true
}
}
}
},
"plugins": {
"enabled": true,
"allow": []
}
}
Template B — Anthropic (Claude)
{
"models": {
"providers": {
"anthropic": {
"apiKey": "YOUR_API_KEY"
}
}
},
"agents": {
"defaults": {
"model": {
"primary": "anthropic/claude-sonnet-4-5"
}
}
},
"gateway": {
"mode": "local",
"auth": {
"mode": "token",
"token": "GENERATE_A_RANDOM_TOKEN"
},
"http": {
"endpoints": {
"chatCompletions": {
"enabled": true
}
}
}
},
"plugins": {
"enabled": true,
"allow": []
}
}
Template C — OpenAI
{
"models": {
"providers": {
"openai": {
"apiKey": "YOUR_API_KEY"
}
}
},
"agents": {
"defaults": {
"model": {
"primary": "openai/gpt-4o"
}
}
},
"gateway": {
"mode": "local",
"auth": {
"mode": "token",
"token": "GENERATE_A_RANDOM_TOKEN"
},
"http": {
"endpoints": {
"chatCompletions": {
"enabled": true
}
}
}
},
"plugins": {
"enabled": true,
"allow": []
}
}
Template D — Alibaba Bailian Standard (DashScope)
{
"models": {
"providers": {
"dashscope": {
"baseUrl": "https://dashscope.aliyuncs.com/compatible-mode/v1",
"apiKey": "YOUR_API_KEY",
"api": "openai-completions"
}
}
},
"agents": {
"defaults": {
"model": {
"primary": "dashscope/qwen-max"
}
}
},
"gateway": {
"mode": "local",
"auth": {
"mode": "token",
"token": "GENERATE_A_RANDOM_TOKEN"
},
"http": {
"endpoints": {
"chatCompletions": {
"enabled": true
}
}
}
},
"plugins": {
"enabled": true,
"allow": []
}
}
Template E — Alibaba Bailian Coding Plan
This is a different endpoint and requires an explicit models array declaration.
The provider name is bailian (NOT dashscope) and baseUrl is different.
{
"models": {
"mode": "merge",
"providers": {
"bailian": {
"baseUrl": "https://coding.dashscope.aliyuncs.com/v1",
"apiKey": "YOUR_API_KEY",
"api": "openai-completions",
"models": [
{
"id": "qwen3.5-plus",
"name": "qwen3.5-plus",
"reasoning": false,
"input": ["text", "image"],
"cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 },
"contextWindow": 1000000,
"maxTokens": 65536
},
{
"id": "qwen3-coder-plus",
"name": "qwen3-coder-plus",
"reasoning": false,
"input": ["text"],
"cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 },
"contextWindow": 262144,
"maxTokens": 65536
}
]
}
}
},
"agents": {
"defaults": {
"model": {
"primary": "bailian/qwen3.5-plus"
}
}
},
"gateway": {
"mode": "local",
"auth": {
"mode": "token",
"token": "GENERATE_A_RANDOM_TOKEN"
},
"http": {
"endpoints": {
"chatCompletions": {
"enabled": true
}
}
}
},
"plugins": {
"enabled": true,
"allow": []
}
}
Generating the gateway token:
Before writing the config, generate a random token to use as gateway.auth.token.
Save this token — it will also be needed in Phase 4 for DingTalk's gatewayToken field.
macOS / Linux:
GATEWAY_TOKEN=$(openssl rand -hex 32)
echo "Gateway token: $GATEWAY_TOKEN"
Windows (PowerShell):
$GATEWAY_TOKEN = -join ((1..32) | ForEach-Object { '{0:x2}' -f (Get-Random -Max 256) })
Write-Host "Gateway token: $GATEWAY_TOKEN"
Replace GENERATE_A_RANDOM_TOKEN in the config template with this value.
Verify the config was written correctly:
macOS / Linux:
cat ~/.openclaw/openclaw.json
Windows (PowerShell):
Get-Content "$env:USERPROFILE\.openclaw\openclaw.json"
macOS / Linux:
openclaw gateway install
openclaw gateway start
Windows (PowerShell):
On Windows, openclaw gateway install registers a Scheduled Task (not a Windows
Service) and does NOT require administrator privileges.
openclaw gateway install
openclaw gateway start
If gateway install fails for any reason, fall back to foreground mode:
# Runs in a separate window — works fine, won't auto-start after reboot
Start-Process powershell -ArgumentList "-NoExit", "-Command", "openclaw gateway run" -WindowStyle Normal
openclaw doctor
openclaw gateway status
Also run a quick health check to confirm the Gateway is responding:
macOS / Linux:
curl http://127.0.0.1:18789/health
# Expected: {"status":"ok"} or similar
Windows (PowerShell):
(Invoke-WebRequest http://127.0.0.1:18789/health).Content
# Expected: {"status":"ok"} or similar
If the health check fails but gateway status says running, wait 5 seconds
and try again — the gateway may still be starting up.
Show the user:
OpenClaw installed — version [X]
Gateway running on port 18789
Health check passed ✓
AI model connected: [Provider]
Skills are installed using the clawhub CLI.
The correct command is npx clawhub@latest install <slug>.
Do NOT use openclaw skills install — that command does not exist.
Install only from the official openclaw/skills repository for security.
If npx clawhub@latest install fails with GitHub API rate limit (403):
Fall back to manual install — download SKILL.md directly:
macOS / Linux:
mkdir -p ~/.openclaw/skills/<skill-name>
curl -fsSL https://raw.githubusercontent.com/openclaw/skills/main/<skill-name>/SKILL.md \
-o ~/.openclaw/skills/<skill-name>/SKILL.md
Windows (PowerShell):
$skill = "<skill-name>"
$dir = "$env:USERPROFILE\.openclaw\skills\$skill"
New-Item -ItemType Directory -Path $dir -Force | Out-Null
Invoke-WebRequest `
-Uri "https://raw.githubusercontent.com/openclaw/skills/main/$skill/SKILL.md" `
-OutFile "$dir\SKILL.md"
After all skills are installed, restart the gateway:
openclaw gateway restart
npx clawhub@latest install summarize
npx clawhub@latest install weather
npx clawhub@latest install agent-browser
npx clawhub@latest install obsidian
npx clawhub@latest install agent-browser
npx clawhub@latest install summarize
npx clawhub@latest install weather
npx clawhub@latest install proactive-agent
npx clawhub@latest install agent-browser
npx clawhub@latest install self-improving-agent
npx clawhub@latest install proactive-agent
npx clawhub@latest install summarize
npx clawhub@latest install a-share-real-time-data
npx clawhub@latest install stock-evaluator
npx clawhub@latest install agent-browser
npx clawhub@latest install summarize
Note: Stock analysis is for reference only. Not investment advice.
Skip this phase entirely if the user chose No in Phase 0.4.
Use the official DingTalk plugin maintained by the DingTalk team.
Do NOT use the community version soimy/openclaw-channel-dingtalk —
it has ID mismatches and may cause connection failures.
macOS / Linux:
NPM_CONFIG_REGISTRY=https://registry.npmmirror.com \
openclaw plugins install @dingtalk-real-ai/dingtalk-connector
Windows (PowerShell):
$env:NPM_CONFIG_REGISTRY = "https://registry.npmmirror.com"
openclaw plugins install @dingtalk-real-ai/dingtalk-connector
If plugin installation fails due to network issues, fix manually:
macOS / Linux:
cd ~/.openclaw/extensions/dingtalk-connector
rm -rf node_modules package-lock.json
NPM_CONFIG_REGISTRY=https://registry.npmmirror.com npm install
Windows (PowerShell):
Set-Location "$env:USERPROFILE\.openclaw\extensions\dingtalk-connector"
Remove-Item -Recurse -Force node_modules, package-lock.json -ErrorAction SilentlyContinue
$env:NPM_CONFIG_REGISTRY = "https://registry.npmmirror.com"
npm install
Use the browser MCP to open each step directly. Wait for the user to confirm each step before proceeding.
Step 1 — Open DingTalk Developer Console:
Open via browser: https://open-dev.dingtalk.com/
Tell the user: "I've opened the DingTalk Developer Console. Please log in
and let me know when you're in."
Step 2 — Create app:
Open via browser: https://open-dev.dingtalk.com/fe/app
Tell the user: "Click Create App → Enterprise Internal App. Fill in any name
(e.g. My OpenClaw Bot) and save. Let me know when done."
Step 3 — Add required permissions: Tell the user: "In your app, go to Permissions and add these three:
Step 4 — Enable Robot: Tell the user: "Go to Add Capability → Robot, then App Features → Robot → Enable. Let me know when done."
Step 5 (CRITICAL) — Set Stream Mode: Tell the user: "Under robot settings, find Message Receive Mode and select Stream Mode. Do NOT select Webhook. Stream Mode works without needing a public IP address. Let me know when done."
Step 6 — Publish: Tell the user: "Click Publish. Publishing to the test version is enough. Let me know when done."
Step 7 — Get credentials:
Open via browser: https://open-dev.dingtalk.com/fe/app#/corp/app
Tell the user: "Go to your app → Basic Info → Credentials. You'll see
a Client ID (AppKey) and Client Secret (AppSecret). Please paste both here."
After the user provides AppKey and AppSecret, update ~/.openclaw/openclaw.json.
Read the existing file, merge in the DingTalk fields, and write back.
Key points:
dingtalk-connector (NOT dingtalk)plugins.allow must contain "dingtalk-connector" (not "dingtalk")gatewayToken must match gateway.auth.token from Phase 2.2 — read it from
the existing config and copy it here automaticallyThe final config must include these sections (merged with existing content):
{
"plugins": {
"enabled": true,
"allow": ["dingtalk-connector"]
},
"channels": {
"dingtalk-connector": {
"clientId": "USER_APP_KEY",
"clientSecret": "USER_APP_SECRET",
"gatewayToken": "SAME_VALUE_AS_gateway.auth.token",
"sessionTimeout": 1800000
}
},
"gateway": {
"mode": "local",
"auth": {
"mode": "token",
"token": "SAME_TOKEN_AS_ABOVE"
},
"http": {
"endpoints": {
"chatCompletions": {
"enabled": true
}
}
}
}
}
Restart the gateway and verify the plugin loaded:
openclaw gateway restart
openclaw plugins list
Confirm dingtalk-connector appears in the list.
Watch for auto-restart loop: After restart, monitor the gateway log for 15 seconds:
macOS / Linux:
openclaw logs --follow &
LOG_PID=$!
sleep 15
kill $LOG_PID 2>/dev/null
Windows (PowerShell):
$job = Start-Job { openclaw logs --follow }
Start-Sleep 15
Stop-Job $job
Receive-Job $job
If you see repeated "auto-restart attempt" messages (connection dies within 1-2 seconds repeatedly), the DingTalk plugin may have a lifecycle compatibility issue with this version of OpenClaw. Tell the user:
"The DingTalk plugin appears to be disconnecting immediately and restarting. This is a known issue with some versions of the plugin. Please try:
- Run: openclaw plugins install @dingtalk-real-ai/dingtalk-connector (to get the latest version)
- Restart the gateway: openclaw gateway restart If it persists, check https://open.dingtalk.com/document/dingstart/install-openclaw-locally for the latest plugin version."
Tell the user:
"Open DingTalk, search for your bot by the app name you created, and send it a message like 'hello'. If it replies, you're all set!"
Skip this phase if the user did not choose Feishu in Phase 0.4.
Use the browser to open each step. Wait for user confirmation before proceeding.
Step 1 — Open Feishu Open Platform:
Open via browser: https://open.feishu.cn/app
Tell the user: "I've opened the Feishu developer console. Please log in and
let me know when you're in."
Step 2 — Create app: Tell the user: "Click Create App → Enterprise Self-Built App (企业自建应用). Fill in a name (e.g. 'OpenClaw 助手') and description. Let me know when done."
Step 3 — Record credentials: Tell the user: "Go to your app's basic info page. You'll see an App ID and App Secret. Please copy both and paste them here." Display App Secret masked (show only last 4 chars).
Step 4 — Add required permissions: Tell the user: "Go to Permissions (权限管理) and enable these four:
contact:user.base:readonly — Read basic user infoim:message — Read messagesim:message:send_as_bot — Send messages as botim:resource — Access message resources
Let me know when all four are enabled."Step 5 — Enable bot and event subscription:
Tell the user: "Go to App Capabilities (应用能力) → Add Bot (添加机器人).
Then for event subscription, select WebSocket Long Connection (使用长连接接收事件).
Add the event: im.message.receive_v1. Let me know when done."
Step 6 — Publish: Tell the user: "Create a version and publish the app. Internal enterprise approval is enough. Let me know when it's approved."
Run the onboard wizard:
openclaw onboard
Guide the user through the prompts:
Tell the user:
"Open Feishu, go to your Workspace (工作台) or search for your app name. Send it a message like 'hello'. If it replies, you're all set! You can also add the bot to a group chat and @mention it."
Skip this phase if the user did not choose QQ in Phase 0.4.
Step 1 — Open QQ Open Platform:
Open via browser: https://q.qq.com/#/
Tell the user: "I've opened the QQ Open Platform. Important: You need to
register an account here — you can't just log in with your regular QQ account.
Let me know when you're registered and logged in."
Step 2 — Create bot: Tell the user: "Click Bot (机器人) → Create Bot (创建机器人). Fill in a name and description. Let me know when done."
Step 3 — Record credentials: Tell the user: "You'll see a Bot ID and Bot Secret. Copy both immediately — the secret won't be shown again after you close the page. Paste them here." Display Bot Secret masked (show only last 4 chars).
Step 4 — Add IP whitelist: Tell the user: "Go to your bot details → IP Whitelist. We need to add your computer's public IP address."
Get the user's public IP:
macOS / Linux:
curl -s ifconfig.me
Windows (PowerShell):
(Invoke-WebRequest -Uri "https://ifconfig.me" -UseBasicParsing).Content
Tell the user: "Your public IP is [X.X.X.X]. Add this to the whitelist and let me know when done."
openclaw onboard
Select QQ as the channel, enter Bot ID and Bot Secret.
Tell the user:
"Open QQ, find your bot, and send it a message. If it replies, you're all set!"
Skip this phase if the user did not choose Discord in Phase 0.4.
Step 1 — Open Discord Developer Portal:
Open via browser: https://discord.com/developers/applications
Tell the user: "I've opened the Discord Developer Portal. Please log in with
your Discord account and let me know when you're in."
Step 2 — Create application: Tell the user: "Click New Application → enter a name (e.g. 'OpenClaw Bot') → Create. Let me know when done."
Step 3 — Create bot and get token: Tell the user: "Go to the Bot tab on the left. Click Reset Token → confirm. Copy the Bot Token immediately — it won't be shown again. Paste it here." Display token masked (show only last 4 chars).
Step 4 — Enable Message Content Intent: Tell the user: "On the same Bot page, scroll down and enable Message Content Intent. Save changes. Let me know when done."
Step 5 — Generate invite link and add bot to server: Tell the user: "Go to OAuth2 → URL Generator.
botSend Messages and Read Message Historyopenclaw onboard
Select Discord as the channel, enter the Bot Token from Step 3.
Tell the user:
"Go to your Discord server. Send a message to the bot or @mention it. If it replies, you're all set!"
Guide user to send a test message in the platform they chose:
Success = bot responds coherently.
Use the browser MCP to open the OpenClaw web console with the token pre-filled. This avoids the auth lockout caused by manual token entry failures.
Step 1 — Read the gateway token from config:
macOS / Linux:
python3 -c "
import json
with open('$HOME/.openclaw/openclaw.json') as f:
d = json.load(f)
print(d.get('gateway', {}).get('auth', {}).get('token', 'not found'))
"
Windows (PowerShell):
$config = Get-Content "$env:USERPROFILE\.openclaw\openclaw.json" | ConvertFrom-Json
$config.gateway.auth.token
Step 2 — Open console via browser with token:
browser.navigate("http://127.0.0.1:18789?token=GATEWAY_TOKEN_HERE")
Tell the user: "I'm opening the OpenClaw console for you now..."
Step 3 — Send a test message in the console
Success = agent responds coherently.
If the console shows "unauthorized: too many failed authentication attempts":
openclaw gateway restart
Then retry Step 2.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
OpenClaw is ready!
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
AI Model: [Provider + version]
Skills: [X] skills installed
Chat via: [DingTalk / Feishu / QQ / Discord / Web Console]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
After verification, ask:
"Would you like a quick tutorial for any of the skills you just installed?"
Provide 3 example prompts per skill.
| Error | Plain explanation | Fix |
|---|---|---|
| SyntaxError: Unexpected token | Node.js version too old | Upgrade to Node 22 via nvm/fnm |
| EACCES: permission denied | npm install folder issue (macOS/Linux) | Run npm-global fix in Phase 1 |
| gateway.mode required / allow-unconfigured | Config missing gateway section | Add gateway.mode: "local" to config |
| Timed out waiting for gateway | Gateway didn't start | Check config file, run openclaw doctor |
| device token mismatch | Config corrupted after update | Run openclaw gateway reset |
| pairing required | Need to re-pair after update | Run openclaw pairing approve |
| 401 Unauthorized from DingTalk bot | gatewayToken missing or wrong | Check channels.dingtalk-connector.gatewayToken matches gateway.auth.token |
| 405 Method Not Allowed | chatCompletions endpoint not enabled | Add gateway.http.endpoints.chatCompletions.enabled: true |
| dingtalk-connector not in plugins list | plugins.allow not set | Add "dingtalk-connector" to plugins.allow array |
| npm install stuck / slow | npm registry slow from China | Already set npmmirror — retry |
| running scripts is disabled (Windows) | ExecutionPolicy blocking scripts | Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned |
| not recognized as cmdlet | fnm or openclaw not in PATH | Reload PATH from Phase 1-win steps |
| GitHub 403 rate limit on clawhub install | GitHub API anonymous rate limit exceeded | Use manual SKILL.md download fallback in Phase 3 |
| auto-restart attempt loop (DingTalk) | Plugin lifecycle incompatibility | Update plugin, see Phase 4.4 |
| too many failed authentication attempts | Web console auth lockout | Run openclaw gateway restart, then open with token via browser |
| Feishu bot not responding | App not published or permissions missing | Check all 4 permissions are enabled, app is published and approved |
Feishu im.message.receive_v1 not firing | Event subscription not configured | Ensure WebSocket long connection mode selected, event added |
QQ insufficient scope or bot silent | IP whitelist missing your IP | Add server/computer public IP to QQ bot whitelist |
| QQ bot credentials invalid | Secret copied wrong or expired | Re-create bot secret on QQ Open Platform |
| Discord bot not responding | Message Content Intent not enabled | Enable Message Content Intent in Bot settings |
Discord Missing Access | Bot not invited or missing permissions | Re-generate invite URL with Send Messages + Read Message History |
| health check returns connection refused | Gateway not running or wrong port | Run openclaw gateway status, restart if needed |
For any error not listed:
openclaw doctor --fixopenclaw logs --tail 50After OpenClaw is installed and running, users may come back to ask for help with day-to-day maintenance. Use this section as a quick reference to handle common post-installation requests.
Run these in order and report results in plain language:
openclaw gateway status
openclaw doctor
curl http://127.0.0.1:18789/health # macOS/Linux
# or: (Invoke-WebRequest http://127.0.0.1:18789/health).Content # Windows
If gateway is stopped:
openclaw gateway start
If gateway is running but not responding:
openclaw gateway restart
If openclaw doctor reports issues:
openclaw doctor --fix
Always explain what happened in one plain sentence, e.g.:
"Your OpenClaw gateway had stopped — probably because your computer restarted. I've started it back up, and it's running normally now."
Use the same method from Phase 3:
npx clawhub@latest install <skill-name>
openclaw gateway restart
If GitHub rate-limited, fall back to manual download (see Phase 3 fallback).
To see what's currently installed:
openclaw skills list
Popular skills to suggest if the user isn't sure what to add:
| Want to... | Skill | What it does |
|---|---|---|
| Browse the web | agent-browser | Read and extract content from any webpage |
| Get weather | weather | Real-time weather, no API key needed |
| Summarize anything | summarize | Condense documents, articles, webpages |
| Automate routines | proactive-agent | Schedule tasks like "every Monday, send me..." |
| Track A-shares | a-share-real-time-data | Real-time stock data via TDX protocol |
cat ~/.openclaw/openclaw.json # macOS/Linux
Get-Content "$env:USERPROFILE\.openclaw\openclaw.json" # Windows
Update the models.providers section with the new provider template
(refer to Phase 2.2 templates A–E)
Update agents.defaults.model.primary to match the new provider/model
Restart:
openclaw gateway restart
Follow the corresponding Phase 4 section (4B for Feishu, 4C for QQ, 4D for Discord). The process is the same as initial setup — install the plugin, collect credentials, write config, restart gateway.
openclaw logs --tail 50
Read the last few lines, translate any errors into plain language, and suggest a fix. If the error matches the Error Handling Reference table above, follow that fix directly.
openclaw --version
npm install -g openclaw@latest
openclaw doctor --fix
openclaw gateway restart
After updating, always run openclaw doctor --fix to apply any migrations.
juliusbrussee/caveman
mattpocock/skills
shadcn/improve
obra/superpowers
forrestchang/andrej-karpathy-skills
vercel-labs/skills