* Revert "fix(gateway): set explicit chat timeouts for mesh gateway calls" This reverts commitc529e6005a. * Revert "fix: capture init script exit codes instead of swallowing via pipe" This reverts commit8b14052ebe. * Revert "feat(docker): add init script support via /openclaw-init.d/" This reverts commit53af9f7437. * Revert "Agents: improve Windows scaffold helpers for venture studio" This reverts commitb6d934c2c7. * chore: Fix types in tests 1/N. * chore: Fix types in tests 2/N. * Revert "fix: remove stderr suppression so install failures are visible in build logs" This reverts commit717caa97fb. * Revert "fix(docker): ensure memory-lancedb deps installed in Docker image" This reverts commit2ab6313d99. * Revert "fix: add windowsHide: true to spawn in runCommandWithTimeout" This reverts commit32c66aff49. * Revert "Onboarding: fix webchat URL loopback and canonical session" This reverts commit59e0e7e4ff. * Revert "feat(linq): add interactive onboarding adapter" This reverts commitb91e43714b. * Revert "feat: add Linq channel — real iMessage via API, no Mac required" This reverts commitd4a142fd8f. * docs: clarify discord proxy scope for startup REST calls * Revert "fix: flatten remaining anyOf/oneOf in Gemini schema cleaning" This reverts commit06b961b037. * Revert "fix: session-memory hook finds previous session file after /new/reset" This reverts commitd6acd71576. * Revert "fix: respect OPENCLAW_HOME for isolated gateway instances" This reverts commit34b18ea9db. * fix(process): harden graceful kill-tree cancellation semantics * fix(slack): scope attachment extraction to forwarded shares * docs(changelog): note process kill-tree hotfix * docs(changelog): note slack forwarded attachment hotfix * fix(session-memory): harden reset transcript recovery * revert(telegram): undo accidental merge of PR #18601 * fix(ui): preserve locale bootstrap and trusted-proxy overview behavior * fix(scripts): harden Windows UI spawn behavior * fix(slack): validate interaction payloads and handle malformed actions * fix(mattermost): harden react remove flag parsing * docs(changelog): record PR 18608 fixups * fix(heartbeat): bound responsePrefix strip for ack detection * chore: Fix types in tests 3/N. * chore: chore: Fix types in tests 4/N. * chore: Fix types in tests 5/N. * chore: Fix types in tests 6/N. * chore: Format files. * chore: Fix types that were broken due to reverts. * chore: Cleanup unused vars that were leftover from the reverts. * fix(actions): layer per-account gate fallback * fix(subagents): pass group context in /subagents spawn * fix(failover): align abort timeout detection and regressions * fix(models): sync auth-profiles before availability checks * fix(ui): correct usage range totals and muted styles * Revert "feat: show transcript file size in session status" This reverts commit15dd2cda20. * revert(doctor): undo accidental merge of PR #18591 * fix(agents): align session lock hold budget with run timeouts * Revert "fix: resolve #12770 - update Antigravity default model and trim leading whitespace in BlueBubbles replies" This reverts commite179d453c7. * revert(tools): undo accidental merge of PR #18584 * revert(tools): finish rollback of PR #18584 * chore: Fix Slack test. * revert: remove accidentally merged video-quote-finder skill (#18550) * revert: accidental merge of OC-09 sandbox env sanitization change * fix(doctor): move forced exit to top-level command * chore: Fix types in tests 7/N. * chore: Fix types in tests 8/N. * chore: Fix types in tests 9/N. * chore: Fix types in tests 10/N. * chore: Fix types in tests 11/N. * chore: chore: Fix types in tests 12/N. * chore: Fix type errors from reverts. * fix(gateway): remove watch-mode build/start race (#18782) * fix(doctor): repair googlechat open dm wildcard auto-fix * test(extensions): cast fetch mocks to satisfy tsgo * fix(gateway): harden channel health monitor recovery * fix(reply): track messaging media aliases for dedupe * refactor(plugins): split before-agent hooks by model and prompt phases * revert(telegram): undo accidental merge of PR #18564 * fix(agents): restore multi-image image tool schema contract * chore: Format files. * fix(ui): gate sessions refresh on successful delete * revert(docs): undo accidental merge of #18516 * revert(exec): undo accidental merge of PR #18521 * docs(cron): clarify webhook posting summary condition * fix(gateway): preserve chat.history context under hard caps * chore: Fix types in tests 13/N. * chore: Fix types in tests 14/N. * chore: Fix types in tests 15/N. * chore: Fix types in tests 16/N. * chore: Fix types in tests 17/N. * chore: Fix types in tests 18/N. * chore: Format files. * revert(sandbox): revert SHA-1 slug restoration * test(session): cover stale threadId fallback * test(status): cover token summary variants * test(telegram): cover getFile file-too-big errors * test(voice-call): cover stream disconnect auto-end * chore(format): fix test import order * test(agents): cover tool result media placeholders * chore: chore: Fix types in tests 19/N. * chore: Fix types in tests 20/N. * chore: Fix types in tests 21/N. * chore: Fix types in tests 22/N. * chore: Fix types in tests 23/N. * docs(voice-call): document stale call reaper config * fix(doctor): audit env-only gateway tokens * fix(sessions): purge deleted transcript archives * test(docker): cover browser install build arg * revert(gateway): restore loopback auth setup * revert(voice-call): undo cached greeting note * revert(voice-call): undo oxfmt formatting * revert(voice-call): undo oxfmt formatting pass * revert(voice-call): remove cached inbound greeting * test: stabilize infra tests * fix(subagents): harden announce retry guards * Revert "fix(whatsapp): allow per-message link preview override\n\nWhatsApp messages default to enabling link previews for URLs. This adds\nsupport for overriding this behavior per-message via the \nparameter (e.g. from tool options), consistent with Telegram.\n\nFix: Updated internal WhatsApp Web API layers to pass option\ndown to Baileys ." This reverts commit1bef2fc68b. * fix(telegram): clear offsets on token change * test(agents): cover exec non-zero exits * CI: use self-hosted for labeler/automation * Revert "channels: migrate extension account listing to factory" This reverts commitd24340d75b. * chore(format) * chore: wtf. * chore: Fix types. * chore: Fix types in tests 24/N. * chore: Fix types in tests 25/N. * chore: Fix types in tests 26/N. * chore: Fix types in tests 27/N. * chore: Fix types in tests 28/N. * chore: Fix types in tests 29/N. * chore: Fix types in tests 30/N. * chore: Fix types in tests 31/N. * chore: Fix types in tests 32/N. * fix(telegram): add initial message debounce for better push notifications (#18147) Merged via /review-pr -> /prepare-pr -> /merge-pr. Prepared head SHA: 5e2285b6a03943a483993b540f86a0fa49d7de39 Co-authored-by: Marvae <11957602+Marvae@users.noreply.github.com> Co-authored-by: obviyus <22031114+obviyus@users.noreply.github.com> Reviewed-by: @obviyus * style(telegram): format dispatch files * chore: Fix types in tests 33/N. * chore: Fix types in tests 34/N. * chore: Fix types in tests 35/N. * chore: Fix types in tests 36/N. * chore: Fix types in tests 37/N. * chore: Fix types in tests 38/N. * chore: Fix types in tests 39/N. * chore: Fix types in tests 40/N. * chore: Fix types in tests 41/N. * chore: Fix types in tests 42/N. * chore: Fix types in tests 43/N. * chore: Fix types in tests 44/N. * chore: Fix types in tests 45/N. * chore: Typecheck tests. * chore: Fix broken test. * chore: Fix hanging test. * fix(telegram): avoid duplicate preview bubbles in partial stream mode (#18956) Merged via /review-pr -> /prepare-pr -> /merge-pr. Prepared head SHA: cf4eca71d46e0c5ef1ec46af90f978b3d454c34a Co-authored-by: obviyus <22031114+obviyus@users.noreply.github.com> Co-authored-by: obviyus <22031114+obviyus@users.noreply.github.com> Reviewed-by: @obviyus * fix: before_tool_call hook double-fires with abort signal (#16852) Merged via /review-pr -> /prepare-pr -> /merge-pr. Prepared head SHA: 6269d617f3ac811e03cd29d915f94657da922ba1 Co-authored-by: sreuter <550246+sreuter@users.noreply.github.com> Co-authored-by: obviyus <22031114+obviyus@users.noreply.github.com> Reviewed-by: @obviyus * Revert "Default Telegram polls to public" This reverts commitc43e95e011. * Revert "Fix Telegram poll action wiring" This reverts commit556b531a14. * Revert "Add Telegram polls action to config typing" This reverts commit5cbfaf5cc7. * Revert "fix(telegram): wire sendPollTelegram into channel action handler (#16977)" This reverts commit7bb9a7dcfc. * CI: remove formal models conformance workflow (#19007) * fix: preserve telegram dm topic thread ids * style: drop aidev-note prefix in telegram comments * test: pass extensionContext in abort dedupe e2e * fix: align tool execute arg parsing for hooks * test: type telegram action mock passthrough args * Configure: make model picker allowlist searchable * Configure: improve searchable model picker token matching * Docs: add screenshot showing model picker usability issue * fix: searchable model picker in configure (#19010) (thanks @bjesuiter) * fix(extensions): revert openai codex auth plugin (PR #18009) * feat(telegram): add channel_post support for bot-to-bot communication (#17857) Merged via /review-pr -> /prepare-pr -> /merge-pr. Prepared head SHA: 27a343cd4d9c778a6017ff666d8285ae60256bf4 Co-authored-by: theSamPadilla <35386211+theSamPadilla@users.noreply.github.com> Co-authored-by: obviyus <22031114+obviyus@users.noreply.github.com> Reviewed-by: @obviyus * Revert "fix: handle forum/topics in Telegram DM thread routing (#17980)" This reverts commite20b87f1ba. * Revert: undo #17974 README change * voice-call: harden closed-loop turn loop and transcript routing (#19140) Merged via /review-pr -> /prepare-pr -> /merge-pr. Prepared head SHA: 14a3edb00572b20348f839bbafa56ca826cee362 Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com> Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com> Reviewed-by: @mbelinky * iOS onboarding: stop auth step-3 retry loop churn (#19153) Merged via /review-pr -> /prepare-pr -> /merge-pr. Prepared head SHA: a38ec42bdd4cf1bf5743ecd3c1d1f2bcceea91e0 Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com> Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com> Reviewed-by: @mbelinky * Revert: fully roll back #17974 zh-cn UI README * chore(subagents): add regression coverage and changelog * fix(daemon): scope token drift warnings * test(web): fix baileys mock typing * test(cron): cover webhook session rollover overrides * docs(changelog): note webhook session reuse fix * fix(discord): normalize command allowFrom prefixes * fix(cli): honor update restart overrides * fix(cron): add spin-loop regression coverage * test(gateway): cover trusted proxy trimming * test(discord): cover audioAsVoice replies * test(feishu): cover post mentions for other users * fix(discord): preserve DM lastRoute user target * Revert "fix(browser): track original port mapping for EADDRINUSE fallback" This reverts commit8e55503d77. * Revert "fix(browser): handle EADDRINUSE with automatic port fallback" This reverts commit0e6daa2e6e. * test(discord): fix mock call arg typing * Revert: fully roll back #17986 templates * test: add fetch mock helper and reaction coverage * CLI: approve latest pending device request * docs(readme): remove Android install link * revert(agents): remove llms.txt discovery prompt (#19192) * fix(ui): revert PR #18093 directive tags (#19188) * test(discord): cover auto-thread skip types * test(update): cover restart gating * docs(zai): document tool_stream defaults * revert: per-model thinkingDefault override (#19195) Merged via /review-pr -> /prepare-pr -> /merge-pr. Prepared head SHA: fe2c59e222a71086864f8abfae05d2da03ad4066 Co-authored-by: sebslight <19554889+sebslight@users.noreply.github.com> Co-authored-by: sebslight <19554889+sebslight@users.noreply.github.com> Reviewed-by: @sebslight * fix(gateway): make stale token cleanup non-fatal * Agents: add before_message_write persistence regression tests * fix(mattermost): surface reactions support * Tests: fix fetch mock typings for type-aware checks * revert: fix models set catalog validation (#19194) Merged via /review-pr -> /prepare-pr -> /merge-pr. Prepared head SHA: 7e3b2ff7afe052097c4414fc64d7e66191e8fcc3 Co-authored-by: sebslight <19554889+sebslight@users.noreply.github.com> Co-authored-by: sebslight <19554889+sebslight@users.noreply.github.com> Reviewed-by: @sebslight * test: cover cron telemetry and typed fetch mocks * revert(agents): revert base64 image validation (#19221) * docs(cli): add components send example * test(sessions): add delivery info regression coverage * fix(daemon): guard preferred node selection * test(auto-reply): cover sender_id metadata * revert: PR 18288 accidental merge (#19224) Merged via /review-pr -> /prepare-pr -> /merge-pr. Prepared head SHA: 3cda31578ccf71365d5815a8374922e835efff0e Co-authored-by: sebslight <19554889+sebslight@users.noreply.github.com> Co-authored-by: sebslight <19554889+sebslight@users.noreply.github.com> Reviewed-by: @sebslight * test(telegram): cover autoSelectFamily env precedence * test(cron): add model fallback regression coverage * test(release): add appcast regression coverage * docs(changelog): remove revert entries * docs: add maintainer application section * docs: refine maintainer application guidance * docs: add vision doc and link from README * docs: add community plugins guide * Update auto-response message for third-party extensions * update my contributing list * iOS: use operator session for ChatSheet RPCs (#19320) Merged via /review-pr -> /prepare-pr -> /merge-pr. Prepared head SHA: 0753b3a1a22a1d23e871d210e317279627f9fc0f Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com> Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com> Reviewed-by: @mbelinky * fix: sanitize native command names for Telegram API (#19257) Merged via /review-pr -> /prepare-pr -> /merge-pr. Prepared head SHA: b608be348888505b23bb4b2f1c8c42058a28e64e Co-authored-by: akramcodez <179671552+akramcodez@users.noreply.github.com> Co-authored-by: obviyus <22031114+obviyus@users.noreply.github.com> Reviewed-by: @obviyus * docs(slack): add assistant:write requirement for typing status * chore: document sessions_spawn response note and subagent context prefix * feat(ios): auto-select local signing team (#18421) Merged via /review-pr -> /prepare-pr -> /merge-pr. Prepared head SHA: bbb9c3aa48a542539dc37136e6542d1f3958f9c2 Co-authored-by: ngutman <1540134+ngutman@users.noreply.github.com> Co-authored-by: ngutman <1540134+ngutman@users.noreply.github.com> Reviewed-by: @ngutman * fix(bluebubbles): recover outbound message IDs and include sender metadata * fix cron announce routing and timeout handling * changelog: add @tyler6204 credit for today's entries * feat: share to openclaw ios app (#19424) Merged via /review-pr -> /prepare-pr -> /merge-pr. Prepared head SHA: 0a7ab8589ac23d0743d4377683d60601a8c19e61 Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com> Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com> Reviewed-by: @mbelinky * Docs: expand multi-agent routing * docs(changelog): add missing 2026.2.16 entries and reorder by user impact * chore(release): bump version to 2026.2.17 * fix(signal): canonicalize message targets in tool and inbound flows * docs: tighten contribution guidance and vision links * docs: tighten PR scope and review-size policy in vision * fix(gateway): block cross-session fallback in node event delivery * fix(gateway): make health monitor checks single-flight * fix(ios): harden share relay routing and delivery guards * fix(telegram): normalize topic-create targets and add regression tests * feat(cron): add default stagger controls for scheduled jobs * fix(cron): retry next-second schedule compute on undefined * docs(security): harden gateway security guidance * feat(models): support anthropic sonnet 4.6 * fix: wire agents.defaults.imageModel into media understanding auto-discovery resolveAutoEntries only checked a hardcoded list of providers (openai, anthropic, google, minimax) when looking for an image model. agents.defaults.imageModel was never consulted by the media understanding pipeline — it was only wired into the explicit `image` tool. Add resolveImageModelFromAgentDefaults that reads the imageModel config (primary + fallbacks) and inserts it into the auto-discovery chain before the hardcoded provider list. runProviderEntry already falls back to describeImageWithModel (via pi-ai) for providers not in the media understanding registry, so no additional provider registration is needed. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> (cherry picked from commit b381029ede72a57ef6d12d9413c98fa29501b797) * docs: update AGENTS instructions * fix(subagent): harden read-tool overflow guards and sticky reply threading (#19508) * fix(gateway): avoid premature agent.wait completion on transient errors * fix(agent): preemptively guard tool results against context overflow * fix: harden tool-result context guard and add message_id metadata * fix: use importOriginal in session-key mock to include DEFAULT_ACCOUNT_ID The run.skill-filter test was mocking ../../routing/session-key.js with only buildAgentMainSessionKey and normalizeAgentId, but the module also exports DEFAULT_ACCOUNT_ID which is required transitively by src/web/auth-store.ts. Switch to importOriginal pattern so all real exports are preserved alongside the mocked functions. * pi-runner: guard accumulated tool-result overflow in transformContext * PI runner: compact overflowing tool-result context * Subagent: harden tool-result context recovery * Enhance tool-result context handling by adding support for legacy tool outputs and improving character estimation for message truncation. This includes a new function to create legacy tool results and updates to existing functions to better manage context overflow scenarios. * Enhance iMessage handling by adding reply tag support in send functions and tests. This includes modifications to prepend or rewrite reply tags based on provided replyToId, ensuring proper message formatting for replies. * Enhance message delivery across multiple channels by implementing sticky reply context for chunked messages. This includes preserving reply references in Discord, Telegram, and iMessage, ensuring that follow-up messages maintain their intended reply targets. Additionally, improve handling of reply tags in system prompts and tests to support consistent reply behavior. * Enhance read tool functionality by implementing auto-paging across chunks when no explicit limit is provided, scaling output budget based on model context window. Additionally, add tests for adaptive reading behavior and capped continuation guidance for large outputs. Update related functions to support these features. * Refine tool-result context management by stripping oversized read-tool details payloads during compaction, ensuring repeated read calls do not bypass context limits. Introduce new utility functions for handling truncation content and enhance character estimation for tool results. Add tests to validate the removal of excessive details in context overflow scenarios. * Refine message delivery logic in Matrix and Telegram by introducing a flag to track if a text chunk was sent. This ensures that replies are only marked as delivered when a text chunk has been successfully sent, improving the accuracy of reply handling in both channels. * fix: tighten reply threading coverage and prep fixes (#19508) (thanks @tyler6204) * fix(hooks): backport internal message hook bridge with safe delivery semantics * fix(subagent): update SUBAGENT_SPAWN_ACCEPTED_NOTE for clarity on auto-announcement behavior * fix: follow-up slack streaming routing/tests (#9972) (thanks @natedenh) * fix: reduce default image dimension from 2000px to 1200px Large images (2000px) consume excessive context tokens when sent to LLMs. 1200px provides sufficient detail for most use cases while significantly reducing token usage. The 5MB byte limit remains unchanged as JPEG compression at 1200px naturally produces smaller files. (cherry picked from commit 40182123dd2673b4b65e6846fa066380f10b781f) * fix(agents): make image sanitization dimension configurable * docs(tokens): document image dimension token tradeoffs * Whatsapp/add resolve outbound target tests (#19345) * test(whatsapp): add resolveWhatsAppOutboundTarget test suite * style: auto-format files * fix(test): correct mock order for invalid allowList entry test * feat(skills): Add 'Use when / Don't use when' routing blocks (#14521) * feat(skills): add 'Use when / Don't use when' blocks to skill descriptions Based on OpenAI's Shell + Skills + Compaction best practices article. Key changes: - Added clear routing logic to skill descriptions - Added negative examples to prevent misfires - Added templates/examples to github skill - Included Blake's specific setup notes for openhue Skills updated: - apple-reminders: Clarify vs Clawdbot cron - github: Clarify vs local git operations - imsg: Clarify vs other messaging channels - openhue: Add device inventory, room layout - tmux: Clarify vs exec tool - weather: Add location defaults, format codes Reference: https://developers.openai.com/blog/skills-shell-tips * fix(skills): restore metadata and generic CLI examples --------- Co-authored-by: Peter Steinberger <steipete@gmail.com> * feat(agents): add generic provider api key rotation (#19587) * feat(skills): improve descriptions with routing logic (#14577) * feat(skills): improve descriptions with routing logic Apply OpenAI's recommended pattern for skill descriptions: - Add 'Use when' conditions for clear triggering - Add 'NOT for' negative examples to reduce misfires - Make descriptions act as routing logic, not marketing copy Based on: https://developers.openai.com/blog/skills-shell-tips/ Skills updated: - coding-agent: clarify when to delegate vs direct edit - github: add boundaries vs browser/scripting - weather: add scope limitations Glean reported 20% drop in skill triggering without negative examples, recovering after adding them. This change brings Clawdbot skills in line with that pattern. * docs(skills): clarify routing boundaries (openclaw#14577) (thanks @DylanWoodAkers) * docs(changelog): add PR 14577 release note (openclaw#14577) (thanks @DylanWoodAkers) --------- Co-authored-by: ClawdBotWolf <clawdbotwolf@proton.me> Co-authored-by: Peter Steinberger <steipete@gmail.com> * Add frontend-design skill * feat(telegram): add forum topic creation support (#10427) Add `topic-create` action to the Telegram message adapter, enabling programmatic creation of forum topics in supergroups. Changes: - Add `createForumTopicTelegram()` to `src/telegram/send.ts` - Add `createForumTopic` handler in `telegram-actions.ts` - Wire `topic-create` action in Telegram adapter - Register `topic-create` in message action names and spec The bot requires `can_manage_topics` permission in the target group. Supports optional `iconColor` and `iconCustomEmojiId` parameters. Closes #10427 * chore: fix formatting in frontend-design SKILL.md * fix: add action gate check and config type for createForumTopic Address review feedback: - Add isActionEnabled() gate in telegram-actions.ts - Add gate() check in telegram adapter listActions - Add createForumTopic to TelegramActionConfig type * fix(telegram): normalize topic-create targets and add regression tests --------- Co-authored-by: Peter Steinberger <steipete@gmail.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com> Co-authored-by: cpojer <christoph.pojer@gmail.com> Co-authored-by: Sebastian <19554889+sebslight@users.noreply.github.com> Co-authored-by: Josh Avant <830519+joshavant@users.noreply.github.com> Co-authored-by: Shadow <hi@shadowing.dev> Co-authored-by: Hongwei Ma <Marvae@users.noreply.github.com> Co-authored-by: Marvae <11957602+Marvae@users.noreply.github.com> Co-authored-by: obviyus <22031114+obviyus@users.noreply.github.com> Co-authored-by: Ayaan Zaidi <zaidi@uplause.io> Co-authored-by: Ayaan Zaidi <hi@obviy.us> Co-authored-by: Sascha Reuter <s.reuter@geek-it.de> Co-authored-by: sreuter <550246+sreuter@users.noreply.github.com> Co-authored-by: Nimrod Gutman <nimrod.g@singular.net> Co-authored-by: Vignesh <mailvgnsh@gmail.com> Co-authored-by: Benjamin Jesuiter <bjesuiter@gmail.com> Co-authored-by: Sam Padilla <35386211+theSamPadilla@users.noreply.github.com> Co-authored-by: Muhammed Mukhthar CM <mukhtharcm@gmail.com> Co-authored-by: Mariano <132747814+mbelinky@users.noreply.github.com> Co-authored-by: Shakker <shakkerdroid@gmail.com> Co-authored-by: Mariano Belinky <mbelinky@gmail.com> Co-authored-by: Shadow <shadow@openclaw.ai> Co-authored-by: Sk Akram <skcodewizard786@gmail.com> Co-authored-by: akramcodez <179671552+akramcodez@users.noreply.github.com> Co-authored-by: Onur <onur@textcortex.com> Co-authored-by: Tyler Yust <TYTYYUST@YAHOO.COM> Co-authored-by: ngutman <1540134+ngutman@users.noreply.github.com> Co-authored-by: Pablo Nunez <pnunfe@gmail.com> Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com> Co-authored-by: Tyler Yust <64381258+tyler6204@users.noreply.github.com> Co-authored-by: Han Xiao <han.xiao@jina.ai> Co-authored-by: Verite Igiraneza <69280208+VeriteIgiraneza@users.noreply.github.com> Co-authored-by: Blakeshannon <blake@blakeshannon.com> Co-authored-by: Peter Steinberger <peter@steipete.me> Co-authored-by: DylanWoodAkers <dylan@lec.com> Co-authored-by: ClawdBotWolf <clawdbotwolf@proton.me> Co-authored-by: Claw <claw@openclaw.ai>
🦞 OpenClaw — Personal AI Assistant
EXFOLIATE! EXFOLIATE!
OpenClaw is a personal AI assistant you run on your own devices. It answers you on the channels you already use (WhatsApp, Telegram, Slack, Discord, Google Chat, Signal, iMessage, Microsoft Teams, WebChat), plus extension channels like BlueBubbles, Matrix, Zalo, and Zalo Personal. It can speak and listen on macOS/iOS/Android, and can render a live Canvas you control. The Gateway is just the control plane — the product is the assistant.
If you want a personal, single-user assistant that feels local, fast, and always-on, this is it.
Website · Docs · Vision · DeepWiki · Getting Started · Updating · Showcase · FAQ · Wizard · Nix · Docker · Discord
Preferred setup: run the onboarding wizard (openclaw onboard) in your terminal.
The wizard guides you step by step through setting up the gateway, workspace, channels, and skills. The CLI wizard is the recommended path and works on macOS, Linux, and Windows (via WSL2; strongly recommended).
Works with npm, pnpm, or bun.
New install? Start here: Getting started
Subscriptions (OAuth):
Model note: while any model is supported, I strongly recommend Anthropic Pro/Max (100/200) + Opus 4.6 for long‑context strength and better prompt‑injection resistance. See Onboarding.
Models (selection + auth)
- Models config + CLI: Models
- Auth profile rotation (OAuth vs API keys) + fallbacks: Model failover
Install (recommended)
Runtime: Node ≥22.
npm install -g openclaw@latest
# or: pnpm add -g openclaw@latest
openclaw onboard --install-daemon
The wizard installs the Gateway daemon (launchd/systemd user service) so it stays running.
Quick start (TL;DR)
Runtime: Node ≥22.
Full beginner guide (auth, pairing, channels): Getting started
openclaw onboard --install-daemon
openclaw gateway --port 18789 --verbose
# Send a message
openclaw message send --to +1234567890 --message "Hello from OpenClaw"
# Talk to the assistant (optionally deliver back to any connected channel: WhatsApp/Telegram/Slack/Discord/Google Chat/Signal/iMessage/BlueBubbles/Microsoft Teams/Matrix/Zalo/Zalo Personal/WebChat)
openclaw agent --message "Ship checklist" --thinking high
Upgrading? Updating guide (and run openclaw doctor).
Development channels
- stable: tagged releases (
vYYYY.M.DorvYYYY.M.D-<patch>), npm dist-taglatest. - beta: prerelease tags (
vYYYY.M.D-beta.N), npm dist-tagbeta(macOS app may be missing). - dev: moving head of
main, npm dist-tagdev(when published).
Switch channels (git + npm): openclaw update --channel stable|beta|dev.
Details: Development channels.
From source (development)
Prefer pnpm for builds from source. Bun is optional for running TypeScript directly.
git clone https://github.com/openclaw/openclaw.git
cd openclaw
pnpm install
pnpm ui:build # auto-installs UI deps on first run
pnpm build
pnpm openclaw onboard --install-daemon
# Dev loop (auto-reload on TS changes)
pnpm gateway:watch
Note: pnpm openclaw ... runs TypeScript directly (via tsx). pnpm build produces dist/ for running via Node / the packaged openclaw binary.
Security defaults (DM access)
OpenClaw connects to real messaging surfaces. Treat inbound DMs as untrusted input.
Full security guide: Security
Default behavior on Telegram/WhatsApp/Signal/iMessage/Microsoft Teams/Discord/Google Chat/Slack:
- DM pairing (
dmPolicy="pairing"/channels.discord.dmPolicy="pairing"/channels.slack.dmPolicy="pairing"; legacy:channels.discord.dm.policy,channels.slack.dm.policy): unknown senders receive a short pairing code and the bot does not process their message. - Approve with:
openclaw pairing approve <channel> <code>(then the sender is added to a local allowlist store). - Public inbound DMs require an explicit opt-in: set
dmPolicy="open"and include"*"in the channel allowlist (allowFrom/channels.discord.allowFrom/channels.slack.allowFrom; legacy:channels.discord.dm.allowFrom,channels.slack.dm.allowFrom).
Run openclaw doctor to surface risky/misconfigured DM policies.
Highlights
- Local-first Gateway — single control plane for sessions, channels, tools, and events.
- Multi-channel inbox — WhatsApp, Telegram, Slack, Discord, Google Chat, Signal, BlueBubbles (iMessage), iMessage (legacy), Microsoft Teams, Matrix, Zalo, Zalo Personal, WebChat, macOS, iOS/Android.
- Multi-agent routing — route inbound channels/accounts/peers to isolated agents (workspaces + per-agent sessions).
- Voice Wake + Talk Mode — always-on speech for macOS/iOS/Android with ElevenLabs.
- Live Canvas — agent-driven visual workspace with A2UI.
- First-class tools — browser, canvas, nodes, cron, sessions, and Discord/Slack actions.
- Companion apps — macOS menu bar app + iOS/Android nodes.
- Onboarding + skills — wizard-driven setup with bundled/managed/workspace skills.
Star History
Everything we built so far
Core platform
- Gateway WS control plane with sessions, presence, config, cron, webhooks, Control UI, and Canvas host.
- CLI surface: gateway, agent, send, wizard, and doctor.
- Pi agent runtime in RPC mode with tool streaming and block streaming.
- Session model:
mainfor direct chats, group isolation, activation modes, queue modes, reply-back. Group rules: Groups. - Media pipeline: images/audio/video, transcription hooks, size caps, temp file lifecycle. Audio details: Audio.
Channels
- Channels: WhatsApp (Baileys), Telegram (grammY), Slack (Bolt), Discord (discord.js), Google Chat (Chat API), Signal (signal-cli), BlueBubbles (iMessage, recommended), iMessage (legacy imsg), Microsoft Teams (extension), Matrix (extension), Zalo (extension), Zalo Personal (extension), WebChat.
- Group routing: mention gating, reply tags, per-channel chunking and routing. Channel rules: Channels.
Apps + nodes
- macOS app: menu bar control plane, Voice Wake/PTT, Talk Mode overlay, WebChat, debug tools, remote gateway control.
- iOS node: Canvas, Voice Wake, Talk Mode, camera, screen recording, Bonjour pairing.
- Android node: Canvas, Talk Mode, camera, screen recording, optional SMS.
- macOS node mode: system.run/notify + canvas/camera exposure.
Tools + automation
- Browser control: dedicated openclaw Chrome/Chromium, snapshots, actions, uploads, profiles.
- Canvas: A2UI push/reset, eval, snapshot.
- Nodes: camera snap/clip, screen record, location.get, notifications.
- Cron + wakeups; webhooks; Gmail Pub/Sub.
- Skills platform: bundled, managed, and workspace skills with install gating + UI.
Runtime + safety
- Channel routing, retry policy, and streaming/chunking.
- Presence, typing indicators, and usage tracking.
- Models, model failover, and session pruning.
- Security and troubleshooting.
Ops + packaging
- Control UI + WebChat served directly from the Gateway.
- Tailscale Serve/Funnel or SSH tunnels with token/password auth.
- Nix mode for declarative config; Docker-based installs.
- Doctor migrations, logging.
How it works (short)
WhatsApp / Telegram / Slack / Discord / Google Chat / Signal / iMessage / BlueBubbles / Microsoft Teams / Matrix / Zalo / Zalo Personal / WebChat
│
▼
┌───────────────────────────────┐
│ Gateway │
│ (control plane) │
│ ws://127.0.0.1:18789 │
└──────────────┬────────────────┘
│
├─ Pi agent (RPC)
├─ CLI (openclaw …)
├─ WebChat UI
├─ macOS app
└─ iOS / Android nodes
Key subsystems
- Gateway WebSocket network — single WS control plane for clients, tools, and events (plus ops: Gateway runbook).
- Tailscale exposure — Serve/Funnel for the Gateway dashboard + WS (remote access: Remote).
- Browser control — openclaw‑managed Chrome/Chromium with CDP control.
- Canvas + A2UI — agent‑driven visual workspace (A2UI host: Canvas/A2UI).
- Voice Wake + Talk Mode — always‑on speech and continuous conversation.
- Nodes — Canvas, camera snap/clip, screen record,
location.get, notifications, plus macOS‑onlysystem.run/system.notify.
Tailscale access (Gateway dashboard)
OpenClaw can auto-configure Tailscale Serve (tailnet-only) or Funnel (public) while the Gateway stays bound to loopback. Configure gateway.tailscale.mode:
off: no Tailscale automation (default).serve: tailnet-only HTTPS viatailscale serve(uses Tailscale identity headers by default).funnel: public HTTPS viatailscale funnel(requires shared password auth).
Notes:
gateway.bindmust stayloopbackwhen Serve/Funnel is enabled (OpenClaw enforces this).- Serve can be forced to require a password by setting
gateway.auth.mode: "password"orgateway.auth.allowTailscale: false. - Funnel refuses to start unless
gateway.auth.mode: "password"is set. - Optional:
gateway.tailscale.resetOnExitto undo Serve/Funnel on shutdown.
Details: Tailscale guide · Web surfaces
Remote Gateway (Linux is great)
It’s perfectly fine to run the Gateway on a small Linux instance. Clients (macOS app, CLI, WebChat) can connect over Tailscale Serve/Funnel or SSH tunnels, and you can still pair device nodes (macOS/iOS/Android) to execute device‑local actions when needed.
- Gateway host runs the exec tool and channel connections by default.
- Device nodes run device‑local actions (
system.run, camera, screen recording, notifications) vianode.invoke. In short: exec runs where the Gateway lives; device actions run where the device lives.
Details: Remote access · Nodes · Security
macOS permissions via the Gateway protocol
The macOS app can run in node mode and advertises its capabilities + permission map over the Gateway WebSocket (node.list / node.describe). Clients can then execute local actions via node.invoke:
system.runruns a local command and returns stdout/stderr/exit code; setneedsScreenRecording: trueto require screen-recording permission (otherwise you’ll getPERMISSION_MISSING).system.notifyposts a user notification and fails if notifications are denied.canvas.*,camera.*,screen.record, andlocation.getare also routed vianode.invokeand follow TCC permission status.
Elevated bash (host permissions) is separate from macOS TCC:
- Use
/elevated on|offto toggle per‑session elevated access when enabled + allowlisted. - Gateway persists the per‑session toggle via
sessions.patch(WS method) alongsidethinkingLevel,verboseLevel,model,sendPolicy, andgroupActivation.
Details: Nodes · macOS app · Gateway protocol
Agent to Agent (sessions_* tools)
- Use these to coordinate work across sessions without jumping between chat surfaces.
sessions_list— discover active sessions (agents) and their metadata.sessions_history— fetch transcript logs for a session.sessions_send— message another session; optional reply‑back ping‑pong + announce step (REPLY_SKIP,ANNOUNCE_SKIP).
Details: Session tools
Skills registry (ClawHub)
ClawHub is a minimal skill registry. With ClawHub enabled, the agent can search for skills automatically and pull in new ones as needed.
Chat commands
Send these in WhatsApp/Telegram/Slack/Google Chat/Microsoft Teams/WebChat (group commands are owner-only):
/status— compact session status (model + tokens, cost when available)/mesh <goal>— auto-plan + run a multi-step workflow (/mesh plan|run|status|retryavailable)/newor/reset— reset the session/compact— compact session context (summary)/think <level>— off|minimal|low|medium|high|xhigh (GPT-5.2 + Codex models only)/verbose on|off/usage off|tokens|full— per-response usage footer/restart— restart the gateway (owner-only in groups)/activation mention|always— group activation toggle (groups only)
Apps (optional)
The Gateway alone delivers a great experience. All apps are optional and add extra features.
If you plan to build/run companion apps, follow the platform runbooks below.
macOS (OpenClaw.app) (optional)
- Menu bar control for the Gateway and health.
- Voice Wake + push-to-talk overlay.
- WebChat + debug tools.
- Remote gateway control over SSH.
Note: signed builds required for macOS permissions to stick across rebuilds (see docs/mac/permissions.md).
iOS node (optional)
- Pairs as a node via the Bridge.
- Voice trigger forwarding + Canvas surface.
- Controlled via
openclaw nodes ….
Runbook: iOS connect.
Android node (optional)
- Pairs via the same Bridge + pairing flow as iOS.
- Exposes Canvas, Camera, and Screen capture commands.
- Runbook: Android connect.
Agent workspace + skills
- Workspace root:
~/.openclaw/workspace(configurable viaagents.defaults.workspace). - Injected prompt files:
AGENTS.md,SOUL.md,TOOLS.md. - Skills:
~/.openclaw/workspace/skills/<skill>/SKILL.md.
Configuration
Minimal ~/.openclaw/openclaw.json (model + defaults):
{
agent: {
model: "anthropic/claude-opus-4-6",
},
}
Full configuration reference (all keys + examples).
Security model (important)
- Default: tools run on the host for the main session, so the agent has full access when it’s just you.
- Group/channel safety: set
agents.defaults.sandbox.mode: "non-main"to run non‑main sessions (groups/channels) inside per‑session Docker sandboxes; bash then runs in Docker for those sessions. - Sandbox defaults: allowlist
bash,process,read,write,edit,sessions_list,sessions_history,sessions_send,sessions_spawn; denylistbrowser,canvas,nodes,cron,discord,gateway.
Details: Security guide · Docker + sandboxing · Sandbox config
- Link the device:
pnpm openclaw channels login(stores creds in~/.openclaw/credentials). - Allowlist who can talk to the assistant via
channels.whatsapp.allowFrom. - If
channels.whatsapp.groupsis set, it becomes a group allowlist; include"*"to allow all.
Telegram
- Set
TELEGRAM_BOT_TOKENorchannels.telegram.botToken(env wins). - Optional: set
channels.telegram.groups(withchannels.telegram.groups."*".requireMention); when set, it is a group allowlist (include"*"to allow all). Alsochannels.telegram.allowFromorchannels.telegram.webhookUrl+channels.telegram.webhookSecretas needed.
{
channels: {
telegram: {
botToken: "123456:ABCDEF",
},
},
}
Slack
- Set
SLACK_BOT_TOKEN+SLACK_APP_TOKEN(orchannels.slack.botToken+channels.slack.appToken).
Discord
- Set
DISCORD_BOT_TOKENorchannels.discord.token(env wins). - Optional: set
commands.native,commands.text, orcommands.useAccessGroups, pluschannels.discord.allowFrom,channels.discord.guilds, orchannels.discord.mediaMaxMbas needed.
{
channels: {
discord: {
token: "1234abcd",
},
},
}
Signal
- Requires
signal-cliand achannels.signalconfig section.
BlueBubbles (iMessage)
- Recommended iMessage integration.
- Configure
channels.bluebubbles.serverUrl+channels.bluebubbles.passwordand a webhook (channels.bluebubbles.webhookPath). - The BlueBubbles server runs on macOS; the Gateway can run on macOS or elsewhere.
iMessage (legacy)
- Legacy macOS-only integration via
imsg(Messages must be signed in). - If
channels.imessage.groupsis set, it becomes a group allowlist; include"*"to allow all.
Microsoft Teams
- Configure a Teams app + Bot Framework, then add a
msteamsconfig section. - Allowlist who can talk via
msteams.allowFrom; group access viamsteams.groupAllowFromormsteams.groupPolicy: "open".
WebChat
- Uses the Gateway WebSocket; no separate WebChat port/config.
Browser control (optional):
{
browser: {
enabled: true,
color: "#FF4500",
},
}
Docs
Use these when you’re past the onboarding flow and want the deeper reference.
- Start with the docs index for navigation and “what’s where.”
- Read the architecture overview for the gateway + protocol model.
- Use the full configuration reference when you need every key and example.
- Run the Gateway by the book with the operational runbook.
- Learn how the Control UI/Web surfaces work and how to expose them safely.
- Understand remote access over SSH tunnels or tailnets.
- Follow the onboarding wizard flow for a guided setup.
- Wire external triggers via the webhook surface.
- Set up Gmail Pub/Sub triggers.
- Learn the macOS menu bar companion details.
- Platform guides: Windows (WSL2), Linux, macOS, iOS, Android
- Debug common failures with the troubleshooting guide.
- Review security guidance before exposing anything.
Advanced docs (discovery + control)
Operations & troubleshooting
Deep dives
Workspace & skills
- Skills config
- Default AGENTS
- Templates: AGENTS
- Templates: BOOTSTRAP
- Templates: IDENTITY
- Templates: SOUL
- Templates: TOOLS
- Templates: USER
Platform internals
Email hooks (Gmail)
Molty
OpenClaw was built for Molty, a space lobster AI assistant. 🦞 by Peter Steinberger and the community.
Community
See CONTRIBUTING.md for guidelines, maintainers, and how to submit PRs. AI/vibe-coded PRs welcome! 🤖
Special thanks to Mario Zechner for his support and for pi-mono. Special thanks to Adam Doppelt for lobster.bot.
Thanks to all clawtributors:
