v8.9.0
abus-aikorea/voice-prov8.9.0Jun 27, 2026by aldinokemal
AI Summary
This minor release focuses on improving media download reliability by persisting direct paths, introduces a selective call rejection API, and optimizes SQLite performance to reduce timeouts under heavy load. It also fixes API errors by handling missing chat rows gracefully.
Key Highlights
- Persisted WhatsApp media direct paths to ensure downloads continue working after URL expiry
- New selective call rejection API (`POST /call/reject`) with UI support
- Optimized SQLite concurrency with `CHAT_STORAGE_MAX_OPEN_CONNS` to reduce timeouts
- Graceful handling of missing chat rows, returning empty results instead of 500 errors
New Features
- Selective Call Rejection API endpoint and UI card
- Media direct path persistence and reconstruction logic
- SQLite WAL read concurrency support via environment variable
- Empty chat message responses for missing chat rows
Full Release Notes
## 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/reject` for rejecting a specific incoming call with `caller_jid` and `call_id`, using the same whatsmeow `RejectCall` path as global auto-reject
- Keeps existing `WHATSAPP_AUTO_REJECT_CALL` behavior 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_path` alongside 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_CONNS` with 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_BUSY` failures during write contention
- Documents the new environment variable in `src/.env.example`
### Empty Chat Messages for Missing Chat Rows (#740)
- `GET /chat/{jid}/messages` now 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 to `v0.0.0-20260622185415-5f04eac6dbbb`
- `github.com/vektah/gqlparser/v2`: updated to `v2.5.35`
- Related Go dependency checksums refreshed through `go.mod` / `go.sum`
### Release Metadata
- `AppVersion` is now `v8.9.0`, so runtime status matches the published release tag
---
## What's Changed
* Persist WhatsApp media direct paths for download support by @aldinokemal in https://github.com/aldinokemal/go-whatsapp-web-multidevice/pull/731
* fix(chat): return empty result instead of 500 when chat row is absent by @huutranluc694-bot in https://github.com/aldinokemal/go-whatsapp-web-multidevice/pull/740
* feat(call): add API endpoint for rejecting incoming calls by @N0N4M3BNS in https://github.com/aldinokemal/go-whatsapp-web-multidevice/pull/735
* Fix: Random API send timeouts under heavy incoming message load by @N0N4M3BNS in https://github.com/aldinokemal/go-whatsapp-web-multidevice/pull/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 https://github.com/aldinokemal/go-whatsapp-web-multidevice/pull/740
* @N0N4M3BNS made their first contribution in https://github.com/aldinokemal/go-whatsapp-web-multidevice/pull/735
**Full Changelog**: https://github.com/aldinokemal/go-whatsapp-web-multidevice/compare/v8.8.0...v8.9.0