v0.9.2

Michael-A-Kuykendall/shimmyv0.9.2May 17, 2026by github-actions[bot]

AI Summary

This release introduces new WhatsApp status broadcast features alongside significant security hardening and fixes for media handling, history sync, and polling.

Key Highlights

  • Added `wacli send status` command for text and media statuses
  • Implemented security measures for link previews and webhook validation
  • Fixed media size limits and history sync for edited messages
  • Improved poll support with single-select creation

New Features

  • WhatsApp status broadcast command
  • Persistent storage for status messages
  • Webhook URL validation and privacy controls

Full Release Notes

## Changelog

### Added

- Send: add `wacli send status` for WhatsApp status broadcasts, including text statuses with optional background/font and media statuses with captions. (#247 - thanks @dovocoder)
- Store: persist synced and locally sent status broadcasts separately in `status_messages` instead of mixing them into normal chat messages.

### Security

- CI: pin GitHub Actions and Docker base images to immutable refs and pin GoReleaser to an exact version.
- Send: block automatic link previews from fetching localhost, private, link-local, multicast, and other non-public addresses.
- Sync: validate webhook URLs, redact webhook errors, disable private-network webhook targets by default, and add `--webhook-allow-private` for trusted local endpoints.

### Fixed

- Accounts: serialize account config mutations with a config lock and save through unique temporary files.
- CLI: strip terminal control characters from human/table/error output.
- CLI: open the local store through SQLite read-only mode for `--read-only` commands instead of initializing writer state.
- Media: enforce regular-file and size limits for sends, stickers, voice notes, profile pictures, contacts imports, thumbnails, and unknown-length downloads.
- Messages: make `--delete-media --for-me` remove the stored local media file when present.
- Store: count all chats and groups in `store stats` instead of the first 50 entries.
- Sync: warn when bootstrap contact/group/channel refresh fails instead of silently ignoring it.
- Sync: bound each webhook delivery request so shutdown is not stuck behind a slow endpoint.
- History: unwrap edited WhatsApp messages during history sync and backfill so stored/searchable text shows the edited body instead of `(message)`. (#246 - thanks @hiasinho)
- Polls: use WhatsApp's single-select poll creation field for outbound single-select polls and preserve unmatched poll vote hashes in `poll show --json`. (#248 - thanks @dovocoder)
- Sync: canonicalize `@lid` chat JIDs before enqueuing media downloads so `sync --follow --download-media` finds the correct DB row for live one-to-one messages. (#244 - thanks @Daniel1of1)