v9.4.0
zeroclaw-labs/zeroclawv9.4.0Sep 19, 2026by github-actions[bot]
Upgrading?
AI Summary
This release enhances webhook handling by allowing devices to merge global targets and introduces an on-demand endpoint for retrieving older chat history from the phone.
Key Highlights
- Per-device webhooks can now add to global targets instead of replacing them via the new `--webhook-device-merge-global` flag.
- New `POST /chat/{chat_jid}/history` endpoint allows requesting older messages on demand.
- New `--ignore-status-media` flag skips downloading media attached to status broadcasts.
- Reliability fixes for history sync naming and device purge operations.
- Slow device webhooks no longer starve the global webhook leg.
New Features
- On-demand chat history retrieval API.
- Webhook device merge functionality.
- Status media download skipping.
- Chatwoot config route registration fixes.
- Path decoding improvements for device IDs.
Full Release Notes
## What's New in v9.4.0
š **On-Demand Chat History, Per-Device Webhook Fan-Out & Status Media Control**
Version 9.4.0 lets you pull older chat history from the phone on demand, allows a device's own webhook to add to the global targets instead of replacing them, and adds a switch to skip status media downloads. History sync naming, device purge, webhook delivery, and route ordering all get reliability fixes, and whatsmeow is updated to the latest revision.
---
## ⨠Features
### On-Demand Chat History ([#834](https://github.com/aldinokemal/go-whatsapp-web-multidevice/pull/834))
- Adds `POST /chat/{chat_jid}/history` to request older messages from the phone, anchored at the oldest message currently stored locally for that chat
- Accepts a `count` of older messages to request and returns the requested count, with percent-encoded chat JIDs accepted on the path
- Documents the endpoint in OpenAPI and rejects requests for a chat with no stored message to anchor on
### Per-Device Webhooks Can Add to the Global Targets ([#842](https://github.com/aldinokemal/go-whatsapp-web-multidevice/pull/842))
- Adds `--webhook-device-merge-global` / `WHATSAPP_WEBHOOK_DEVICE_MERGE_GLOBAL` so a device with its own webhook also delivers its events to the global `--webhook` URLs
- Leaves the default unchanged: a per-device webhook still replaces the global ones
- Documents the flag in the README, `.env.example`, and the webhook payload reference
### Ignore Status Media Downloads ([#836](https://github.com/aldinokemal/go-whatsapp-web-multidevice/pull/836))
- Adds `--ignore-status-media` / `WHATSAPP_IGNORE_STATUS_MEDIA` to skip downloading media attached to status broadcasts
- Keeps status events flowing while avoiding the storage and bandwidth cost of their media
---
## š Bug Fixes
### History Sync Chat Naming ([#845](https://github.com/aldinokemal/go-whatsapp-web-multidevice/pull/845))
- Names 1:1 chats from the contact store instead of the history-sync `DisplayName`
- Keeps `DisplayName` for group and newsletter chats, where it is the authoritative title
- Preserves the disappearing-messages timer when a chat is refreshed by an on-demand sync
### Device Purge and Path Decoding ([#843](https://github.com/aldinokemal/go-whatsapp-web-multidevice/pull/843))
- Percent-decodes the `:device_id` path parameter so clients can safely send `encodeURIComponent` values
- Resolves purge targets verbatim instead of trimming, so distinct slots are never confused, and keeps the registry entry when local cleanup fails so `DELETE` can be retried
- Skips the keep-slot callback on a purge-triggered logout, purges both the registry id and the paired JID partition when they differ, and broadcasts `DEVICE_REMOVED` with the refreshed device list
- Surfaces shared-JID lookup failures instead of silently continuing when companion slots share one number
### Chatwoot Config Routes and Device Route Order ([#837](https://github.com/aldinokemal/go-whatsapp-web-multidevice/pull/837))
- Registers the Chatwoot config routes before the header-based device group so `DeviceMiddleware` no longer intercepts them
- Keeps the device group as the last registration on the API group ā `Group("")` installs a root handler matching every path ā and pins the order with a regression test
- Hardens the status-media guard to match on the JID's shape, so a device-qualified status JID is still recognised
### Slow Device Webhook No Longer Starves the Global Leg
- Runs the device and global webhook legs concurrently so one slow endpoint burning its retry backoff cannot leave the global leg a dead context
- Dedupes a global URL against the device URLs only when the device leg will actually deliver, so an event rejected by the device's own filter still reaches the global subscription
---
## š§ Technical Improvements
### Dependency & Documentation Updates
- Updates whatsmeow to the latest revision
- Streamlines the AGENTS documentation across chatstorage, chatwoot, whatsapp, ui, usecase, and validations
---
## What's Changed
* chore: update whatsmeow to latest by @aldinokemal
* refactor: streamline AGENTS documentation and improve clarity across multiple sections by @aldinokemal
* fix(history-sync): name 1:1 chats from the contact store, not DisplayName ([#845](https://github.com/aldinokemal/go-whatsapp-web-multidevice/pull/845)) by @arivelli
* fix(device): make DELETE purge reliable and decode path device_id ([#843](https://github.com/aldinokemal/go-whatsapp-web-multidevice/pull/843)) by @hanlest
* feat(webhook): let a per-device webhook add to the global targets instead of replacing them ([#842](https://github.com/aldinokemal/go-whatsapp-web-multidevice/pull/842)) by @Kizuno18
* fix(device): compare purge slot id verbatim and surface shared-JID lookup failures by @aldinokemal
* fix(webhook): stop a slow device webhook starving the global leg by @aldinokemal
* fix(history-sync): keep DisplayName for group and newsletter chats by @aldinokemal
* fix(rest): register chatwoot config routes before DeviceMiddleware ([#837](https://github.com/aldinokemal/go-whatsapp-web-multidevice/pull/837)) by @aguinaldotupy
* feat: add flag to ignore downloading status media ([#836](https://github.com/aldinokemal/go-whatsapp-web-multidevice/pull/836)) by @danihidayatx
* feat(chat): add on-demand history sync endpoint ([#834](https://github.com/aldinokemal/go-whatsapp-web-multidevice/pull/834)) by @Kizuno18
* fix(history-sync): keep the disappearing-messages timer on on-demand sync by @aldinokemal
* fix(rest): keep the device group last, and harden the status-media guard by @aldinokemal
* feat: update SKILL by @aldinokemal
* chore(release): v9.4.0 by @aldinokemal
## Contributors
- [@aldinokemal](https://github.com/aldinokemal)
- [@aguinaldotupy](https://github.com/aguinaldotupy)
- [@arivelli](https://github.com/arivelli)
- [@danihidayatx](https://github.com/danihidayatx)
- [@hanlest](https://github.com/hanlest)
- [@Kizuno18](https://github.com/Kizuno18)
**Full Changelog**: https://github.com/aldinokemal/go-whatsapp-web-multidevice/compare/v9.3.1...v9.4.0
Related Repositories
A cross-platform desktop All-in-One assistant for Claude Code, Codex, OpenCode, OpenClaw, Grok Build & Hermes Agent. Only official website: ccswitch.io
An open-source remote desktop application designed for self-hosting, as an alternative to TeamViewer.
Build smaller, faster, and more secure desktop and mobile applications with a web frontend.
Ļ RuView turns commodity WiFi signals into real-time spatial intelligence, vital sign monitoring, and presence detection ā all without a single pixel of video.
Incredibly fast JavaScript runtime, bundler, test runner, and package manager ā all in one