What's New in v8.7.0
🚀 Minor Release: Presence Pulses, Quoted Media Replies, Send Retry Reliability & WhatsApp Edit Compatibility
This release adds scheduled presence pulses, lets media send endpoints quote existing messages, improves recovery from WhatsApp 463 send failures, fixes encrypted message-edit handling for newer WhatsApp clients, and preserves WhatsApp store identity after restart.
✨ New Features
Scheduled Presence Pulse (#692)
- New scheduler periodically marks connected logged-in devices as
available, then returns them tounavailable - Configurable through defaults, environment variables, CLI flags, and both REST/MCP startup paths
- Documents the behavior in the README, webhook payload docs, and example environment file
- Adds focused scheduler coverage for connected-device filtering, timing, and shutdown behavior
Quoted Media Replies (#705)
- Image, file, video, and audio send requests now accept optional
reply_message_id - Media sends reuse the existing reply-context flow, so stored messages can be quoted without changing response shapes
- Embedded media send forms and OpenAPI docs now expose the reply field
- Adds repository/wrapper support plus validation and usecase regression coverage
🐛 Bug Fixes
WhatsApp 463 Send Pre-Warm and Retry (#695)
- Detects WhatsApp reachout timelock/server error 463 and pre-warms 1:1 recipients before one retry
- Runs a WA-Web-style presence, subscribe, composing, and paused sequence bounded to 3 seconds
- Skips groups, broadcasts, newsletters, and non-463 errors so existing send paths remain unchanged
- Improves
WA_REACHOUT_TIMELOCKguidance when Meta still rejects the send
SecretEncryptedMessage Edit Compatibility (#693)
- Decrypts
SecretEncryptedMessage{MESSAGE_EDIT}envelopes sent by newer/LID-migrated WhatsApp clients - Materializes encrypted edits into the legacy
ProtocolMessage{MESSAGE_EDIT}shape for existing chat storage, webhook, and auto-reply paths - Fixes edited-message webhooks so
message.editedincludes the original message ID and edited body again - Keeps legacy-format edits unchanged and falls back to previous behavior when decryption is not possible
Preserve WhatsApp Store Identity on Restart (#706)
- Existing devices keep their persisted whatsmeow JID when loaded after restart
- Non-AD device IDs can reuse persisted AD store devices
- Optional keys DB sync now copies only the current device instead of deleting unrelated key parents
- Fixes device registration paths that could come back with an empty instance JID after restart
🔧 Technical Improvements
Runtime and Repository Hygiene
- Reorganized
.gitignoreinto logical sections and addedstatics/for runtime media, QR codes, and send items (#690) - Replaced the legacy
CLAUDE.mdguidance with scopedAGENTS.mdinstructions for the repository and key modules
Dependency Updates
go.mau.fi/whatsmeow: updated to latestgo.mau.fi/libsignal: updated to v0.2.2- Related Go dependency checksums refreshed through
go.modandgo.sum
What's Changed
- feat: add scheduled presence pulse by @aldinokemal in #692
- fix: pre-warm and one-shot retry on WhatsApp send error 463 by @aldinokemal in #695
- fix(webhook): decrypt SecretEncryptedMessage for message edits by @nasirnaqash in #693
- fix(webhook): add support for SecretEncryptedMessage edits by @aldinokemal
- chore: reorganize .gitignore and add statics/ by @fadlank-noer in #690
- feat(send): support quoted media replies by @aldinokemal in #705
- fix: preserve WhatsApp store identity on restart by @aldinokemal in #706
- chore: update whatsmeow to latest by @aldinokemal
New Contributors
- @nasirnaqash made their first contribution in #693
- @fadlank-noer made their first contribution in #690
Full Changelog: v8.6.0...v8.7.0