New features
Chat labels API Manage WhatsApp chat labels (etiquetas) from Rust.client.labels() exposes create_label, delete_label, add_chat_label, and remove_chat_label, all synced across linked devices through the regular app state collection. Inbound label changes made on a linked device are delivered as the new Event::LabelEditUpdate and Event::LabelAssociationUpdate events, each carrying the underlying action and a from_full_sync flag. See Labels and the new event types in Events.
send_app_state_action API
Send any syncd action — including ones without a dedicated helper like clear_chat, favorites, or quick_reply — directly from a schema in the new whatsapp_rust::schemas registry. The schema picks the collection, action version, and index shape; you only fill in the typed SyncActionValue and the non-literal index args. The existing typed methods on ChatActions and Labels are now thin wrappers over this same call. See send_app_state_action.
Updates
query_info returns Arc<GroupInfo>
client.groups().query_info() now returns Result<Arc<GroupInfo>, anyhow::Error> instead of Result<GroupInfo, anyhow::Error>. Repeated lookups for the same group share the same cached snapshot, so warm sends to groups no longer deep-clone the participants list or LID-to-phone map. This is a breaking change for direct callers — bind the result as Arc<GroupInfo> and reach through info.participants / info.lid_to_pn_map() as before. See query_info and the Group management guide.
Fixes
Message edits now use WhatsApp Web’s wire shapeclient.edit_message previously wrapped the new content in a nested Message.edited_message (FutureProofMessage) envelope — the history/storage form — which other clients did not always render. Edits are now sent as a top-level protocolMessage with type = MESSAGE_EDIT, matching WhatsApp Web, and use a fresh stanza ID so the server does not deduplicate the edit against the original message. The public signature is unchanged; rebuild against the latest release to pick up the fix. If you were hand-rolling the legacy envelope and passing it to send_message, switch to client.edit_message — see the Sending messages guide.