diff --git a/.markdownlint-cli2.jsonc b/.markdownlint-cli2.jsonc index 24f90372bf..3f321b5aff 100644 --- a/.markdownlint-cli2.jsonc +++ b/.markdownlint-cli2.jsonc @@ -6,6 +6,11 @@ "MD013": false, "MD025": false, + "MD026": false, + "MD029": false, + "MD030": false, + "MD031": false, + "MD032": false, "MD033": { "allowed_elements": [ @@ -43,7 +48,9 @@ ], }, + "MD034": false, "MD036": false, + "MD037": false, "MD040": false, "MD041": false, "MD046": false, diff --git a/docs/automation/gmail-pubsub.md b/docs/automation/gmail-pubsub.md index d85802d4df..734ae6f770 100644 --- a/docs/automation/gmail-pubsub.md +++ b/docs/automation/gmail-pubsub.md @@ -143,19 +143,19 @@ gcloud config set project Note: Gmail watch requires the Pub/Sub topic to live in the same project as the OAuth client. -1. Enable APIs: +2. Enable APIs: ```bash gcloud services enable gmail.googleapis.com pubsub.googleapis.com ``` -1. Create a topic: +3. Create a topic: ```bash gcloud pubsub topics create gog-gmail-watch ``` -1. Allow Gmail push to publish: +4. Allow Gmail push to publish: ```bash gcloud pubsub topics add-iam-policy-binding gog-gmail-watch \ diff --git a/docs/bedrock.md b/docs/bedrock.md index 47873eff2c..34c759dbb5 100644 --- a/docs/bedrock.md +++ b/docs/bedrock.md @@ -66,7 +66,7 @@ export AWS_PROFILE="your-profile" export AWS_BEARER_TOKEN_BEDROCK="..." ``` -1. Add a Bedrock provider and model to your config (no `apiKey` required): +2. Add a Bedrock provider and model to your config (no `apiKey` required): ```json5 { diff --git a/docs/brave-search.md b/docs/brave-search.md index ba18a6c552..2606479422 100644 --- a/docs/brave-search.md +++ b/docs/brave-search.md @@ -12,7 +12,7 @@ OpenClaw uses Brave Search as the default provider for `web_search`. ## Get an API key -1. Create a Brave Search API account at [https://brave.com/search/api/](https://brave.com/search/api/) +1. Create a Brave Search API account at https://brave.com/search/api/ 2. In the dashboard, choose the **Data for Search** plan and generate an API key. 3. Store the key in config (recommended) or set `BRAVE_API_KEY` in the Gateway environment. diff --git a/docs/channels/bluebubbles.md b/docs/channels/bluebubbles.md index 1f1ee40ea3..b40fc375da 100644 --- a/docs/channels/bluebubbles.md +++ b/docs/channels/bluebubbles.md @@ -27,7 +27,6 @@ Status: bundled plugin that talks to the BlueBubbles macOS server over HTTP. **R 1. Install the BlueBubbles server on your Mac (follow the instructions at [bluebubbles.app/install](https://bluebubbles.app/install)). 2. In the BlueBubbles config, enable the web API and set a password. 3. Run `openclaw onboard` and select BlueBubbles, or configure manually: - ```json5 { channels: { @@ -40,7 +39,6 @@ Status: bundled plugin that talks to the BlueBubbles macOS server over HTTP. **R }, } ``` - 4. Point BlueBubbles webhooks to your gateway (example: `https://your-gateway-host:3000/bluebubbles-webhook?password=`). 5. Start the gateway; it will register the webhook handler and start pairing. diff --git a/docs/channels/feishu.md b/docs/channels/feishu.md index e15feafe34..2c6ba1e7f4 100644 --- a/docs/channels/feishu.md +++ b/docs/channels/feishu.md @@ -75,7 +75,7 @@ Choose **Feishu**, then enter the App ID and App Secret. Visit [Feishu Open Platform](https://open.feishu.cn/app) and sign in. -Lark (global) tenants should use [https://open.larksuite.com/app](https://open.larksuite.com/app) and set `domain: "lark"` in the Feishu config. +Lark (global) tenants should use https://open.larksuite.com/app and set `domain: "lark"` in the Feishu config. ### 2. Create an app @@ -261,12 +261,10 @@ After approval, you can chat normally. - **Default**: `dmPolicy: "pairing"` (unknown users get a pairing code) - **Approve pairing**: - ```bash openclaw pairing list feishu openclaw pairing approve feishu ``` - - **Allowlist mode**: set `channels.feishu.allowFrom` with allowed Open IDs ### Group chats diff --git a/docs/channels/googlechat.md b/docs/channels/googlechat.md index 39192ecae2..07c7dd7dc6 100644 --- a/docs/channels/googlechat.md +++ b/docs/channels/googlechat.md @@ -101,7 +101,6 @@ Use Tailscale Serve for the private dashboard and Funnel for the public webhook If prompted, visit the authorization URL shown in the output to enable Funnel for this node in your tailnet policy. 5. **Verify the configuration:** - ```bash tailscale serve status tailscale funnel status @@ -226,7 +225,6 @@ This means the webhook handler isn't registered. Common causes: If it shows "disabled", add `plugins.entries.googlechat.enabled: true` to your config. 3. **Gateway not restarted**: After adding config, restart the gateway: - ```bash openclaw gateway restart ``` diff --git a/docs/channels/line.md b/docs/channels/line.md index d32e683fbe..f68ae5aa1e 100644 --- a/docs/channels/line.md +++ b/docs/channels/line.md @@ -34,7 +34,7 @@ openclaw plugins install ./extensions/line ## Setup 1. Create a LINE Developers account and open the Console: - [https://developers.line.biz/console/](https://developers.line.biz/console/) + https://developers.line.biz/console/ 2. Create (or pick) a Provider and add a **Messaging API** channel. 3. Copy the **Channel access token** and **Channel secret** from the channel settings. 4. Enable **Use webhook** in the Messaging API settings. diff --git a/docs/channels/matrix.md b/docs/channels/matrix.md index 56b363fdd9..a196a68b67 100644 --- a/docs/channels/matrix.md +++ b/docs/channels/matrix.md @@ -74,7 +74,7 @@ Details: [Plugins](/plugin) - When set, `channels.matrix.userId` should be the full Matrix ID (example: `@bot:example.org`). 5. Restart the gateway (or finish onboarding). 6. Start a DM with the bot or invite it to a room from any Matrix client - (Element, Beeper, etc.; see [https://matrix.org/ecosystem/clients/](https://matrix.org/ecosystem/clients/)). Beeper requires E2EE, + (Element, Beeper, etc.; see https://matrix.org/ecosystem/clients/). Beeper requires E2EE, so set `channels.matrix.encryption: true` and verify the device. Minimal config (access token, user ID auto-fetched): diff --git a/docs/channels/msteams.md b/docs/channels/msteams.md index 92f413811f..a18e8063d0 100644 --- a/docs/channels/msteams.md +++ b/docs/channels/msteams.md @@ -166,7 +166,7 @@ Before configuring OpenClaw, you need to create an Azure Bot resource. > **Deprecation notice:** Creation of new multi-tenant bots was deprecated after 2025-07-31. Use **Single Tenant** for new bots. -1. Click **Review + create** → **Create** (wait ~1-2 minutes) +3. Click **Review + create** → **Create** (wait ~1-2 minutes) ### Step 2: Get Credentials @@ -558,7 +558,6 @@ Bots don't have a personal OneDrive drive (the `/me/drive` Graph API endpoint do ``` 4. **Configure OpenClaw:** - ```json5 { channels: { @@ -748,7 +747,7 @@ Bots have limited support in private channels: - **"Icon file cannot be empty":** The manifest references icon files that are 0 bytes. Create valid PNG icons (32x32 for `outline.png`, 192x192 for `color.png`). - **"webApplicationInfo.Id already in use":** The app is still installed in another team/chat. Find and uninstall it first, or wait 5-10 minutes for propagation. -- **"Something went wrong" on upload:** Upload via [https://admin.teams.microsoft.com](https://admin.teams.microsoft.com) instead, open browser DevTools (F12) → Network tab, and check the response body for the actual error. +- **"Something went wrong" on upload:** Upload via https://admin.teams.microsoft.com instead, open browser DevTools (F12) → Network tab, and check the response body for the actual error. - **Sideload failing:** Try "Upload an app to your org's app catalog" instead of "Upload a custom app" - this often bypasses sideload restrictions. ### RSC permissions not working diff --git a/docs/channels/nextcloud-talk.md b/docs/channels/nextcloud-talk.md index efecfd9900..edca54bc44 100644 --- a/docs/channels/nextcloud-talk.md +++ b/docs/channels/nextcloud-talk.md @@ -34,11 +34,9 @@ Details: [Plugins](/plugin) 1. Install the Nextcloud Talk plugin. 2. On your Nextcloud server, create a bot: - ```bash ./occ talk:bot:install "OpenClaw" "" "" --feature reaction ``` - 3. Enable the bot in the target room settings. 4. Configure OpenClaw: - Config: `channels.nextcloud-talk.baseUrl` + `channels.nextcloud-talk.botSecret` diff --git a/docs/channels/nostr.md b/docs/channels/nostr.md index 30654a690b..3368933d6c 100644 --- a/docs/channels/nostr.md +++ b/docs/channels/nostr.md @@ -49,7 +49,7 @@ Restart the Gateway after installing or enabling plugins. nak key generate ``` -1. Add to config: +2. Add to config: ```json { @@ -61,13 +61,13 @@ nak key generate } ``` -1. Export the key: +3. Export the key: ```bash export NOSTR_PRIVATE_KEY="nsec1..." ``` -1. Restart the Gateway. +4. Restart the Gateway. ## Configuration reference diff --git a/docs/channels/slack.md b/docs/channels/slack.md index 1343ebf77d..c8329439f7 100644 --- a/docs/channels/slack.md +++ b/docs/channels/slack.md @@ -30,7 +30,7 @@ Minimal config: ### Setup -1. Create a Slack app (From scratch) in [https://api.slack.com/apps](https://api.slack.com/apps). +1. Create a Slack app (From scratch) in https://api.slack.com/apps. 2. **Socket Mode** → toggle on. Then go to **Basic Information** → **App-Level Tokens** → **Generate Token and Scopes** with scope `connections:write`. Copy the **App Token** (`xapp-...`). 3. **OAuth & Permissions** → add bot token scopes (use the manifest below). Click **Install to Workspace**. Copy the **Bot User OAuth Token** (`xoxb-...`). 4. Optional: **OAuth & Permissions** → add **User Token Scopes** (see the read-only list below). Reinstall the app and copy the **User OAuth Token** (`xoxp-...`). @@ -260,30 +260,30 @@ If you enable native commands, add one `slash_commands` entry per command you wa Slack's Conversations API is type-scoped: you only need the scopes for the conversation types you actually touch (channels, groups, im, mpim). See -[https://docs.slack.dev/apis/web-api/using-the-conversations-api/](https://docs.slack.dev/apis/web-api/using-the-conversations-api/) for the overview. +https://docs.slack.dev/apis/web-api/using-the-conversations-api/ for the overview. ### Bot token scopes (required) - `chat:write` (send/update/delete messages via `chat.postMessage`) - [https://docs.slack.dev/reference/methods/chat.postMessage](https://docs.slack.dev/reference/methods/chat.postMessage) + https://docs.slack.dev/reference/methods/chat.postMessage - `im:write` (open DMs via `conversations.open` for user DMs) - [https://docs.slack.dev/reference/methods/conversations.open](https://docs.slack.dev/reference/methods/conversations.open) + https://docs.slack.dev/reference/methods/conversations.open - `channels:history`, `groups:history`, `im:history`, `mpim:history` - [https://docs.slack.dev/reference/methods/conversations.history](https://docs.slack.dev/reference/methods/conversations.history) + https://docs.slack.dev/reference/methods/conversations.history - `channels:read`, `groups:read`, `im:read`, `mpim:read` - [https://docs.slack.dev/reference/methods/conversations.info](https://docs.slack.dev/reference/methods/conversations.info) + https://docs.slack.dev/reference/methods/conversations.info - `users:read` (user lookup) - [https://docs.slack.dev/reference/methods/users.info](https://docs.slack.dev/reference/methods/users.info) + https://docs.slack.dev/reference/methods/users.info - `reactions:read`, `reactions:write` (`reactions.get` / `reactions.add`) - [https://docs.slack.dev/reference/methods/reactions.get](https://docs.slack.dev/reference/methods/reactions.get) - [https://docs.slack.dev/reference/methods/reactions.add](https://docs.slack.dev/reference/methods/reactions.add) + https://docs.slack.dev/reference/methods/reactions.get + https://docs.slack.dev/reference/methods/reactions.add - `pins:read`, `pins:write` (`pins.list` / `pins.add` / `pins.remove`) - [https://docs.slack.dev/reference/scopes/pins.read](https://docs.slack.dev/reference/scopes/pins.read) - [https://docs.slack.dev/reference/scopes/pins.write](https://docs.slack.dev/reference/scopes/pins.write) + https://docs.slack.dev/reference/scopes/pins.read + https://docs.slack.dev/reference/scopes/pins.write - `emoji:read` (`emoji.list`) - [https://docs.slack.dev/reference/scopes/emoji.read](https://docs.slack.dev/reference/scopes/emoji.read) + https://docs.slack.dev/reference/scopes/emoji.read - `files:write` (uploads via `files.uploadV2`) - [https://docs.slack.dev/messaging/working-with-files/#upload](https://docs.slack.dev/messaging/working-with-files/#upload) + https://docs.slack.dev/messaging/working-with-files/#upload ### User token scopes (optional, read-only by default) @@ -302,9 +302,9 @@ Add these under **User Token Scopes** if you configure `channels.slack.userToken - `mpim:write` (only if we add group-DM open/DM start via `conversations.open`) - `groups:write` (only if we add private-channel management: create/rename/invite/archive) - `chat:write.public` (only if we want to post to channels the bot isn't in) - [https://docs.slack.dev/reference/scopes/chat.write.public](https://docs.slack.dev/reference/scopes/chat.write.public) + https://docs.slack.dev/reference/scopes/chat.write.public - `users:read.email` (only if we need email fields from `users.info`) - [https://docs.slack.dev/changelog/2017-04-narrowing-email-access](https://docs.slack.dev/changelog/2017-04-narrowing-email-access) + https://docs.slack.dev/changelog/2017-04-narrowing-email-access - `files:read` (only if we start listing/reading file metadata) ## Config diff --git a/docs/channels/telegram.md b/docs/channels/telegram.md index 9e3921713b..c7fb4fe57c 100644 --- a/docs/channels/telegram.md +++ b/docs/channels/telegram.md @@ -74,9 +74,9 @@ If both env and config are set, config takes precedence. Multi-account support: use `channels.telegram.accounts` with per-account tokens and optional `name`. See [`gateway/configuration`](/gateway/configuration#telegramaccounts--discordaccounts--slackaccounts--signalaccounts--imessageaccounts) for the shared pattern. -1. Start the gateway. Telegram starts when a token is resolved (config first, env fallback). -2. DM access defaults to pairing. Approve the code when the bot is first contacted. -3. For groups: add the bot, decide privacy/admin behavior (below), then set `channels.telegram.groups` to control mention gating + allowlists. +3. Start the gateway. Telegram starts when a token is resolved (config first, env fallback). +4. DM access defaults to pairing. Approve the code when the bot is first contacted. +5. For groups: add the bot, decide privacy/admin behavior (below), then set `channels.telegram.groups` to control mention gating + allowlists. ## Token + privacy + permissions (Telegram side) @@ -365,7 +365,6 @@ Alternate (official Bot API): 1. DM your bot. 2. Fetch updates with your bot token and read `message.from.id`: - ```bash curl "https://api.telegram.org/bot/getUpdates" ``` diff --git a/docs/channels/twitch.md b/docs/channels/twitch.md index ac46e35d6e..7901c04278 100644 --- a/docs/channels/twitch.md +++ b/docs/channels/twitch.md @@ -34,7 +34,7 @@ Details: [Plugins](/plugin) - Select **Bot Token** - Verify scopes `chat:read` and `chat:write` are selected - Copy the **Client ID** and **Access Token** -3. Find your Twitch user ID: [https://www.streamweasels.com/tools/convert-twitch-username-to-user-id/](https://www.streamweasels.com/tools/convert-twitch-username-to-user-id/) +3. Find your Twitch user ID: https://www.streamweasels.com/tools/convert-twitch-username-to-user-id/ 4. Configure the token: - Env: `OPENCLAW_TWITCH_ACCESS_TOKEN=...` (default account only) - Or config: `channels.twitch.accessToken` @@ -123,7 +123,7 @@ Prefer `allowFrom` for a hard allowlist. Use `allowedRoles` instead if you want **Why user IDs?** Usernames can change, allowing impersonation. User IDs are permanent. -Find your Twitch user ID: [https://www.streamweasels.com/tools/convert-twitch-username-%20to-user-id/](https://www.streamweasels.com/tools/convert-twitch-username-%20to-user-id/) (Convert your Twitch username to ID) +Find your Twitch user ID: https://www.streamweasels.com/tools/convert-twitch-username-%20to-user-id/ (Convert your Twitch username to ID) ## Token refresh (optional) diff --git a/docs/channels/whatsapp.md b/docs/channels/whatsapp.md index 966c0902aa..1741ee1b7e 100644 --- a/docs/channels/whatsapp.md +++ b/docs/channels/whatsapp.md @@ -205,13 +205,11 @@ The wizard uses it to set your **allowlist/owner** so your own DMs are permitted - `Body` is the current message body with envelope. - Quoted reply context is **always appended**: - ``` [Replying to +1555 id:ABC123] > [/Replying] ``` - - Reply metadata also set: - `ReplyToId` = stanzaId - `ReplyToBody` = quoted body or media placeholder diff --git a/docs/channels/zalo.md b/docs/channels/zalo.md index 0bb2607ec1..0f247190c3 100644 --- a/docs/channels/zalo.md +++ b/docs/channels/zalo.md @@ -57,7 +57,7 @@ It is a good fit for support or notifications where you want deterministic routi ### 1) Create a bot token (Zalo Bot Platform) -1. Go to **[https://bot.zaloplatforms.com](https://bot.zaloplatforms.com)** and sign in. +1. Go to **https://bot.zaloplatforms.com** and sign in. 2. Create a new bot and configure its settings. 3. Copy the bot token (format: `12345689:abc-xyz`). @@ -81,8 +81,8 @@ Env option: `ZALO_BOT_TOKEN=...` (works for the default account only). Multi-account support: use `channels.zalo.accounts` with per-account tokens and optional `name`. -1. Restart the gateway. Zalo starts when a token is resolved (env or config). -2. DM access defaults to pairing. Approve the code when the bot is first contacted. +3. Restart the gateway. Zalo starts when a token is resolved (env or config). +4. DM access defaults to pairing. Approve the code when the bot is first contacted. ## How it works (behavior) diff --git a/docs/channels/zalouser.md b/docs/channels/zalouser.md index 53c9a4d2ca..5a1b555b82 100644 --- a/docs/channels/zalouser.md +++ b/docs/channels/zalouser.md @@ -46,8 +46,8 @@ The Gateway machine must have the `zca` binary available in `PATH`. } ``` -1. Restart the Gateway (or finish onboarding). -2. DM access defaults to pairing; approve the pairing code on first contact. +4. Restart the Gateway (or finish onboarding). +5. DM access defaults to pairing; approve the pairing code on first contact. ## What it is diff --git a/docs/concepts/architecture.md b/docs/concepts/architecture.md index a9676b171c..a1c7f3383c 100644 --- a/docs/concepts/architecture.md +++ b/docs/concepts/architecture.md @@ -110,11 +110,9 @@ Details: [Gateway protocol](/gateway/protocol), [Pairing](/start/pairing), - Preferred: Tailscale or VPN. - Alternative: SSH tunnel - ```bash ssh -N -L 18789:127.0.0.1:18789 user@host ``` - - The same handshake + auth token apply over the tunnel. - TLS + optional pinning can be enabled for WS in remote setups. diff --git a/docs/concepts/groups.md b/docs/concepts/groups.md index b873f995e9..635211d336 100644 --- a/docs/concepts/groups.md +++ b/docs/concepts/groups.md @@ -301,7 +301,7 @@ Common intents (copy/paste): } ``` -1. Allow only specific groups (WhatsApp) +2. Allow only specific groups (WhatsApp) ```json5 { @@ -316,7 +316,7 @@ Common intents (copy/paste): } ``` -1. Allow all groups but require mention (explicit) +3. Allow all groups but require mention (explicit) ```json5 { @@ -328,7 +328,7 @@ Common intents (copy/paste): } ``` -1. Only the owner can trigger in groups (WhatsApp) +4. Only the owner can trigger in groups (WhatsApp) ```json5 { diff --git a/docs/concepts/memory.md b/docs/concepts/memory.md index 6ed386cb07..4b499860b5 100644 --- a/docs/concepts/memory.md +++ b/docs/concepts/memory.md @@ -302,8 +302,8 @@ Why OpenAI batch is fast + cheap: - For large backfills, OpenAI is typically the fastest option we support because we can submit many embedding requests in a single batch job and let OpenAI process them asynchronously. - OpenAI offers discounted pricing for Batch API workloads, so large indexing runs are usually cheaper than sending the same requests synchronously. - See the OpenAI Batch API docs and pricing for details: - - [https://platform.openai.com/docs/api-reference/batch](https://platform.openai.com/docs/api-reference/batch) - - [https://platform.openai.com/pricing](https://platform.openai.com/pricing) + - https://platform.openai.com/docs/api-reference/batch + - https://platform.openai.com/pricing Config example: @@ -382,11 +382,11 @@ Implementation sketch: - **Vector**: top `maxResults * candidateMultiplier` by cosine similarity. - **BM25**: top `maxResults * candidateMultiplier` by FTS5 BM25 rank (lower is better). -1. Convert BM25 rank into a 0..1-ish score: +2. Convert BM25 rank into a 0..1-ish score: - `textScore = 1 / (1 + max(0, bm25Rank))` -1. Union candidates by chunk id and compute a weighted score: +3. Union candidates by chunk id and compute a weighted score: - `finalScore = vectorWeight * vectorScore + textWeight * textScore` diff --git a/docs/concepts/model-providers.md b/docs/concepts/model-providers.md index fba56a34a1..4d313cf0f2 100644 --- a/docs/concepts/model-providers.md +++ b/docs/concepts/model-providers.md @@ -136,14 +136,14 @@ Moonshot uses OpenAI-compatible endpoints, so configure it as a custom provider: Kimi K2 model IDs: -{/_moonshot-kimi-k2-model-refs:start_/ && null} +{/_ moonshot-kimi-k2-model-refs:start _/ && null} - `moonshot/kimi-k2.5` - `moonshot/kimi-k2-0905-preview` - `moonshot/kimi-k2-turbo-preview` - `moonshot/kimi-k2-thinking` - `moonshot/kimi-k2-thinking-turbo` - {/_moonshot-kimi-k2-model-refs:end_/ && null} + {/_ moonshot-kimi-k2-model-refs:end _/ && null} ```json5 { @@ -242,7 +242,7 @@ Ollama is a local LLM runtime that provides an OpenAI-compatible API: - Provider: `ollama` - Auth: None required (local server) - Example model: `ollama/llama3.3` -- Installation: [https://ollama.ai](https://ollama.ai) +- Installation: https://ollama.ai ```bash # Install Ollama, then pull a model: diff --git a/docs/concepts/system-prompt.md b/docs/concepts/system-prompt.md index acb2bf8b5f..aafa80473d 100644 --- a/docs/concepts/system-prompt.md +++ b/docs/concepts/system-prompt.md @@ -110,6 +110,6 @@ This keeps the base prompt small while still enabling targeted skill usage. When available, the system prompt includes a **Documentation** section that points to the local OpenClaw docs directory (either `docs/` in the repo workspace or the bundled npm package docs) and also notes the public mirror, source repo, community Discord, and -ClawHub ([https://clawhub.com](https://clawhub.com)) for skills discovery. The prompt instructs the model to consult local docs first +ClawHub (https://clawhub.com) for skills discovery. The prompt instructs the model to consult local docs first for OpenClaw behavior, commands, configuration, or architecture, and to run `openclaw status` itself when possible (asking the user only when it lacks access). diff --git a/docs/concepts/typebox.md b/docs/concepts/typebox.md index a44f3ffd2f..38ee7d8cac 100644 --- a/docs/concepts/typebox.md +++ b/docs/concepts/typebox.md @@ -217,7 +217,7 @@ export type SystemEchoParams = Static; export type SystemEchoResult = Static; ``` -1. **Validation** +2. **Validation** In `src/gateway/protocol/index.ts`, export an AJV validator: @@ -225,7 +225,7 @@ In `src/gateway/protocol/index.ts`, export an AJV validator: export const validateSystemEchoParams = ajv.compile(SystemEchoParamsSchema); ``` -1. **Server behavior** +3. **Server behavior** Add a handler in `src/gateway/server-methods/system.ts`: @@ -241,13 +241,13 @@ export const systemHandlers: GatewayRequestHandlers = { Register it in `src/gateway/server-methods.ts` (already merges `systemHandlers`), then add `"system.echo"` to `METHODS` in `src/gateway/server.ts`. -1. **Regenerate** +4. **Regenerate** ```bash pnpm protocol:check ``` -1. **Tests + docs** +5. **Tests + docs** Add a server test in `src/gateway/server.*.test.ts` and note the method in docs. @@ -280,7 +280,7 @@ Unknown frame types are preserved as raw payloads for forward compatibility. Generated JSON Schema is in the repo at `dist/protocol.schema.json`. The published raw file is typically available at: -- [https://raw.githubusercontent.com/openclaw/openclaw/main/dist/protocol.schema.json](https://raw.githubusercontent.com/openclaw/openclaw/main/dist/protocol.schema.json) +- https://raw.githubusercontent.com/openclaw/openclaw/main/dist/protocol.schema.json ## When you change schemas diff --git a/docs/debug/node-issue.md b/docs/debug/node-issue.md index 8355d2abc3..ce46b1a05e 100644 --- a/docs/debug/node-issue.md +++ b/docs/debug/node-issue.md @@ -62,21 +62,19 @@ node --import tsx scripts/repro/tsx-name-repro.ts - Use Bun for dev scripts (current temporary revert). - Use Node + tsc watch, then run compiled output: - ```bash pnpm exec tsc --watch --preserveWatchOutput node --watch openclaw.mjs status ``` - - Confirmed locally: `pnpm exec tsc -p tsconfig.json` + `node openclaw.mjs status` works on Node 25. - Disable esbuild keepNames in the TS loader if possible (prevents `__name` helper insertion); tsx does not currently expose this. - Test Node LTS (22/24) with `tsx` to see if the issue is Node 25–specific. ## References -- [https://opennext.js.org/cloudflare/howtos/keep_names](https://opennext.js.org/cloudflare/howtos/keep_names) -- [https://esbuild.github.io/api/#keep-names](https://esbuild.github.io/api/#keep-names) -- [https://github.com/evanw/esbuild/issues/1031](https://github.com/evanw/esbuild/issues/1031) +- https://opennext.js.org/cloudflare/howtos/keep_names +- https://esbuild.github.io/api/#keep-names +- https://github.com/evanw/esbuild/issues/1031 ## Next steps diff --git a/docs/experiments/research/memory.md b/docs/experiments/research/memory.md index 8d1404d7e7..99135e78be 100644 --- a/docs/experiments/research/memory.md +++ b/docs/experiments/research/memory.md @@ -47,7 +47,7 @@ Two pieces to blend: - everything else is out-of-context and retrieved via tools - memory writes are explicit tool calls (append/replace/insert), persisted, then re-injected next turn -1. **Hindsight-style memory substrate** +2. **Hindsight-style memory substrate** - separate what’s observed vs what’s believed vs what’s summarized - support retain/recall/reflect diff --git a/docs/gateway/authentication.md b/docs/gateway/authentication.md index e63994bacd..9b616084c0 100644 --- a/docs/gateway/authentication.md +++ b/docs/gateway/authentication.md @@ -27,7 +27,7 @@ export ANTHROPIC_API_KEY="..." openclaw models status ``` -1. If the Gateway runs under systemd/launchd, prefer putting the key in +3. If the Gateway runs under systemd/launchd, prefer putting the key in `~/.openclaw/.env` so the daemon can read it: ```bash diff --git a/docs/gateway/bonjour.md b/docs/gateway/bonjour.md index 9e2ad8753a..b8f08741e7 100644 --- a/docs/gateway/bonjour.md +++ b/docs/gateway/bonjour.md @@ -105,13 +105,10 @@ The Gateway advertises small non‑secret hints to make UI flows convenient: Useful built‑in tools: - Browse instances: - ```bash dns-sd -B _openclaw-gw._tcp local. ``` - - Resolve one instance (replace ``): - ```bash dns-sd -L "" _openclaw-gw._tcp local. ``` diff --git a/docs/gateway/configuration.md b/docs/gateway/configuration.md index 639f84bd6e..545a937dfb 100644 --- a/docs/gateway/configuration.md +++ b/docs/gateway/configuration.md @@ -1978,13 +1978,11 @@ Block streaming: - `agents.defaults.blockStreamingChunk`: soft chunking for streamed blocks. Defaults to 800–1200 chars, prefers paragraph breaks (`\n\n`), then newlines, then sentences. Example: - ```json5 { agents: { defaults: { blockStreamingChunk: { minChars: 800, maxChars: 1200 } } }, } ``` - - `agents.defaults.blockStreamingCoalesce`: merge streamed blocks before sending. Defaults to `{ idleMs: 1000 }` and inherits `minChars` from `blockStreamingChunk` with `maxChars` capped to the channel text limit. Signal/Slack/Discord/Google Chat default @@ -1998,13 +1996,11 @@ Block streaming: Modes: `off` (default), `natural` (800–2500ms), `custom` (use `minMs`/`maxMs`). Per-agent override: `agents.list[].humanDelay`. Example: - ```json5 { agents: { defaults: { humanDelay: { mode: "natural" } } }, } ``` - See [/concepts/streaming](/concepts/streaming) for behavior + chunking details. Typing indicators: @@ -2070,7 +2066,7 @@ of `every`, keep `HEARTBEAT.md` tiny, and/or choose a cheaper `model`. - `tools.web.fetch.readability` (default true; disable to use basic HTML cleanup only) - `tools.web.fetch.firecrawl.enabled` (default true when an API key is set) - `tools.web.fetch.firecrawl.apiKey` (optional; defaults to `FIRECRAWL_API_KEY`) -- `tools.web.fetch.firecrawl.baseUrl` (default [https://api.firecrawl.dev](https://api.firecrawl.dev)) +- `tools.web.fetch.firecrawl.baseUrl` (default https://api.firecrawl.dev) - `tools.web.fetch.firecrawl.onlyMainContent` (default true) - `tools.web.fetch.firecrawl.maxAgeMs` (optional) - `tools.web.fetch.firecrawl.timeoutSeconds` (optional) @@ -2486,7 +2482,7 @@ Select the model via `agents.defaults.model.primary` (provider/model). OpenCode Zen is a multi-model gateway with per-model endpoints. OpenClaw uses the built-in `opencode` provider from pi-ai; set `OPENCODE_API_KEY` (or -`OPENCODE_ZEN_API_KEY`) from [https://opencode.ai/auth](https://opencode.ai/auth). +`OPENCODE_ZEN_API_KEY`) from https://opencode.ai/auth. Notes: diff --git a/docs/gateway/index.md b/docs/gateway/index.md index 64697f1f46..06dd72c13d 100644 --- a/docs/gateway/index.md +++ b/docs/gateway/index.md @@ -49,11 +49,9 @@ pnpm gateway:watch ## Remote access - Tailscale/VPN preferred; otherwise SSH tunnel: - ```bash ssh -N -L 18789:127.0.0.1:18789 user@host ``` - - Clients then connect to `ws://127.0.0.1:18789` through the tunnel. - If a token is configured, clients must include it in `connect.params.auth.token` even over the tunnel. diff --git a/docs/gateway/local-models.md b/docs/gateway/local-models.md index 3f7e13d41e..fe715ab055 100644 --- a/docs/gateway/local-models.md +++ b/docs/gateway/local-models.md @@ -52,7 +52,7 @@ Best current local stack. Load MiniMax M2.1 in LM Studio, enable the local serve **Setup checklist** -- Install LM Studio: [https://lmstudio.ai](https://lmstudio.ai) +- Install LM Studio: https://lmstudio.ai - In LM Studio, download the **largest MiniMax M2.1 build available** (avoid “small”/heavily quantized variants), start the server, confirm `http://127.0.0.1:1234/v1/models` lists it. - Keep the model loaded; cold-load adds startup latency. - Adjust `contextWindow`/`maxTokens` if your LM Studio build differs. diff --git a/docs/gateway/security/index.md b/docs/gateway/security/index.md index f6bd917346..c6b521048e 100644 --- a/docs/gateway/security/index.md +++ b/docs/gateway/security/index.md @@ -773,22 +773,18 @@ If it fails, there are new candidates not yet in the baseline. ### If CI fails 1. Reproduce locally: - ```bash detect-secrets scan --baseline .secrets.baseline ``` - 2. Understand the tools: - `detect-secrets scan` finds candidates and compares them to the baseline. - `detect-secrets audit` opens an interactive review to mark each baseline item as real or false positive. 3. For real secrets: rotate/remove them, then re-run the scan to update the baseline. 4. For false positives: run the interactive audit and mark them as false: - ```bash detect-secrets audit .secrets.baseline ``` - 5. If you need new excludes, add them to `.detect-secrets.cfg` and regenerate the baseline with matching `--exclude-files` / `--exclude-lines` flags (the config file is reference-only; detect-secrets doesn’t read it automatically). @@ -818,7 +814,7 @@ Mario asking for find ~ Found a vulnerability in OpenClaw? Please report responsibly: -1. Email: [security@openclaw.ai](mailto:security@openclaw.ai) +1. Email: security@openclaw.ai 2. Don't post publicly until fixed 3. We'll credit you (unless you prefer anonymity) diff --git a/docs/gateway/tailscale.md b/docs/gateway/tailscale.md index 3a12b7fe16..3f4daa1110 100644 --- a/docs/gateway/tailscale.md +++ b/docs/gateway/tailscale.md @@ -121,7 +121,7 @@ Avoid Funnel for browser control; treat node pairing like operator access. ## Learn more -- Tailscale Serve overview: [https://tailscale.com/kb/1312/serve](https://tailscale.com/kb/1312/serve) -- `tailscale serve` command: [https://tailscale.com/kb/1242/tailscale-serve](https://tailscale.com/kb/1242/tailscale-serve) -- Tailscale Funnel overview: [https://tailscale.com/kb/1223/tailscale-funnel](https://tailscale.com/kb/1223/tailscale-funnel) -- `tailscale funnel` command: [https://tailscale.com/kb/1311/tailscale-funnel](https://tailscale.com/kb/1311/tailscale-funnel) +- Tailscale Serve overview: https://tailscale.com/kb/1312/serve +- `tailscale serve` command: https://tailscale.com/kb/1242/tailscale-serve +- Tailscale Funnel overview: https://tailscale.com/kb/1223/tailscale-funnel +- `tailscale funnel` command: https://tailscale.com/kb/1311/tailscale-funnel diff --git a/docs/gateway/troubleshooting.md b/docs/gateway/troubleshooting.md index 5f9d51f1dd..d9aa303cd8 100644 --- a/docs/gateway/troubleshooting.md +++ b/docs/gateway/troubleshooting.md @@ -42,11 +42,9 @@ Fix options: - Re-run onboarding and choose **Anthropic** for that agent. - Or paste a setup-token on the **gateway host**: - ```bash openclaw models auth setup-token --provider anthropic ``` - - Or copy `auth-profiles.json` from the main agent dir to the new agent dir. Verify: @@ -122,17 +120,13 @@ Doctor/service will show runtime state (PID/last exit) and log hints. **Enable more logging:** - Bump file log detail (persisted JSONL): - ```json { "logging": { "level": "debug" } } ``` - - Bump console verbosity (TTY output only): - ```json { "logging": { "consoleLevel": "debug", "consoleStyle": "pretty" } } ``` - - Quick tip: `--verbose` affects **console** output only. File logs remain controlled by `logging.level`. See [/logging](/logging) for a full overview of formats, config, and access. @@ -145,13 +139,10 @@ Gateway refuses to start. **Fix (recommended):** - Run the wizard and set the Gateway run mode to **Local**: - ```bash openclaw configure ``` - - Or set it directly: - ```bash openclaw config set gateway.mode local ``` @@ -159,7 +150,6 @@ Gateway refuses to start. **If you meant to run a remote Gateway instead:** - Set a remote URL and keep `gateway.mode=remote`: - ```bash openclaw config set gateway.mode remote openclaw config set gateway.remote.url "wss://gateway.example.com" @@ -564,7 +554,6 @@ Notes: - The git flow only rebases if the repo is clean. Commit or stash changes first. - After switching, run: - ```bash openclaw doctor openclaw gateway restart diff --git a/docs/help/faq.md b/docs/help/faq.md index 7947254421..191d2be1e5 100644 --- a/docs/help/faq.md +++ b/docs/help/faq.md @@ -252,12 +252,10 @@ Quick answers plus deeper troubleshooting for real-world setups (local dev, VPS, Repairs/migrates config/state + runs health checks. See [Doctor](/gateway/doctor). 7. **Gateway snapshot** - ```bash openclaw health --json openclaw health --verbose # shows the target URL + config path on errors ``` - Asks the running gateway for a full snapshot (WS-only). See [Health](/gateway/health). ## Quick start and first-run setup @@ -268,8 +266,8 @@ Use a local AI agent that can **see your machine**. That is far more effective t in Discord, because most "I'm stuck" cases are **local config or environment issues** that remote helpers cannot inspect. -- **Claude Code**: [https://www.anthropic.com/claude-code/](https://www.anthropic.com/claude-code/) -- **OpenAI Codex**: [https://openai.com/codex/](https://openai.com/codex/) +- **Claude Code**: https://www.anthropic.com/claude-code/ +- **OpenAI Codex**: https://openai.com/codex/ These tools can read the repo, run commands, inspect logs, and help fix your machine-level setup (PATH, services, permissions, auth files). Give them the **full source checkout** via @@ -287,8 +285,8 @@ Tip: ask the agent to **plan and supervise** the fix (step-by-step), then execut necessary commands. That keeps changes small and easier to audit. If you discover a real bug or fix, please file a GitHub issue or send a PR: -[https://github.com/openclaw/openclaw/issues](https://github.com/openclaw/openclaw/issues) -[https://github.com/openclaw/openclaw/pulls](https://github.com/openclaw/openclaw/pulls) +https://github.com/openclaw/openclaw/issues +https://github.com/openclaw/openclaw/pulls Start with these commands (share outputs when asking for help): @@ -392,7 +390,7 @@ and tokens stay at 0, the agent never ran. openclaw gateway restart ``` -1. Check status + auth: +2. Check status + auth: ```bash openclaw status @@ -400,7 +398,7 @@ openclaw models status openclaw logs --follow ``` -1. If it still hangs, run: +3. If it still hangs, run: ```bash openclaw doctor @@ -434,7 +432,7 @@ Related: [Migrating](/install/migrating), [Where things live on disk](/help/faq# ### Where do I see what is new in the latest version Check the GitHub changelog: -[https://github.com/openclaw/openclaw/blob/main/CHANGELOG.md](https://github.com/openclaw/openclaw/blob/main/CHANGELOG.md) +https://github.com/openclaw/openclaw/blob/main/CHANGELOG.md Newest entries are at the top. If the top section is marked **Unreleased**, the next dated section is the latest shipped version. Entries are grouped by **Highlights**, **Changes**, and @@ -445,10 +443,10 @@ section is the latest shipped version. Entries are grouped by **Highlights**, ** Some Comcast/Xfinity connections incorrectly block `docs.openclaw.ai` via Xfinity Advanced Security. Disable it or allowlist `docs.openclaw.ai`, then retry. More detail: [Troubleshooting](/help/troubleshooting#docsopenclawai-shows-an-ssl-error-comcastxfinity). -Please help us unblock it by reporting here: [https://spa.xfinity.com/check_url_status](https://spa.xfinity.com/check_url_status). +Please help us unblock it by reporting here: https://spa.xfinity.com/check_url_status. If you still can't reach the site, the docs are mirrored on GitHub: -[https://github.com/openclaw/openclaw/tree/main/docs](https://github.com/openclaw/openclaw/tree/main/docs) +https://github.com/openclaw/openclaw/tree/main/docs ### What's the difference between stable and beta @@ -462,7 +460,7 @@ that same version to `latest`**. That's why beta and stable can point at the **same version**. See what changed: -[https://github.com/openclaw/openclaw/blob/main/CHANGELOG.md](https://github.com/openclaw/openclaw/blob/main/CHANGELOG.md) +https://github.com/openclaw/openclaw/blob/main/CHANGELOG.md ### How do I install the beta version and whats the difference between beta and dev @@ -480,7 +478,7 @@ curl -fsSL --proto '=https' --tlsv1.2 https://openclaw.ai/install.sh | bash -s - ``` Windows installer (PowerShell): -[https://openclaw.ai/install.ps1](https://openclaw.ai/install.ps1) +https://openclaw.ai/install.ps1 More detail: [Development channels](/install/development-channels) and [Installer flags](/install/installer). @@ -506,7 +504,7 @@ openclaw update --channel dev This switches to the `main` branch and updates from source. -1. **Hackable install (from the installer site):** +2. **Hackable install (from the installer site):** ```bash curl -fsSL https://openclaw.ai/install.sh | bash -s -- --install-method git @@ -561,11 +559,9 @@ Two common Windows issues: - Your npm global bin folder is not on PATH. - Check the path: - ```powershell npm config get prefix ``` - - Ensure `\\bin` is on PATH (on most systems it is `%AppData%\\npm`). - Close and reopen PowerShell after updating PATH. @@ -992,7 +988,7 @@ Advantages: - **Always-on Gateway** (run on a VPS, interact from anywhere) - **Nodes** for local browser/screen/camera/exec -Showcase: [https://openclaw.ai/showcase](https://openclaw.ai/showcase) +Showcase: https://openclaw.ai/showcase ## Skills and automation @@ -1050,7 +1046,7 @@ Docs: [Cron jobs](/automation/cron-jobs), [Cron vs Heartbeat](/automation/cron-v ### How do I install skills on Linux Use **ClawHub** (CLI) or drop skills into your workspace. The macOS Skills UI isn't available on Linux. -Browse skills at [https://clawhub.com](https://clawhub.com). +Browse skills at https://clawhub.com. Install the ClawHub CLI (pick one package manager): @@ -1089,16 +1085,13 @@ Run the Gateway on Linux, pair a macOS node (menubar app), and set **Node Run Co Keep the Gateway on Linux, but make the required CLI binaries resolve to SSH wrappers that run on a Mac. Then override the skill to allow Linux so it stays eligible. 1. Create an SSH wrapper for the binary (example: `memo` for Apple Notes): - ```bash #!/usr/bin/env bash set -euo pipefail exec ssh -T user@mac-host /opt/homebrew/bin/memo "$@" ``` - 2. Put the wrapper on `PATH` on the Linux host (for example `~/bin/memo`). 3. Override the skill metadata (workspace or `~/.openclaw/skills`) to allow Linux: - ```markdown --- name: apple-notes @@ -1106,7 +1099,6 @@ Keep the Gateway on Linux, but make the required CLI binaries resolve to SSH wra metadata: { "openclaw": { "os": ["darwin", "linux"], "requires": { "bins": ["memo"] } } } --- ``` - 4. Start a new session so the skills snapshot refreshes. ### Do you have a Notion or HeyGen integration @@ -1481,7 +1473,6 @@ Typical setup: 4. Open the macOS app locally and connect in **Remote over SSH** mode (or direct tailnet) so it can register as a node. 5. Approve the node on the Gateway: - ```bash openclaw nodes pending openclaw nodes approve @@ -1619,12 +1610,10 @@ This sets your workspace and restricts who can trigger the bot. Minimal steps: 1. **Install + login on the VPS** - ```bash curl -fsSL https://tailscale.com/install.sh | sh sudo tailscale up ``` - 2. **Install + login on your Mac** - Use the Tailscale app and sign in to the same tailnet. 3. **Enable MagicDNS (recommended)** @@ -1651,7 +1640,6 @@ Recommended setup: 2. **Use the macOS app in Remote mode** (SSH target can be the tailnet hostname). The app will tunnel the Gateway port and connect as a node. 3. **Approve the node** on the gateway: - ```bash openclaw nodes pending openclaw nodes approve @@ -1714,11 +1702,9 @@ If the Gateway runs as a service (launchd/systemd), it won't inherit your shell environment. Fix by doing one of these: 1. Put the token in `~/.openclaw/.env`: - ``` COPILOT_GITHUB_TOKEN=... ``` - 2. Or enable shell import (`env.shellEnv.enabled: true`). 3. Or add it to your config `env` block (applies only if missing). @@ -1815,7 +1801,6 @@ Use one of these: or `/compact ` to guide the summary. - **Reset** (fresh session ID for the same chat key): - ``` /new /reset @@ -2086,11 +2071,9 @@ Fix checklist: 3. Use the exact model id (case-sensitive): `minimax/MiniMax-M2.1` or `minimax/MiniMax-M2.1-lightning`. 4. Run: - ```bash openclaw models list ``` - and pick from the list (or `/model list` in chat). See [MiniMax](/providers/minimax) and [Models](/concepts/models). @@ -2255,11 +2238,9 @@ can't find it in its auth store. - **If you want to use an API key instead** - Put `ANTHROPIC_API_KEY` in `~/.openclaw/.env` on the **gateway host**. - Clear any pinned order that forces a missing profile: - ```bash openclaw models auth order clear --provider anthropic ``` - - **Confirm you're running commands on the gateway host** - In remote mode, auth profiles live on the gateway machine, not your laptop. diff --git a/docs/help/troubleshooting.md b/docs/help/troubleshooting.md index 2b201c5e9a..03896a9161 100644 --- a/docs/help/troubleshooting.md +++ b/docs/help/troubleshooting.md @@ -65,7 +65,7 @@ You can also set `OPENCLAW_VERBOSE=1` instead of the flag. Some Comcast/Xfinity connections block `docs.openclaw.ai` via Xfinity Advanced Security. Disable Advanced Security or add `docs.openclaw.ai` to the allowlist, then retry. -- Xfinity Advanced Security help: [https://www.xfinity.com/support/articles/using-xfinity-xfi-advanced-security](https://www.xfinity.com/support/articles/using-xfinity-xfi-advanced-security) +- Xfinity Advanced Security help: https://www.xfinity.com/support/articles/using-xfinity-xfi-advanced-security - Quick sanity checks: try a mobile hotspot or VPN to confirm it’s ISP-level filtering ### Service says running, but RPC probe fails diff --git a/docs/hooks.md b/docs/hooks.md index dfcd61ca10..a4a3a95df1 100644 --- a/docs/hooks.md +++ b/docs/hooks.md @@ -787,7 +787,6 @@ Session reset ``` 3. List all discovered hooks: - ```bash openclaw hooks list ``` @@ -819,7 +818,6 @@ Look for missing: 2. Restart your gateway process so hooks reload. 3. Check gateway logs for errors: - ```bash ./scripts/clawlog.sh | grep hook ``` @@ -894,7 +892,6 @@ node -e "import('./path/to/handler.ts').then(console.log)" ``` 4. Verify and restart your gateway process: - ```bash openclaw hooks list # Should show: 🎯 my-hook ✓ diff --git a/docs/index.md b/docs/index.md index 60c59bb7fa..651f98440c 100644 --- a/docs/index.md +++ b/docs/index.md @@ -120,7 +120,7 @@ Need the full install and dev setup? See [Quick start](/start/quickstart). Open the browser Control UI after the Gateway starts. -- Local default: [http://127.0.0.1:18789/](http://127.0.0.1:18789/) +- Local default: http://127.0.0.1:18789/ - Remote access: [Web surfaces](/web) and [Tailscale](/gateway/tailscale)

diff --git a/docs/install/docker.md b/docs/install/docker.md index 0ad59ae54a..252bdb1ac2 100644 --- a/docs/install/docker.md +++ b/docs/install/docker.md @@ -182,14 +182,14 @@ export OPENCLAW_HOME_VOLUME="openclaw_home" ./docker-setup.sh ``` -1. **Bake system deps into the image** (repeatable + persistent): +2. **Bake system deps into the image** (repeatable + persistent): ```bash export OPENCLAW_DOCKER_APT_PACKAGES="git curl jq" ./docker-setup.sh ``` -1. **Install Playwright browsers without `npx`** (avoids npm override conflicts): +3. **Install Playwright browsers without `npx`** (avoids npm override conflicts): ```bash docker compose run --rm openclaw-cli \ @@ -199,7 +199,7 @@ docker compose run --rm openclaw-cli \ If you need Playwright to install system deps, rebuild the image with `OPENCLAW_DOCKER_APT_PACKAGES` instead of using `--with-deps` at runtime. -1. **Persist Playwright browser downloads**: +4. **Persist Playwright browser downloads**: - Set `PLAYWRIGHT_BROWSERS_PATH=/home/node/.cache/ms-playwright` in `docker-compose.yml`. diff --git a/docs/install/gcp.md b/docs/install/gcp.md index 6026fd87d5..172a32ca8f 100644 --- a/docs/install/gcp.md +++ b/docs/install/gcp.md @@ -69,7 +69,7 @@ For the generic Docker flow, see [Docker](/install/docker). **Option A: gcloud CLI** (recommended for automation) -Install from [https://cloud.google.com/sdk/docs/install](https://cloud.google.com/sdk/docs/install) +Install from https://cloud.google.com/sdk/docs/install Initialize and authenticate: @@ -80,7 +80,7 @@ gcloud auth login **Option B: Cloud Console** -All steps can be done via the web UI at [https://console.cloud.google.com](https://console.cloud.google.com) +All steps can be done via the web UI at https://console.cloud.google.com --- @@ -93,7 +93,7 @@ gcloud projects create my-openclaw-project --name="OpenClaw Gateway" gcloud config set project my-openclaw-project ``` -Enable billing at [https://console.cloud.google.com/billing](https://console.cloud.google.com/billing) (required for Compute Engine). +Enable billing at https://console.cloud.google.com/billing (required for Compute Engine). Enable the Compute Engine API: @@ -484,7 +484,6 @@ For automation or CI/CD pipelines, create a dedicated service account with minim ``` 2. Grant Compute Instance Admin role (or narrower custom role): - ```bash gcloud projects add-iam-policy-binding my-openclaw-project \ --member="serviceAccount:openclaw-deploy@my-openclaw-project.iam.gserviceaccount.com" \ @@ -493,7 +492,7 @@ For automation or CI/CD pipelines, create a dedicated service account with minim Avoid using the Owner role for automation. Use the principle of least privilege. -See [https://cloud.google.com/iam/docs/understanding-roles](https://cloud.google.com/iam/docs/understanding-roles) for IAM role details. +See https://cloud.google.com/iam/docs/understanding-roles for IAM role details. --- diff --git a/docs/install/northflank.mdx b/docs/install/northflank.mdx index d3157d72e7..8c1ff33ec4 100644 --- a/docs/install/northflank.mdx +++ b/docs/install/northflank.mdx @@ -45,7 +45,7 @@ If Telegram DMs are set to pairing, the setup wizard can approve the pairing cod ### Discord bot token -1. Go to [https://discord.com/developers/applications](https://discord.com/developers/applications) +1. Go to https://discord.com/developers/applications 2. **New Application** → choose a name 3. **Bot** → **Add Bot** 4. **Enable MESSAGE CONTENT INTENT** under Bot → Privileged Gateway Intents (required or the bot will crash on startup) diff --git a/docs/install/railway.mdx b/docs/install/railway.mdx index 73f23fbe48..b27d94203a 100644 --- a/docs/install/railway.mdx +++ b/docs/install/railway.mdx @@ -83,7 +83,7 @@ If Telegram DMs are set to pairing, the setup wizard can approve the pairing cod ### Discord bot token -1. Go to [https://discord.com/developers/applications](https://discord.com/developers/applications) +1. Go to https://discord.com/developers/applications 2. **New Application** → choose a name 3. **Bot** → **Add Bot** 4. **Enable MESSAGE CONTENT INTENT** under Bot → Privileged Gateway Intents (required or the bot will crash on startup) diff --git a/docs/install/render.mdx b/docs/install/render.mdx index ae94568702..a682d61c99 100644 --- a/docs/install/render.mdx +++ b/docs/install/render.mdx @@ -11,7 +11,13 @@ Deploy OpenClaw on Render using Infrastructure as Code. The included `render.yam ## Deploy with a Render Blueprint -[Deploy to Render](https://render.com/deploy?repo=https://github.com/openclaw/openclaw) + + Deploy to Render + Clicking this link will: diff --git a/docs/install/uninstall.md b/docs/install/uninstall.md index 16e54f4618..f5543ce1c4 100644 --- a/docs/install/uninstall.md +++ b/docs/install/uninstall.md @@ -36,13 +36,13 @@ Manual steps (same result): openclaw gateway stop ``` -1. Uninstall the gateway service (launchd/systemd/schtasks): +2. Uninstall the gateway service (launchd/systemd/schtasks): ```bash openclaw gateway uninstall ``` -1. Delete state + config: +3. Delete state + config: ```bash rm -rf "${OPENCLAW_STATE_DIR:-$HOME/.openclaw}" @@ -50,13 +50,13 @@ rm -rf "${OPENCLAW_STATE_DIR:-$HOME/.openclaw}" If you set `OPENCLAW_CONFIG_PATH` to a custom location outside the state dir, delete that file too. -1. Delete your workspace (optional, removes agent files): +4. Delete your workspace (optional, removes agent files): ```bash rm -rf ~/.openclaw/workspace ``` -1. Remove the CLI install (pick the one you used): +5. Remove the CLI install (pick the one you used): ```bash npm rm -g openclaw @@ -64,7 +64,7 @@ pnpm remove -g openclaw bun remove -g openclaw ``` -1. If you installed the macOS app: +6. If you installed the macOS app: ```bash rm -rf /Applications/OpenClaw.app diff --git a/docs/install/updating.md b/docs/install/updating.md index e463a5001f..ae4b3d1ebe 100644 --- a/docs/install/updating.md +++ b/docs/install/updating.md @@ -24,13 +24,10 @@ Notes: - Add `--no-onboard` if you don’t want the onboarding wizard to run again. - For **source installs**, use: - ```bash curl -fsSL https://openclaw.ai/install.sh | bash -s -- --install-method git --no-onboard ``` - The installer will `git pull --rebase` **only** if the repo is clean. - - For **global installs**, the script uses `npm install -g openclaw@latest` under the hood. - Legacy note: `clawdbot` remains available as a compatibility shim. @@ -228,4 +225,4 @@ git pull - Run `openclaw doctor` again and read the output carefully (it often tells you the fix). - Check: [Troubleshooting](/gateway/troubleshooting) -- Ask in Discord: [https://discord.gg/clawd](https://discord.gg/clawd) +- Ask in Discord: https://discord.gg/clawd diff --git a/docs/multi-agent-sandbox-tools.md b/docs/multi-agent-sandbox-tools.md index e7de9caf8d..a02af8d538 100644 --- a/docs/multi-agent-sandbox-tools.md +++ b/docs/multi-agent-sandbox-tools.md @@ -362,7 +362,6 @@ After configuring multi-agent sandbox and tools: - Verify the agent cannot use denied tools 4. **Monitor logs:** - ```exec tail -f "${OPENCLAW_STATE_DIR:-$HOME/.openclaw}/logs/gateway.log" | grep -E "routing|sandbox|tools" ``` diff --git a/docs/perplexity.md b/docs/perplexity.md index 178a7c3601..46c4f12b9a 100644 --- a/docs/perplexity.md +++ b/docs/perplexity.md @@ -15,12 +15,12 @@ through Perplexity’s direct API or via OpenRouter. ### Perplexity (direct) -- Base URL: [https://api.perplexity.ai](https://api.perplexity.ai) +- Base URL: https://api.perplexity.ai - Environment variable: `PERPLEXITY_API_KEY` ### OpenRouter (alternative) -- Base URL: [https://openrouter.ai/api/v1](https://openrouter.ai/api/v1) +- Base URL: https://openrouter.ai/api/v1 - Environment variable: `OPENROUTER_API_KEY` - Supports prepaid/crypto credits. diff --git a/docs/pi-dev.md b/docs/pi-dev.md index 2eeebdcc28..e850b8dc7a 100644 --- a/docs/pi-dev.md +++ b/docs/pi-dev.md @@ -66,5 +66,5 @@ If you only want to reset sessions, delete `agents//sessions/` and `age ## References -- [https://docs.openclaw.ai/testing](https://docs.openclaw.ai/testing) -- [https://docs.openclaw.ai/start/getting-started](https://docs.openclaw.ai/start/getting-started) +- https://docs.openclaw.ai/testing +- https://docs.openclaw.ai/start/getting-started diff --git a/docs/platforms/android.md b/docs/platforms/android.md index b786e1782e..6e395994b9 100644 --- a/docs/platforms/android.md +++ b/docs/platforms/android.md @@ -98,13 +98,10 @@ Pairing details: [Gateway pairing](/gateway/pairing). ### 5) Verify the node is connected - Via nodes status: - ```bash openclaw nodes status ``` - - Via Gateway: - ```bash openclaw gateway call node.list --params "{}" ``` diff --git a/docs/platforms/ios.md b/docs/platforms/ios.md index c3348f79fc..b92a7e83bc 100644 --- a/docs/platforms/ios.md +++ b/docs/platforms/ios.md @@ -33,16 +33,16 @@ Availability: internal preview. The iOS app is not publicly distributed yet. openclaw gateway --port 18789 ``` -1. In the iOS app, open Settings and pick a discovered gateway (or enable Manual Host and enter host/port). +2. In the iOS app, open Settings and pick a discovered gateway (or enable Manual Host and enter host/port). -2. Approve the pairing request on the gateway host: +3. Approve the pairing request on the gateway host: ```bash openclaw nodes pending openclaw nodes approve ``` -1. Verify connection: +4. Verify connection: ```bash openclaw nodes status diff --git a/docs/platforms/mac/dev-setup.md b/docs/platforms/mac/dev-setup.md index 8aff513488..39d3125d81 100644 --- a/docs/platforms/mac/dev-setup.md +++ b/docs/platforms/mac/dev-setup.md @@ -13,8 +13,8 @@ This guide covers the necessary steps to build and run the OpenClaw macOS applic Before building the app, ensure you have the following installed: -1. **Xcode 26.2+**: Required for Swift development. -2. **Node.js 22+ & pnpm**: Required for the gateway, CLI, and packaging scripts. +1. **Xcode 26.2+**: Required for Swift development. +2. **Node.js 22+ & pnpm**: Required for the gateway, CLI, and packaging scripts. ## 1. Install Dependencies @@ -35,7 +35,7 @@ To build the macOS app and package it into `dist/OpenClaw.app`, run: If you don't have an Apple Developer ID certificate, the script will automatically use **ad-hoc signing** (`-`). For dev run modes, signing flags, and Team ID troubleshooting, see the macOS app README: -[https://github.com/openclaw/openclaw/blob/main/apps/macos/README.md](https://github.com/openclaw/openclaw/blob/main/apps/macos/README.md) +https://github.com/openclaw/openclaw/blob/main/apps/macos/README.md > **Note**: Ad-hoc signed apps may trigger security prompts. If the app crashes immediately with "Abort trap 6", see the [Troubleshooting](#troubleshooting) section. @@ -45,9 +45,9 @@ The macOS app expects a global `openclaw` CLI install to manage background tasks **To install it (recommended):** -1. Open the OpenClaw app. -2. Go to the **General** settings tab. -3. Click **"Install CLI"**. +1. Open the OpenClaw app. +2. Go to the **General** settings tab. +3. Click **"Install CLI"**. Alternatively, install it manually: @@ -82,11 +82,9 @@ If the app crashes when you try to allow **Speech Recognition** or **Microphone* **Fix:** 1. Reset the TCC permissions: - ```bash tccutil reset All bot.molt.mac.debug ``` - 2. If that fails, change the `BUNDLE_ID` temporarily in [`scripts/package-mac-app.sh`](https://github.com/openclaw/openclaw/blob/main/scripts/package-mac-app.sh) to force a "clean slate" from macOS. ### Gateway "Starting..." indefinitely diff --git a/docs/platforms/mac/webchat.md b/docs/platforms/mac/webchat.md index ea6791ff50..5f654e1744 100644 --- a/docs/platforms/mac/webchat.md +++ b/docs/platforms/mac/webchat.md @@ -19,11 +19,9 @@ agent (with a session switcher for other sessions). - Manual: Lobster menu → “Open Chat”. - Auto‑open for testing: - ```bash dist/OpenClaw.app/Contents/MacOS/OpenClaw --webchat ``` - - Logs: `./scripts/clawlog.sh` (subsystem `bot.molt`, category `WebChatSwiftUI`). ## How it’s wired diff --git a/docs/platforms/windows.md b/docs/platforms/windows.md index d151314868..e89cae95ee 100644 --- a/docs/platforms/windows.md +++ b/docs/platforms/windows.md @@ -20,7 +20,7 @@ Native Windows companion apps are planned. - [Getting Started](/start/getting-started) (use inside WSL) - [Install & updates](/install/updating) -- Official WSL2 guide (Microsoft): [https://learn.microsoft.com/windows/wsl/install](https://learn.microsoft.com/windows/wsl/install) +- Official WSL2 guide (Microsoft): https://learn.microsoft.com/windows/wsl/install ## Gateway diff --git a/docs/plugin.md b/docs/plugin.md index aad0e58e37..50d4ffd777 100644 --- a/docs/plugin.md +++ b/docs/plugin.md @@ -25,13 +25,13 @@ Fast path: openclaw plugins list ``` -1. Install an official plugin (example: Voice Call): +2. Install an official plugin (example: Voice Call): ```bash openclaw plugins install @openclaw/voice-call ``` -1. Restart the Gateway, then configure under `plugins.entries..config`. +3. Restart the Gateway, then configure under `plugins.entries..config`. See [Voice Call](/plugins/voice-call) for a concrete example plugin. @@ -94,17 +94,17 @@ OpenClaw scans, in order: - `plugins.load.paths` (file or directory) -1. Workspace extensions +2. Workspace extensions - `/.openclaw/extensions/*.ts` - `/.openclaw/extensions/*/index.ts` -1. Global extensions +3. Global extensions - `~/.openclaw/extensions/*.ts` - `~/.openclaw/extensions/*/index.ts` -1. Bundled extensions (shipped with OpenClaw, **disabled by default**) +4. Bundled extensions (shipped with OpenClaw, **disabled by default**) - `/extensions/*` @@ -432,26 +432,26 @@ Model provider docs live under `/providers/*`. - All channel config lives under `channels.`. - Prefer `channels..accounts.` for multi‑account setups. -1. Define the channel metadata +2. Define the channel metadata - `meta.label`, `meta.selectionLabel`, `meta.docsPath`, `meta.blurb` control CLI/UI lists. - `meta.docsPath` should point at a docs page like `/channels/`. - `meta.preferOver` lets a plugin replace another channel (auto-enable prefers it). - `meta.detailLabel` and `meta.systemImage` are used by UIs for detail text/icons. -1. Implement the required adapters +3. Implement the required adapters - `config.listAccountIds` + `config.resolveAccount` - `capabilities` (chat types, media, threads, etc.) - `outbound.deliveryMode` + `outbound.sendText` (for basic send) -1. Add optional adapters as needed +4. Add optional adapters as needed - `setup` (wizard), `security` (DM policy), `status` (health/diagnostics) - `gateway` (start/stop/login), `mentions`, `threading`, `streaming` - `actions` (message actions), `commands` (native command behavior) -1. Register the channel in your plugin +5. Register the channel in your plugin - `api.registerChannel({ plugin })` diff --git a/docs/prose.md b/docs/prose.md index 7b4b8c002b..4b825c467c 100644 --- a/docs/prose.md +++ b/docs/prose.md @@ -11,7 +11,7 @@ title: "OpenProse" OpenProse is a portable, markdown-first workflow format for orchestrating AI sessions. In OpenClaw it ships as a plugin that installs an OpenProse skill pack plus a `/prose` slash command. Programs live in `.prose` files and can spawn multiple sub-agents with explicit control flow. -Official site: [https://www.prose.md](https://www.prose.md) +Official site: https://www.prose.md ## What it can do diff --git a/docs/providers/claude-max-api-proxy.md b/docs/providers/claude-max-api-proxy.md index 11b8307108..9970233121 100644 --- a/docs/providers/claude-max-api-proxy.md +++ b/docs/providers/claude-max-api-proxy.md @@ -131,9 +131,9 @@ launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.claude-max-api.plist ## Links -- **npm:** [https://www.npmjs.com/package/claude-max-api-proxy](https://www.npmjs.com/package/claude-max-api-proxy) -- **GitHub:** [https://github.com/atalovesyou/claude-max-api-proxy](https://github.com/atalovesyou/claude-max-api-proxy) -- **Issues:** [https://github.com/atalovesyou/claude-max-api-proxy/issues](https://github.com/atalovesyou/claude-max-api-proxy/issues) +- **npm:** https://www.npmjs.com/package/claude-max-api-proxy +- **GitHub:** https://github.com/atalovesyou/claude-max-api-proxy +- **Issues:** https://github.com/atalovesyou/claude-max-api-proxy/issues ## Notes diff --git a/docs/providers/cloudflare-ai-gateway.md b/docs/providers/cloudflare-ai-gateway.md index 48f69750df..392a611e70 100644 --- a/docs/providers/cloudflare-ai-gateway.md +++ b/docs/providers/cloudflare-ai-gateway.md @@ -25,7 +25,7 @@ For Anthropic models, use your Anthropic API key. openclaw onboard --auth-choice cloudflare-ai-gateway-api-key ``` -1. Set a default model: +2. Set a default model: ```json5 { diff --git a/docs/providers/deepgram.md b/docs/providers/deepgram.md index b8a1e7fced..cf32467e50 100644 --- a/docs/providers/deepgram.md +++ b/docs/providers/deepgram.md @@ -15,8 +15,8 @@ When enabled, OpenClaw uploads the audio file to Deepgram and injects the transc into the reply pipeline (`{{Transcript}}` + `[Audio]` block). This is **not streaming**; it uses the pre-recorded transcription endpoint. -Website: [https://deepgram.com](https://deepgram.com) -Docs: [https://developers.deepgram.com](https://developers.deepgram.com) +Website: https://deepgram.com +Docs: https://developers.deepgram.com ## Quick start @@ -26,7 +26,7 @@ Docs: [https://developers.deepgram.com](https://developers.deepgram.com) DEEPGRAM_API_KEY=dg_... ``` -1. Enable the provider: +2. Enable the provider: ```json5 { diff --git a/docs/providers/minimax.md b/docs/providers/minimax.md index 294388fbcc..f19478a49f 100644 --- a/docs/providers/minimax.md +++ b/docs/providers/minimax.md @@ -179,7 +179,7 @@ Use the interactive config wizard to set MiniMax without editing JSON: - Model refs are `minimax/`. - Coding Plan usage API: `https://api.minimaxi.com/v1/api/openplatform/coding_plan/remains` (requires a coding plan key). - Update pricing values in `models.json` if you need exact cost tracking. -- Referral link for MiniMax Coding Plan (10% off): [https://platform.minimax.io/subscribe/coding-plan?code=DbXJTRClnb&source=link](https://platform.minimax.io/subscribe/coding-plan?code=DbXJTRClnb&source=link) +- Referral link for MiniMax Coding Plan (10% off): https://platform.minimax.io/subscribe/coding-plan?code=DbXJTRClnb&source=link - See [/concepts/model-providers](/concepts/model-providers) for provider rules. - Use `openclaw models list` and `openclaw models set minimax/MiniMax-M2.1` to switch. diff --git a/docs/providers/moonshot.md b/docs/providers/moonshot.md index 0a46c90674..6e6ec52959 100644 --- a/docs/providers/moonshot.md +++ b/docs/providers/moonshot.md @@ -15,14 +15,14 @@ Kimi Coding with `kimi-coding/k2p5`. Current Kimi K2 model IDs: -{/_moonshot-kimi-k2-ids:start_/ && null} +{/_ moonshot-kimi-k2-ids:start _/ && null} - `kimi-k2.5` - `kimi-k2-0905-preview` - `kimi-k2-turbo-preview` - `kimi-k2-thinking` - `kimi-k2-thinking-turbo` - {/_moonshot-kimi-k2-ids:end_/ && null} + {/_ moonshot-kimi-k2-ids:end _/ && null} ```bash openclaw onboard --auth-choice moonshot-api-key diff --git a/docs/providers/ollama.md b/docs/providers/ollama.md index cd39e9396c..9d2f177bf5 100644 --- a/docs/providers/ollama.md +++ b/docs/providers/ollama.md @@ -12,7 +12,7 @@ Ollama is a local LLM runtime that makes it easy to run open-source models on yo ## Quick start -1. Install Ollama: [https://ollama.ai](https://ollama.ai) +1. Install Ollama: https://ollama.ai 2. Pull a model: @@ -26,7 +26,7 @@ ollama pull qwen2.5-coder:32b ollama pull deepseek-r1:32b ``` -1. Enable Ollama for OpenClaw (any value works; Ollama doesn't require a real key): +3. Enable Ollama for OpenClaw (any value works; Ollama doesn't require a real key): ```bash # Set environment variable @@ -36,7 +36,7 @@ export OLLAMA_API_KEY="ollama-local" openclaw config set models.providers.ollama.apiKey "ollama-local" ``` -1. Use Ollama models: +4. Use Ollama models: ```json5 { diff --git a/docs/providers/vercel-ai-gateway.md b/docs/providers/vercel-ai-gateway.md index eb6ceef253..726a6040fc 100644 --- a/docs/providers/vercel-ai-gateway.md +++ b/docs/providers/vercel-ai-gateway.md @@ -22,7 +22,7 @@ The [Vercel AI Gateway](https://vercel.com/ai-gateway) provides a unified API to openclaw onboard --auth-choice ai-gateway-api-key ``` -1. Set a default model: +2. Set a default model: ```json5 { diff --git a/docs/reference/AGENTS.default.md b/docs/reference/AGENTS.default.md index 2f7cd1fe83..bc0dcde686 100644 --- a/docs/reference/AGENTS.default.md +++ b/docs/reference/AGENTS.default.md @@ -17,7 +17,7 @@ OpenClaw uses a dedicated workspace directory for the agent. Default: `~/.opencl mkdir -p ~/.openclaw/workspace ``` -1. Copy the default workspace templates into the workspace: +2. Copy the default workspace templates into the workspace: ```bash cp docs/reference/templates/AGENTS.md ~/.openclaw/workspace/AGENTS.md @@ -25,13 +25,13 @@ cp docs/reference/templates/SOUL.md ~/.openclaw/workspace/SOUL.md cp docs/reference/templates/TOOLS.md ~/.openclaw/workspace/TOOLS.md ``` -1. Optional: if you want the personal assistant skill roster, replace AGENTS.md with this file: +3. Optional: if you want the personal assistant skill roster, replace AGENTS.md with this file: ```bash cp docs/reference/AGENTS.default.md ~/.openclaw/workspace/AGENTS.md ``` -1. Optional: choose a different workspace by setting `agents.defaults.workspace` (supports `~`): +4. Optional: choose a different workspace by setting `agents.defaults.workspace` (supports `~`): ```json5 { diff --git a/docs/reference/RELEASING.md b/docs/reference/RELEASING.md index 1d4c9af797..23670a1339 100644 --- a/docs/reference/RELEASING.md +++ b/docs/reference/RELEASING.md @@ -26,7 +26,7 @@ When the operator says “release”, immediately do this preflight (no extra qu - [ ] Confirm package metadata (name, description, repository, keywords, license) and `bin` map points to [`openclaw.mjs`](https://github.com/openclaw/openclaw/blob/main/openclaw.mjs) for `openclaw`. - [ ] If dependencies changed, run `pnpm install` so `pnpm-lock.yaml` is current. -1. **Build & artifacts** +2. **Build & artifacts** - [ ] If A2UI inputs changed, run `pnpm canvas:a2ui:bundle` and commit any updated [`src/canvas-host/a2ui/a2ui.bundle.js`](https://github.com/openclaw/openclaw/blob/main/src/canvas-host/a2ui/a2ui.bundle.js). - [ ] `pnpm run build` (regenerates `dist/`). @@ -34,12 +34,12 @@ When the operator says “release”, immediately do this preflight (no extra qu - [ ] Confirm `dist/build-info.json` exists and includes the expected `commit` hash (CLI banner uses this for npm installs). - [ ] Optional: `npm pack --pack-destination /tmp` after the build; inspect the tarball contents and keep it handy for the GitHub release (do **not** commit it). -1. **Changelog & docs** +3. **Changelog & docs** - [ ] Update `CHANGELOG.md` with user-facing highlights (create the file if missing); keep entries strictly descending by version. - [ ] Ensure README examples/flags match current CLI behavior (notably new commands or options). -1. **Validation** +4. **Validation** - [ ] `pnpm build` - [ ] `pnpm check` @@ -54,7 +54,7 @@ When the operator says “release”, immediately do this preflight (no extra qu - `pnpm test:install:e2e` (requires both keys; runs both providers) - [ ] (Optional) Spot-check the web gateway if your changes affect send/receive paths. -1. **macOS app (Sparkle)** +5. **macOS app (Sparkle)** - [ ] Build + sign the macOS app, then zip it for distribution. - [ ] Generate the Sparkle appcast (HTML notes via [`scripts/make_appcast.sh`](https://github.com/openclaw/openclaw/blob/main/scripts/make_appcast.sh)) and update `appcast.xml`. @@ -63,7 +63,7 @@ When the operator says “release”, immediately do this preflight (no extra qu - `APP_BUILD` must be numeric + monotonic (no `-beta`) so Sparkle compares versions correctly. - If notarizing, use the `openclaw-notary` keychain profile created from App Store Connect API env vars (see [macOS release](/platforms/mac/release)). -1. **Publish (npm)** +6. **Publish (npm)** - [ ] Confirm git status is clean; commit and push as needed. - [ ] `npm login` (verify 2FA) if needed. @@ -80,7 +80,7 @@ When the operator says “release”, immediately do this preflight (no extra qu - **Tag needs repointing after a late fix**: force-update and push the tag, then ensure the GitHub release assets still match: - `git tag -f vX.Y.Z && git push -f origin vX.Y.Z` -1. **GitHub release + appcast** +7. **GitHub release + appcast** - [ ] Tag and push: `git tag vX.Y.Z && git push origin vX.Y.Z` (or `git push --tags`). - [ ] Create/refresh the GitHub release for `vX.Y.Z` with **title `openclaw X.Y.Z`** (not just the tag); body should include the **full** changelog section for that version (Highlights + Changes + Fixes), inline (no bare links), and **must not repeat the title inside the body**. diff --git a/docs/reference/credits.md b/docs/reference/credits.md index 67e85ca72e..e9ba9bca39 100644 --- a/docs/reference/credits.md +++ b/docs/reference/credits.md @@ -17,8 +17,8 @@ OpenClaw = CLAW + TARDIS, because every space lobster needs a time and space mac ## Core contributors -- **Maxim Vovshin** (@Hyaxia, [36747317+Hyaxia@users.noreply.github.com](mailto:36747317+Hyaxia@users.noreply.github.com)) - Blogwatcher skill -- **Nacho Iacovino** (@nachoiacovino, [nacho.iacovino@gmail.com](mailto:nacho.iacovino@gmail.com)) - Location parsing (Telegram and WhatsApp) +- **Maxim Vovshin** (@Hyaxia, 36747317+Hyaxia@users.noreply.github.com) - Blogwatcher skill +- **Nacho Iacovino** (@nachoiacovino, nacho.iacovino@gmail.com) - Location parsing (Telegram and WhatsApp) ## License diff --git a/docs/reference/device-models.md b/docs/reference/device-models.md index 3538562fe7..00d2b9cf77 100644 --- a/docs/reference/device-models.md +++ b/docs/reference/device-models.md @@ -39,8 +39,8 @@ curl -fsSL "https://raw.githubusercontent.com/kyle-seongwoo-jun/apple-device-ide -o apps/macos/Sources/OpenClaw/Resources/DeviceModels/mac-device-identifiers.json ``` -1. Ensure `apps/macos/Sources/OpenClaw/Resources/DeviceModels/LICENSE.apple-device-identifiers.txt` still matches upstream (replace it if the upstream license changes). -2. Verify the macOS app builds cleanly (no warnings): +4. Ensure `apps/macos/Sources/OpenClaw/Resources/DeviceModels/LICENSE.apple-device-identifiers.txt` still matches upstream (replace it if the upstream license changes). +5. Verify the macOS app builds cleanly (no warnings): ```bash swift build --package-path apps/macos diff --git a/docs/reference/templates/AGENTS.md b/docs/reference/templates/AGENTS.md index 46967ff084..956b1195ac 100644 --- a/docs/reference/templates/AGENTS.md +++ b/docs/reference/templates/AGENTS.md @@ -42,7 +42,7 @@ Capture what matters. Decisions, context, things to remember. Skip the secrets u - This is your curated memory — the distilled essence, not raw logs - Over time, review your daily files and update MEMORY.md with what's worth keeping -### 📝 Write It Down - No "Mental Notes" +### 📝 Write It Down - No "Mental Notes"! - **Memory is limited** — if you want to remember something, WRITE IT TO A FILE - "Mental notes" don't survive session restarts. Files do. @@ -76,7 +76,7 @@ Capture what matters. Decisions, context, things to remember. Skip the secrets u You have access to your human's stuff. That doesn't mean you _share_ their stuff. In groups, you're a participant — not their voice, not their proxy. Think before you speak. -### 💬 Know When to Speak +### 💬 Know When to Speak! In group chats where you receive every message, be **smart about when to contribute**: @@ -102,7 +102,7 @@ In group chats where you receive every message, be **smart about when to contrib Participate, don't dominate. -### 😊 React Like a Human +### 😊 React Like a Human! On platforms that support reactions (Discord, Slack), use emoji reactions naturally: @@ -131,7 +131,7 @@ Skills provide your tools. When you need one, check its `SKILL.md`. Keep local n - **Discord links:** Wrap multiple links in `<>` to suppress embeds: `` - **WhatsApp:** No headers — use **bold** or CAPS for emphasis -## 💓 Heartbeats - Be Proactive +## 💓 Heartbeats - Be Proactive! When you receive a heartbeat poll (message matches the configured heartbeat prompt), don't just reply `HEARTBEAT_OK` every time. Use heartbeats productively! diff --git a/docs/reference/templates/HEARTBEAT.md b/docs/reference/templates/HEARTBEAT.md index 09d04b4498..5ee0d711f4 100644 --- a/docs/reference/templates/HEARTBEAT.md +++ b/docs/reference/templates/HEARTBEAT.md @@ -6,6 +6,6 @@ read_when: # HEARTBEAT.md -# Keep this file empty (or with only comments) to skip heartbeat API calls +# Keep this file empty (or with only comments) to skip heartbeat API calls. -# Add tasks below when you want the agent to check something periodically +# Add tasks below when you want the agent to check something periodically. diff --git a/docs/start/openclaw.md b/docs/start/openclaw.md index e2b07a28e8..c5a4196351 100644 --- a/docs/start/openclaw.md +++ b/docs/start/openclaw.md @@ -58,13 +58,13 @@ If you link your personal WhatsApp to OpenClaw, every message to you becomes “ openclaw channels login ``` -1. Start the Gateway (leave it running): +2. Start the Gateway (leave it running): ```bash openclaw gateway --port 18789 ``` -1. Put a minimal config in `~/.openclaw/openclaw.json`: +3. Put a minimal config in `~/.openclaw/openclaw.json`: ```json5 { diff --git a/docs/start/setup.md b/docs/start/setup.md index f9d6dc9a04..ee50e02afd 100644 --- a/docs/start/setup.md +++ b/docs/start/setup.md @@ -67,7 +67,7 @@ node openclaw.mjs gateway --port 18789 --verbose openclaw channels login ``` -1. Sanity check: +5. Sanity check: ```bash openclaw health diff --git a/docs/token-use.md b/docs/token-use.md index 16b0fe9618..7f8dcb7fbb 100644 --- a/docs/token-use.md +++ b/docs/token-use.md @@ -85,7 +85,7 @@ re-caching the full prompt, reducing cache write costs. For Anthropic API pricing, cache reads are significantly cheaper than input tokens, while cache writes are billed at a higher multiplier. See Anthropic’s prompt caching pricing for the latest rates and TTL multipliers: -[https://docs.anthropic.com/docs/build-with-claude/prompt-caching](https://docs.anthropic.com/docs/build-with-claude/prompt-caching) +https://docs.anthropic.com/docs/build-with-claude/prompt-caching ### Example: keep 1h cache warm with heartbeat diff --git a/docs/tools/browser-linux-troubleshooting.md b/docs/tools/browser-linux-troubleshooting.md index fdd4755603..01e6cbc3ff 100644 --- a/docs/tools/browser-linux-troubleshooting.md +++ b/docs/tools/browser-linux-troubleshooting.md @@ -67,7 +67,7 @@ If you must use snap Chromium, configure OpenClaw to attach to a manually-starte } ``` -1. Start Chromium manually: +2. Start Chromium manually: ```bash chromium-browser --headless --no-sandbox --disable-gpu \ @@ -76,7 +76,7 @@ chromium-browser --headless --no-sandbox --disable-gpu \ about:blank & ``` -1. Optionally create a systemd user service to auto-start Chrome: +3. Optionally create a systemd user service to auto-start Chrome: ```ini # ~/.config/systemd/user/openclaw-browser.service diff --git a/docs/tools/browser-login.md b/docs/tools/browser-login.md index a3c7a4615f..dcfb5ceb48 100644 --- a/docs/tools/browser-login.md +++ b/docs/tools/browser-login.md @@ -35,7 +35,7 @@ If you have multiple profiles, pass `--browser-profile ` (the default is ` ## X/Twitter: recommended flow - **Read/search/threads:** use the **bird** CLI skill (no browser, stable). - - Repo: [https://github.com/steipete/bird](https://github.com/steipete/bird) + - Repo: https://github.com/steipete/bird - **Post updates:** use the **host** browser (manual login). ## Sandboxing + host browser access diff --git a/docs/tools/browser.md b/docs/tools/browser.md index d4c12e2397..848977d1e6 100644 --- a/docs/tools/browser.md +++ b/docs/tools/browser.md @@ -252,7 +252,7 @@ openclaw browser extension install - “Load unpacked” → select the directory printed by `openclaw browser extension path` - Pin the extension, then click it on the tab you want to control (badge shows `ON`). -1. Use it: +2. Use it: - CLI: `openclaw browser --browser-profile chrome tabs` - Agent tool: `browser` with `profile="chrome"` diff --git a/docs/tools/chrome-extension.md b/docs/tools/chrome-extension.md index 0a1a848de0..4d49c835ed 100644 --- a/docs/tools/chrome-extension.md +++ b/docs/tools/chrome-extension.md @@ -31,18 +31,18 @@ OpenClaw then controls the attached tab through the normal `browser` tool surfac openclaw browser extension install ``` -1. Print the installed extension directory path: +2. Print the installed extension directory path: ```bash openclaw browser extension path ``` -1. Chrome → `chrome://extensions` +3. Chrome → `chrome://extensions` - Enable “Developer mode” - “Load unpacked” → select the directory printed above -1. Pin the extension. +4. Pin the extension. ## Updates (no build step) diff --git a/docs/tools/llm-task.md b/docs/tools/llm-task.md index 2b1909f0c7..16ae39e5e2 100644 --- a/docs/tools/llm-task.md +++ b/docs/tools/llm-task.md @@ -28,7 +28,7 @@ without writing custom OpenClaw code for each workflow. } ``` -1. Allowlist the tool (it is registered with `optional: true`): +2. Allowlist the tool (it is registered with `optional: true`): ```json { diff --git a/docs/tools/lobster.md b/docs/tools/lobster.md index ed9ed1fb27..62ef213575 100644 --- a/docs/tools/lobster.md +++ b/docs/tools/lobster.md @@ -338,5 +338,5 @@ OpenProse pairs well with Lobster: use `/prose` to orchestrate multi-agent prep, One public example: a “second brain” CLI + Lobster pipelines that manage three Markdown vaults (personal, partner, shared). The CLI emits JSON for stats, inbox listings, and stale scans; Lobster chains those commands into workflows like `weekly-review`, `inbox-triage`, `memory-consolidation`, and `shared-task-sync`, each with approval gates. AI handles judgment (categorization) when available and falls back to deterministic rules when not. -- Thread: [https://x.com/plattenschieber/status/2014508656335770033](https://x.com/plattenschieber/status/2014508656335770033) -- Repo: [https://github.com/bloomedai/brain-cli](https://github.com/bloomedai/brain-cli) +- Thread: https://x.com/plattenschieber/status/2014508656335770033 +- Repo: https://github.com/bloomedai/brain-cli diff --git a/docs/tools/skills.md b/docs/tools/skills.md index b8038ee0fa..b4a142e334 100644 --- a/docs/tools/skills.md +++ b/docs/tools/skills.md @@ -50,7 +50,7 @@ tool surface those skills teach. ## ClawHub (install + sync) ClawHub is the public skills registry for OpenClaw. Browse at -[https://clawhub.com](https://clawhub.com). Use it to discover, install, update, and back up skills. +https://clawhub.com. Use it to discover, install, update, and back up skills. Full guide: [ClawHub](/tools/clawhub). Common flows: @@ -295,6 +295,6 @@ See [Skills config](/tools/skills-config) for the full configuration schema. ## Looking for more skills? -Browse [https://clawhub.com](https://clawhub.com). +Browse https://clawhub.com. --- diff --git a/docs/tools/web.md b/docs/tools/web.md index c22bc1707e..4a3c23841c 100644 --- a/docs/tools/web.md +++ b/docs/tools/web.md @@ -71,7 +71,7 @@ Example: switch to Perplexity Sonar (direct API): ## Getting a Brave API key -1. Create a Brave Search API account at [https://brave.com/search/api/](https://brave.com/search/api/) +1. Create a Brave Search API account at https://brave.com/search/api/ 2. In the dashboard, choose the **Data for Search** plan (not “Data for AI”) and generate an API key. 3. Run `openclaw configure --section web` to store the key in config (recommended), or set `BRAVE_API_KEY` in your environment. @@ -95,7 +95,7 @@ crypto/prepaid). ### Getting an OpenRouter API key -1. Create an account at [https://openrouter.ai/](https://openrouter.ai/) +1. Create an account at https://openrouter.ai/ 2. Add credits (supports crypto, prepaid, or credit card) 3. Generate an API key in your account settings diff --git a/docs/tui.md b/docs/tui.md index 6ae2f14f11..8398cedfe1 100644 --- a/docs/tui.md +++ b/docs/tui.md @@ -16,13 +16,13 @@ title: "TUI" openclaw gateway ``` -1. Open the TUI. +2. Open the TUI. ```bash openclaw tui ``` -1. Type a message and press Enter. +3. Type a message and press Enter. Remote Gateway: diff --git a/docs/vps.md b/docs/vps.md index f0b1f7d777..dedccee4b7 100644 --- a/docs/vps.md +++ b/docs/vps.md @@ -21,7 +21,7 @@ deployments work at a high level. - **GCP (Compute Engine)**: [GCP](/install/gcp) - **exe.dev** (VM + HTTPS proxy): [exe.dev](/install/exe-dev) - **AWS (EC2/Lightsail/free tier)**: works well too. Video guide: - [https://x.com/techfrenAJ/status/2014934471095812547](https://x.com/techfrenAJ/status/2014934471095812547) + https://x.com/techfrenAJ/status/2014934471095812547 ## How cloud setups work diff --git a/docs/web/control-ui.md b/docs/web/control-ui.md index 233a67c48b..640340f17c 100644 --- a/docs/web/control-ui.md +++ b/docs/web/control-ui.md @@ -19,7 +19,7 @@ It speaks **directly to the Gateway WebSocket** on the same port. If the Gateway is running on the same computer, open: -- [http://127.0.0.1:18789/](http://127.0.0.1:18789/) (or [http://localhost:18789/](http://localhost:18789/)) +- http://127.0.0.1:18789/ (or http://localhost:18789/) If the page fails to load, start the Gateway first: `openclaw gateway`. diff --git a/docs/web/dashboard.md b/docs/web/dashboard.md index 5c33455f05..d68456821d 100644 --- a/docs/web/dashboard.md +++ b/docs/web/dashboard.md @@ -12,7 +12,7 @@ The Gateway dashboard is the browser Control UI served at `/` by default Quick open (local Gateway): -- [http://127.0.0.1:18789/](http://127.0.0.1:18789/) (or [http://localhost:18789/](http://localhost:18789/)) +- http://127.0.0.1:18789/ (or http://localhost:18789/) Key references: