OpenClaw v2026.2.25: Android Gets Serious, Heartbeat Gets a Switch
This release is a classic “make it feel real” update: Android chat stops being fragile, delivery logic becomes more deterministic, and the project keeps tightening the edges where automation can accidentally do the wrong thing — or do the right thing twice.
If v2026.2.24 was about “emergency brakes + trust boundaries,” v2026.2.25 is about execution quality: streaming, routing, retries, and the stuff users experience as stability. oai_citation:0‡GitHub
Android Chat: Better Streaming, Better Markdown
The top-line change is Android-side polish that matters: improved streaming delivery handling and higher-quality markdown rendering in the native Android chat UI, including better GitHub-flavored markdown behavior. oai_citation:1‡GitHub
Translation: less “why did that render weird / arrive weird,” more “this is an actual chat client.”
Android Startup: Perf Work You Can Measure
Android also gets startup-performance improvements (defer foreground-service startup, move WebView debugging init out of the critical path) — but the real flex is the addition of startup macrobenchmarking and low-noise perf CLI scripts for deterministic cold-start tracking. oai_citation:2‡GitHub
This is the project moving from “it feels faster” to “we can prove it.”
UI Chat Compose: Small Screens, Less Pain
Chat compose gets a mobile stacked layout for action buttons on small screens, improving send/session controls usability. oai_citation:3‡GitHub
Not headline-y, but exactly the kind of detail that reduces friction for daily use.
Heartbeat Delivery: Explicit Policy, Clear Semantics
Heartbeat configuration changes shape:
- The old heartbeat DM toggle is replaced by
agents.defaults.heartbeat.directPolicywithallow | block, also supported per-agent. oai_citation:4‡GitHub - Breaking: the default for direct/DM delivery is now
allowagain. If you want the v2026.2.24 “DM-blocked” behavior, setagents.defaults.heartbeat.directPolicy: "block"(or override per agent). oai_citation:5‡GitHub
This is good engineering: “defaults” can change, but policy becomes explicit and understandable.
Delivery Reliability: Subagents, Cron, Telegram, Slack
Most of the “real” work is in the fixes — all orbiting delivery correctness:
- Subagent completion announce dispatch is refactored into an explicit queue/direct/fallback state machine; plugin-registry cold/stale states are handled more robustly; Telegram sends without
message_idare treated as failures (not false-success). oai_citation:6‡GitHub - Telegram webhook processing is hardened (pre-init bots, callback-mode JSON handling, preserve near-limit payload reads to avoid hangs/dropped updates). oai_citation:7‡GitHub
- Slack thread sessions get protection against “silent bricking” from oversized parent-session inheritance, plus
session.parentForkMaxTokens(default100000,0disables). oai_citation:8‡GitHub - Cron multi-account routing now honors explicit
delivery.accountId, and ifmessage.sendomitsaccountId, it falls back to the sending agent’s bound channel account instead of defaulting globally. oai_citation:9‡GitHub - Duplicate-guarding for cron summaries is improved so uncertain-ack paths don’t lead to “already sent… sent again.” oai_citation:10‡GitHub
Net effect: fewer ghost drops, fewer wrong-thread sends, fewer duplicates — and more predictable automation.
Branding & Docs: The ai.openclaw Sweep
A broad cleanup replaces remaining bot.molt identifiers (launchd label, bundle-id, logging subsystem, examples) with ai.openclaw across docs, iOS surfaces, helper scripts, and fixtures. oai_citation:11‡GitHub
It’s branding, but it’s also operational: consistent identifiers reduce “why doesn’t this script match my install” confusion.
The Signal
v2026.2.25 is OpenClaw acting like a platform that expects scale:
- Android is no longer “just supported,” it’s being tuned.
- Delivery logic is treated as a state machine, not a best-effort.
- Automation gets explicit policy knobs that are hard to misread.
Full release notes on GitHub. oai_citation:12‡GitHub