What's New in v8.9.0
🚀 Minor Release: Media Direct-Path Downloads, Selective Call Rejection, SQLite Send Reliability & Empty Chat Polling
This release persists WhatsApp media direct paths so downloads keep working after URL expiry, adds a device-scoped call-reject API and UI, reduces random API send timeouts under heavy incoming message load, and returns empty chat-message responses instead of server errors when a chat row has not been stored yet.
✨ New Features
Selective Call Rejection API (#735)
- Adds
POST /call/rejectfor rejecting a specific incoming call withcaller_jidandcall_id, using the same whatsmeowRejectCallpath as global auto-reject - Keeps existing
WHATSAPP_AUTO_REJECT_CALLbehavior unchanged while enabling per-call business logic from webhook consumers - Adds a device-scoped REST handler, validation, usecase/domain wiring, and a new embedded UI card for manual call rejection
- Documents the endpoint and webhook-driven usage examples in OpenAPI and webhook payload docs
🐛 Bug Fixes
Persisted WhatsApp Media Direct Paths (#731)
- Stores WhatsApp media
direct_pathalongside legacy media URLs in chat storage - Rebuilds downloadable media from the stored direct path, with URL fallback for older rows
- Updates REST downloads, Chatwoot sync, and history-sync reconstruction to use the same downloadable-message helper
- Adds repository and utility coverage for direct-path extraction, persistence, fallback, and media reconstruction
Random API Send Timeouts Under Load (#732)
- Adds
CHAT_STORAGE_MAX_OPEN_CONNSwith a default of 5 so chat storage can use SQLite WAL read concurrency instead of serializing all device, webhook, API, and worker access through one connection - Applies the configured connection count to both open and idle chat-storage connections, clamped to a minimum of 1 for operators who need the previous behavior
- Raises the CGO SQLite busy timeout from 5s to 30s, matching the purego build and reducing
SQLITE_BUSYfailures during write contention - Documents the new environment variable in
src/.env.example
Empty Chat Messages for Missing Chat Rows (#740)
GET /chat/{jid}/messagesnow treats a missing chat row as an empty conversation instead of returning HTTP 500- Returns the normal empty pagination shape with minimal chat info for brand-new or not-yet-upserted chats
- Keeps existing behavior unchanged for chats that are already present in storage
🔧 Technical Improvements
Dependency Updates
go.mau.fi/whatsmeow: refreshed tov0.0.0-20260622185415-5f04eac6dbbbgithub.com/vektah/gqlparser/v2: updated tov2.5.35- Related Go dependency checksums refreshed through
go.mod/go.sum
Release Metadata
AppVersionis nowv8.9.0, so runtime status matches the published release tag
What's Changed
- Persist WhatsApp media direct paths for download support by @aldinokemal in #731
- fix(chat): return empty result instead of 500 when chat row is absent by @huutranluc694-bot in #740
- feat(call): add API endpoint for rejecting incoming calls by @N0N4M3BNS in #735
- Fix: Random API send timeouts under heavy incoming message load by @N0N4M3BNS in #732
- chore: update whatsmeow to latest by @aldinokemal
- chore: bump version to v8.9.0 by @aldinokemal
New Contributors
- @huutranluc694-bot made their first contribution in #740
- @N0N4M3BNS made their first contribution in #735
Full Changelog: v8.8.0...v8.9.0