WhatsApp reactions ship, bun becomes the preferred UI build runtime

One week into the year. The cadence of openclaw had settled into a rhythm of shipping against concrete asymmetries in the messaging surface. Discord had reactions; WhatsApp did not. The UI build was slow on corporate machines because pnpm install over npm registry was a cold-cache dog. Today fixed both, plus a routing bug in collect-mode that I’d seen hurt more than one user thread.
Signal
WhatsApp reactions land on openclaw, closing a cross-provider gap with the Discord reaction work from earlier in the week Control-UI build now prefers bun: 237 commits worth of churn with bun replacing node as default, and a fallback flag kept optional Cross-provider message routing fix in collect-mode means replies now route to the originating channel, not the default
Evidence
openclaw (237 commits, +30,419 / -10,458): WhatsApp reactions support, bun preferred for UI build, collect-mode cross-provider fix Sub-agent hardening: model overrides no longer leak, README ui
step patched (#300), ClawdHub guide added Docs avalanche: agent workspace guide, macOS build toolchain troubleshooting, CLI reference, cron redirect, issue templates Protocol: GatewayModels.swift regenerated, duplicate daemon runtime imports removed, terminal css updated237 commits is the highest single-day count so far this year. The +30,419 / -10,458 split is 3
, still net-additive, but the deletions are climbing as the repo starts pruning the fallback paths that accumulated during the rename week. GatewayModels.swift regenerated again, which means the protocol layer is still churning, which means the multi-provider abstraction from January 3 is getting real exercise.WhatsApp reactions are the headline feature, but they matter less for their own sake than for the symmetry they produce. A daemon that can react on Discord but not WhatsApp is a daemon whose features depend on which user you’re talking to, which is a product surface I’d refused to let ship with on day one of 2026. Closing the gap means a user on either platform gets the same behavioral contract, which is the only product-level promise I’m willing to make about multi-platform support.
Bun preferred for UI build is the decision that’ll be reversed for the daemon 48 hours later (see January 8 for that story). The asymmetry is deliberate: UI install speed matters to every new user and the install-time gain from bun is real. Daemon runtime matters to every running user and reproducibility beats install-speed there. Keeping a fallback flag optional means users on node-only environments don’t get locked out today, but the default pointer has shifted.
So What
This is the day the messaging surface becomes symmetric across Discord and WhatsApp. Reactions on both sides, routing that respects origin Preferring bun for UI builds is the correct move if the daemon can fall through. Faster installs without locking out node shops
The collect-mode routing fix is the footnote that matters more than it reads. Collect-mode is the feature where the daemon collects messages from multiple channels and produces a unified reply; the bug was that the reply went to the default channel rather than the channel the triggering message came from. For any user who uses collect-mode across Discord and WhatsApp at the same time, this bug meant the daemon sometimes replied in the wrong window. Fix is small, impact is proportional to how many users hit it, which is “all of them, once.”
What’s Next
“Prefer bun, make it optional” is a migration pattern worth naming. When does the fallback get removed, and who measures the install-time win before that decision? My instinct is the fallback stays in place for at least a month of real user data, then the decision goes through a proper before/after install-time benchmark before the flag goes away.
Log
- Sessions: 0 (bloomnet.db lag, evidence from live git)
- Top repos: openclaw (237)
- Commits: 237 across 1 repo (+30,419 / -10,458)
- Notable: WhatsApp reactions, bun UI build, cross-provider routing fix, ClawdHub guide
- Cost: not tracked (pre-bloomnet-ingest window)