v8.8.0

mtkresearch/BreezeAppv8.8.0Jun 19, 2026by github-actions[bot]

AI Summary

This release delivers a major overhaul of the Chatwoot integration, achieving Evolution-API parity with features like auto-provisioning, session-aware webhooks, and agent signature support. It also improves error handling for WhatsApp's 463 error and fixes critical bugs regarding media URLs and contact name display.

Key Highlights

  • Chatwoot Evolution-API Parity: Auto-provisioning inbox and bidirectional markdown threading
  • Session correlation in webhooks via `session_id` for multi-tenant events
  • Honest handling of WhatsApp Error 463, removing futile client-side retries
  • Fixed downloaded media URLs and chat-list name fallbacks
  • Agent signature support for Chatwoot messages

New Features

  • Auto-provisions (or reuses) Chatwoot API-channel inbox on startup
  • Forwards message edits, revokes, and deletes as threaded notes
  • Reopens conversations for returning contacts across REST and DB import paths
  • Routes replies back through the resolved device to prevent mis-delivery
  • Saved WhatsApp contact name (`PushName`) displayed in Chatwoot instead of phone number
  • Webhook payloads include `session_id` for multi-tenant correlation

Full Release Notes

## What's New in v8.8.0

🚀 **Minor Release: Chatwoot Evolution-API Parity, Session-Aware Webhooks, Honest 463 Handling & Media URL Fixes**

This release lands a major Chatwoot integration overhaul (auto-provisioning, edits/deletes, conversation reopen, a durable retry queue, and device-scoped routing), adds session correlation to webhooks plus JIDs to app responses, stops masking WhatsApp's server-side 463 reach-out timelock behind a futile client retry, and fixes downloaded-media URLs and chat-list name fallbacks.

---

## ✨ New Features

### Chatwoot Evolution-API Parity
- Auto-provisions (or reuses) an API-channel inbox on startup and resolves its id automatically (`CHATWOOT_AUTO_CREATE`, `CHATWOOT_INBOX_NAME`, `CHATWOOT_WEBHOOK_URL`)
- Forwards message edits, revokes, and deletes to Chatwoot as threaded notes, with bidirectional WhatsApp↔Chatwoot markdown and reply/reaction threading via the `WAID:` source-id convention
- Reopens/reuses a conversation for returning contacts across both the REST and direct-DB import paths (`CHATWOOT_REOPEN_CONVERSATION`, `CHATWOOT_CONVERSATION_PENDING`), plus a `CHATWOOT_IGNORE_JIDS` ignore list
- Routes agent replies back through the resolved device (no cross-account mis-delivery in multi-device deployments) and replays transient WhatsApp→Chatwoot failures from a durable retry queue
- Adds agent signature support (`CHATWOOT_SIGN_MSG`/`CHATWOOT_SIGN_DELIMITER`), degrades to text when an inbound media download fails instead of dropping the message, and expands unit coverage (chatwoot 22%→58%, pgimport 28%→74%)

### Saved WhatsApp Contact Name in Chatwoot (#714)
- Resolves the saved address-book name (`FullName` → `PushName` → `BusinessName`) from the local WhatsApp contact store for 1:1 chats, instead of surfacing the bare phone number
- Prefers it over the event pushname for both incoming and outgoing 1:1 chats, falling back to pushname then the phone identifier (fixes #688)

### Session ID in Webhooks & JID in App Responses (#717)
- Webhook payloads now include `session_id`, resolved from the device JID at the single forward chokepoint, so multi-tenant events can be correlated back to the session registered via `POST /devices` (closes #578)
- `GET /app/status` and `GET /app/devices` now return the WhatsApp `jid` alongside `device_id`
- `device_id` stays the JID for backward compatibility; `session_id` is omitted when the JID isn't mapped
- Documented in `openapi.yaml` and the webhook payload docs

---

## 🐛 Bug Fixes

### Honest WhatsApp Error 463 Handling (#708)
- Removes the client-side pre-warm + token-wait + one-shot retry around error 463 (`NackCallerReachoutTimelocked`), which re-sent without a usable token and simply 463'd again, adding latency and a second reach-out attempt
- Error 463 is WhatsApp's server-side reach-out timelock: the trusted-contact token can only arrive from the recipient (inbound message, privacy-token notification, or history sync), so whatsmeow's built-in tctoken lifecycle is the only correct path
- Keeps the 463→429 mapping and rewrites `WA_REACHOUT_TIMELOCK` guidance to describe the restriction and its real remedies

### Public URL for Downloaded Media (#716)
- Media download responses now return the public URL for the saved file
- Aligns the media-download device context in the REST path

### Chat-List Name Fallback (#715)
- `ListChats` and `GetChatMessages` now fall back to a JID-derived label when the stored chat name is empty (phone number for 1:1, `Group <id>` / `Newsletter <id>`, and `Status` for `status@broadcast`)
- Fixes blank names for chats persisted before a pushname/group subject was known (fixes #675)

### Chatwoot pgimport UUID Cast (#724)
- Drops the `::text` cast on `gen_random_uuid()` for the uuid-typed `conversations.uuid` column
- Fixes the INSERT failing with `column "uuid" is of type uuid but expression is of type text` on strict/default Chatwoot schemas, which had dropped every chat whose contact was newly created

---

## 🔧 Technical Improvements

### Documentation & Tooling
- Refreshed the `AGENTS.md` hierarchy for the current branch, runtime paths, Chatwoot conventions, and release workflow
- Added an `update-release-note` agent skill

### Dependency Updates
- `go.mau.fi/whatsmeow`: refreshed to latest across several updates
- Related Go dependency checksums refreshed through `go.mod` / `go.sum`

---

## What's Changed
* fix(chatwoot): use saved WhatsApp contact name instead of phone number (#688) by @aldinokemal in https://github.com/aldinokemal/go-whatsapp-web-multidevice/pull/714
* fix(chatwoot): trim whitespace from API token and URL (#674) by @aldinokemal in https://github.com/aldinokemal/go-whatsapp-web-multidevice/pull/713
* fix(chat): fall back chat-list name to phone number when empty (#675) by @aldinokemal in https://github.com/aldinokemal/go-whatsapp-web-multidevice/pull/715
* feat(api): add session_id to webhooks and jid to app responses (#578) by @aldinokemal in https://github.com/aldinokemal/go-whatsapp-web-multidevice/pull/717
* fix(media): return public URL for downloaded media by @aldinokemal in https://github.com/aldinokemal/go-whatsapp-web-multidevice/pull/716
* feat: chatwoot integration updates by @aldinokemal
* fix(send): stop retrying WhatsApp error 463 and surface it honestly by @aldinokemal
* fix(chatwoot): drop ::text cast on conversation uuid in pgimport by @aldinokemal
* chore: update whatsmeow to latest by @aldinokemal

**Full Changelog**: https://github.com/aldinokemal/go-whatsapp-web-multidevice/compare/v8.7.0...v8.8.0