Mac assets on this release reuse the beta artifact line from v2026.3.8-beta.1.
Changes
- CLI/backup: add
openclaw backup createandopenclaw backup verifyfor local state archives, including--only-config,--no-include-workspace, manifest/payload validation, and backup guidance in destructive flows. (#40163) thanks @shichangs. - macOS/onboarding: add a remote gateway token field for remote mode, preserve existing non-plaintext
gateway.remote.tokenconfig values until explicitly replaced, and warn when the loaded token shape cannot be used directly from the macOS app. (#40187, supersedes #34614) Thanks @cgdusek. - Talk mode: add top-level
talk.silenceTimeoutMsconfig so Talk waits a configurable amount of silence before auto-sending the current transcript, while keeping each platform's existing default pause window when unset. (#39607) Thanks @danodoesdesign. Fixes #17147. - TUI: infer the active agent from the current workspace when launched inside a configured agent workspace, while preserving explicit
agent:session targets. (#39591) thanks @arceus77-7. - Tools/Brave web search: add opt-in
tools.web.search.brave.mode: "llm-context"soweb_searchcan call Brave's LLM Context endpoint and return extracted grounding snippets with source metadata, plus config/docs/test coverage. (#33383) Thanks @thirumaleshp. - CLI/install: include the short git commit hash in
openclaw --versionoutput when metadata is available, and keep installer version checks compatible with the decorated format. (#39712) thanks @sourman. - CLI/backup: improve archive naming for date sorting, add config-only backup mode, and harden backup planning, publication, and verification edge cases. (#40163) Thanks @gumadeiras.
- ACP/Provenance: add optional ACP ingress provenance metadata and visible receipt injection (
openclaw acp --provenance off|meta|meta+receipt) so OpenClaw agents can retain and report ACP-origin context with session trace IDs. (#40473) thanks @mbelinky. - Tools/web search: alphabetize provider ordering across runtime selection, onboarding/configure pickers, and config metadata, so provider lists stay neutral and multi-key auto-detect now prefers Grok before Kimi. (#40259) thanks @kesku.
- Docs/Web search: restore $5/month free-credit details, replace defunct "Data for Search"/"Data for AI" plan names with current "Search" plan, and note legacy subscription validity in Brave setup docs. Follows up on #26860. (#40111) Thanks @remusao.
- Extensions/ACPX tests: move the shared runtime fixture helper from
src/runtime-internals/tosrc/test-utils/so the test-only helper no longer looks like shipped runtime code.
Fixes
- Update/macOS launchd restart: re-enable disabled LaunchAgent services before updater bootstrap so
openclaw updatecan recover from a disabled gateway service instead of leaving the restart step stuck. - macOS app/chat UI: route browser proxy through the local node browser service, preserve plain-text paste semantics, strip completed assistant trace/debug wrapper noise from transcripts, refresh permission state after returning from System Settings, and tolerate malformed cron rows in the macOS tab. (#39516) Thanks @Imhermes1.
- Android/Play distribution: remove self-update, background location,
screen.record, and background mic capture from the Android app, narrow the foreground service todataSynconly, and clean up the legacylocation.enabledMode=alwayspreference migration. (#39660) Thanks @obviyus. - Telegram/DM routing: dedupe inbound Telegram DMs per agent instead of per session key so the same DM cannot trigger duplicate replies when both
agent:main:mainandagent:main:telegram:direct:<id>resolve for one agent. Fixes #40005. Supersedes #40116. (#40519) thanks @obviyus. - Cron/Telegram announce delivery: route text-only announce jobs through the real outbound adapters after finalizing descendant output so plain Telegram targets no longer report
delivered: truewhen no message actually reached Telegram. (#40575) thanks @obviyus. - Matrix/DM routing: add safer fallback detection for broken
m.directhomeservers, honor explicit room bindings over DM classification, and preserve room-bound agent selection for Matrix DM rooms. (#19736) Thanks @derbronko. - Feishu/plugin onboarding: clear the short-lived plugin discovery cache before reloading the registry after installing a channel plugin, so onboarding no longer re-prompts to download Feishu immediately after a successful install. Fixes #39642. (#39752) Thanks @GazeKingNuWu.
- Plugins/channel onboarding: prefer bundled channel plugins over duplicate npm-installed copies during onboarding and release-channel sync, preventing bundled plugins from being shadowed by npm installs with the same plugin ID. (#40092)
- Config/runtime snapshots: keep secrets-runtime-resolved config and auth-profile snapshots intact after config writes so follow-up reads still see file-backed secret values while picking up the persisted config update. (#37313) thanks @bbblending.
- Gateway/Control UI: resolve bundled dashboard assets through symlinked global wrappers and auto-detected package roots, while keeping configured and custom roots on the strict hardlink boundary. (#40385) Thanks @LarytheLord.
- Browser/extension relay: add
browser.relayBindHostso the Chrome relay can bind to an explicit non-loopback address for WSL2 and other cross-namespace setups, while preserving loopback-only defaults. (#39364) Thanks @mvanhorn. - Browser/CDP: normalize loopback direct WebSocket CDP URLs back to HTTP(S) for
/json/*tab operations so localws:///wss://profiles can still list, focus, open, and close tabs after the new direct-WS support lands. (#31085) Thanks @shrey150. - Browser/CDP: rewrite wildcard
ws://0.0.0.0andws://[::]debugger URLs from remote/json/versionresponses back to the external CDP host/port, fixing Browserless-style container endpoints. (#17760) Thanks @joeharouni. - Browser/extension relay: wait briefly for a previously attached Chrome tab to reappear after transient relay drops before failing with
tab not found, reducing noisy reconnect flakes. (#32461) Thanks @AaronWander. - macOS/Tailscale gateway discovery: keep Tailscale Serve probing alive when other remote gateways are already discovered, prefer direct transport for resolved
.ts.netand Tailscale Serve gateways, and setTERM=dumbfor GUI-launched Tailscale CLI discovery. (#40167) thanks @ngutman. - TUI/theme: detect light terminal backgrounds via
COLORFGBGand pick a WCAG AA-compliant light palette, withOPENCLAW_THEME=light|darkoverride for terminals without auto-detection. (#38636) Thanks @ademczuk and @vincentkoc. - Agents/openai-codex: normalize
gpt-5.4fallback transport back toopenai-codex-responsesonchatgpt.com/backend-apiwhen config drifts to the generic OpenAI responses endpoint. (#38736) Thanks @0xsline. - Models/openai-codex GPT-5.4 forward-compat: use the GPT-5.4 1,050,000-token context window and 128,000 max tokens for
openai-codex/gpt-5.4instead of inheriting stale legacy Codex limits in resolver fallbacks and model listing. (#37876) thanks @yuweuii. - Tools/web search: restore Perplexity OpenRouter/Sonar compatibility for legacy
OPENROUTER_API_KEY,sk-or-..., and explicitperplexity.baseUrl/modelsetups while keeping direct Perplexity keys on the native Search API path. (#39937) Thanks @obviyus. - Agents/failover: detect Amazon Bedrock
Too many tokens per dayquota errors as rate limits across fallback, cron retry, and memory embeddings while keeping context-windowtoo many tokens per requesterrors out of the rate-limit lane. (#39377) Thanks @gambletan. - Mattermost replies: keep
root_idpinned to the existing thread root when an agent replies inside a thread, while still using reply-target threading for top-level posts. (#27744) thanks @hnykda. - Telegram/DM partial streaming: keep DM preview lanes on real message edits instead of native draft materialization so final replies no longer flash a second duplicate copy before collapsing back to one.
- macOS overlays: fix VoiceWake, Talk, and Notify overlay exclusivity crashes by removing shared
inoutvisibility mutation fromOverlayPanelFactory.present, and add a repeated Talk overlay smoke test. (#39275, #39321) Thanks @fellanH. - macOS Talk Mode: set the speech recognition request
taskHintto.dictationfor mic capture, and add regression coverage for the request defaults. (#38445) Thanks @dmiv. - macOS release packaging: default
scripts/package-mac-app.shto universal binaries forBUILD_CONFIG=release, and clarify thatscripts/package-mac-dist.shalready produces the release zip + DMG. (#33891) Thanks @cgdusek. - Hooks/session-memory: keep
/newand/resetmemory artifacts in the bound agent workspace and align saved reset session keys with that workspace when stale main-agent keys leak into the hook path. (#39875) thanks @rbutera. - Sessions/model switch: clear stale cached
contextTokenswhen a session changes models so status and runtime paths recompute against the active model window. (#38044) thanks @yuweuii. - ACP/session history: persist transcripts for successful ACP child runs, preserve exact transcript text, record ACP spawned-session lineage, and keep spawn-time transcript-path persistence best-effort so history storage failures do not block execution. (#40137) thanks @mbelinky.
- Docs/browser: add a layered WSL2 + Windows remote Chrome CDP troubleshooting guide, including Control UI origin pitfalls and extension-relay bind-address guidance. (#39407) Thanks @Owlock.
- Context engine registry/bundled builds: share the registry state through a
globalThissingleton so duplicated bundled module copies can resolve engines registered by each other at runtime, with regression coverage for duplicate-module imports. (#40115) thanks @jalehman. - Podman/setup: fix
cannot chdir: Permission deniedinrun_as_userwhensetup-podman.shis invoked from a directory the target user cannot access, by wrapping user-switch calls in a subshell that cd's to/tmpwith/fallback. (#39435) Thanks @langdon and @jlcbk. - Podman/SELinux: auto-detect SELinux enforcing/permissive mode and add
:Zrelabel to bind mounts inrun-openclaw-podman.shand the Quadlet template, fixingEACCESon Fedora/RHEL hosts. SupportsOPENCLAW_BIND_MOUNT_OPTIONSoverride. (#39449) Thanks @langdon and @githubbzxs. - Agents/context-engine plugins: bootstrap runtime plugins once at embedded-run, compaction, and subagent boundaries so plugin-provided context engines and hooks load from the active workspace before runtime resolution. (#40232)
- Docs/Changelog: correct the contributor credit for the bundled Control UI global-install fix to @LarytheLord. (#40420) Thanks @velvet-shark.
- Telegram/media downloads: time out only stalled body reads so polling recovers from hung file downloads without aborting slow downloads that are still streaming data. (#40098) thanks @tysoncung.
- Docker/runtime image: prune dev dependencies, strip build-only dist metadata for smaller Docker images. (#40307) Thanks @vincentkoc.
- Gateway/restart timeout recovery: exit non-zero when restart-triggered shutdown drains time out so launchd/systemd restart the gateway instead of treating the failed restart as a clean stop. Landed from contributor PR #40380 by @dsantoreis. Thanks @dsantoreis.
- Gateway/config restart guard: validate config before service start/restart and keep post-SIGUSR1 startup failures from crashing the gateway process, reducing invalid-config restart loops and macOS permission loss. Landed from contributor PR #38699 by @lml2468. Thanks @lml2468.
- Gateway/launchd respawn detection: treat
XPC_SERVICE_NAMEas a launchd supervision hint so macOS restarts exit cleanly under launchd instead of attempting detached self-respawn. Landed from contributor PR #20555 by @dimat. Thanks @dimat. - Telegram/poll restart cleanup: abort the in-flight Telegram API fetch when shutdown or forced polling restarts stop a runner, preventing stale
getUpdateslong polls from colliding with the replacement runner. Landed from contributor PR #23950 by @Gkinthecodeland. Thanks @Gkinthecodeland. - Cron/restart catch-up staggering: limit immediate missed-job replay on startup and reschedule the deferred remainder from the post-catchup clock so restart bursts do not starve the gateway or silently skip overdue recurring jobs. Landed from contributor PR #18925 by @rexlunae. Thanks @rexlunae.
- Cron/owner-only tools: pass trusted isolated cron runs into the embedded agent with owner context so
cron/gatewaytooling remains available after the owner-auth hardening narrowed direct-message ownership inference. - Browser/SSRF: block private-network intermediate redirect hops in strict browser navigation flows and fail closed when remote tab-open paths cannot inspect redirect chains. Thanks @zpbrent.
- MS Teams/authz: keep
groupPolicy: "allowlist"enforcing sender allowlists even when a team/channel route allowlist is configured, so route matches no longer widen group access to every sender in that route. Thanks @zpbrent. - Security/system.run: bind approved
bunanddeno runscript operands to on-disk file snapshots so post-approval script rewrites are denied before execution. - Skills/download installs: pin the validated per-skill tools root before writing downloaded archives, so rebinding the lexical tools path cannot redirect download writes outside the intended tools directory. Thanks @tdjackey.