Repository navigation
Releases
Releases · WireCatLabs/whatsapp-cli
0.42.0
Changed — may break callers
- A
readonlylevel no longer stops a sync (cli-core 0.662.0, was 0.659.0). Commands that only fetch from
WhatsApp into the local store (sync,messages sync,contacts sync,metadata sync,store gaps repair,
--sync-first) run atreadonly;denystill refuses them. Commands that write the owner's files or call another
service stay blocked byreadonly. A profile that usedreadonlyto stop syncing sets the key todeny. - Dates in list queries read the computer's zone (cli-core 0.661.0).
todayand a bare date intasks list,
chats listand the other list queries started in UTC and now start at local midnight, as search does. - The MCP tool
messages_phototakesattachment, from 1 (cli-core 0.661.0), asattachments_showdoes. It
tookindexfrom 0.
0.41.0
Changed — may break callers
- Deleting messages no longer asks, and enabled reply rules send (cli-core 0.659.0, was 0.656.0).
messages delete
go ahead without a question or--allow-dangerous; a profile that wants the question
setsmessages.delete: ask.replies.sendis nowallow, soservesends the replies of the rules you turned on;
a new rule still starts off, andreplies.send: denystops every automatic reply. See the
cli-core changelog.
Fixed
- A shared config with a small slip is mended when it is read.
~/.config/WireCat/config.jsonwith a
byte-order mark, a comment, a trailing comma or a missing comma between two lines is fixed in place, the old file
kept beside it asconfig.json.bak-<time>. Other damage names its line, column and the likely fix.
0.40.0
Added
- The first screen lists
pbx, the Asterisk tool, under "Works with" (cli-core 0.651.0). contracts/wirecat.jsonlists the hosts cli-core reaches in any tool: npm forupgrade, the model downloads
and the hosts they redirect to (cli-base 0.99.0). WireCat Desktop shows them beside wa's own.wa guide: short scenarios (catch up, find what was said, an agent that cannot send), and a "What you can do"
block on the first help screen, as tg and max have. The repeated "Getting started" and "For agents" sections are
gone.
Changed — may break callers
- Built on cli-core 0.656.0 (was 0.651.0). See the
cli-core changelog.
Fixed
- The pages said linking stops after 45 seconds of quiet. It stops when the phone says its history is complete,
or after 5 minutes with nothing new (sessions). - A shared config that cannot be read no longer makes this tool read-only. A WireCat config
(~/.config/WireCat/config.json) with a byte-order mark, broken JSON, a folder in its place or an oldersetup
shape capped every profile at read-only, and an MCP server hidmessages sync. Now only the owner's own "read only"
answer limits a tool, and even thenmessages syncis offered over MCP: it only reads the messenger into the local
store (cli-core 0.656.0).
Security
- A run with moved folders never unlinks a device at WhatsApp.
session endthere deletes only the run's own
device keys and says to remove the device on the phone. With onlyWA_CONFIG_DIRorWA_CACHE_DIRset (or
anotherHOMEbeside your own state folder), the run reads your real linked device:session endthen answers
ended: falseand says why, andaccount removerefuses (device.owners) and deletes nothing
(sessions). - A Cloud API media download reaches only the host Meta named for it, redirects included. 0.39.0 held it to
graph.facebook.com, so a media address on any other host was refused. A fetch handed in passes the host check too.
contracts/wirecat.jsonlists wa's hosts for WireCat Desktop, and the package ships it.
0.39.0
Changed — may break callers
- Built on cli-core 0.648.0 and cli-base 0.98.0 (was 0.641.0 and 0.93.0). The store stays at version 66. Details in
cli-core's changelog. - Local only keeps every model call on this computer. With the switch on (
memo models local-only set on), wa's
model calls, remote embeddings and OpenAI transcription refuse any address that is not this computer before anything
is sent (local-only.refused). - Plain http goes only to this computer, for every model call. Enrichment, search harder, linking, reply drafts,
attachment OCR and remote embeddings refuse anhttp://address on another machine (model.address-refused); use
https, or run the model on this computer. - Voice messages are heard by the downloaded model first.
autouses the local speech model when it is downloaded
and asks the messenger only when it is not, and never under local only. - A mistyped profile is
not_found(reasonprofile.unknown) with the profiles on this computer, not a request to
link a device; a profile with a linked device counts as one here. The link hint stays in the message for a profile
that is new on purpose. stats tasks showhas no--chat: name the chat in the query,stats tasks show -- chat:"Project room".store resetis no longer offered over MCP: it needs--yes, which an MCP call cannot pass.- The Cloud API bot reaches only
graph.facebook.com. Its requests go through the host check every other request
passes.
0.38.0
Added
- Part of a name in
from:andchat:, from@wirecat/cli-core0.640.0. An unquoted value with*or?is a
pattern over names:from:Ana*finds «Ana» and «Ana Lopez»,chat:*club*every chat with it in the name. A
pattern that fits nobody fails with the nearest names; one that fits more than 50 is refused asquery.too-large. - A part inside a word in message text, from
@wirecat/cli-core0.641.0.*contract*finds «Contract»,
«contracts» and «subcontractor», also on a large store, and insideAND,ORandNOT. The part needs three
letters in a row. participants_countin queries, from@wirecat/cli-core0.638.0.participants_count<10matches messages in
chats of fewer than ten people, as WhatsApp last reported the size.- A run's log keeps the progress of
messages syncassync.progressevents, soruns showtells how far it got
and when.
Changed — may break callers
waasks WhatsApp at most 20 times a minute per profile, 10 at once (was 60 a minute, 20 at once). Every request
counts, across every process of the profile andserve: sends, edits, reactions, contact syncs and requests for
older history. A script that sends more than 10 messages in a row now waits about 3 seconds before each of the
rest.requests_per_minuteorWA_REQUESTS_PER_MINUTEchanges it (the pace).- Built on cli-core 0.641.0 (was 0.633.0). The store moves to version 66 on first open. What changed in between is
in cli-core's changelog. contacts unlinkneeds--from person:<uid>or--from person:me, the person the account leaves. Without it
the command is refused, and the error names who holds the account and the--fromto run it again with.--pauseofmessages download --all,attachments downloadandstore gaps repairis 5 seconds by default
(was 2), the same pause asmessages sync, so these commands take about twice as long.*part*in message text matches as typed, apart from case and ё/е. It no longer finds «café» for*cafe*.
Write the letter as the text has it, or search the whole word, which still ignores accents.
Fixed
- Older history comes from the phone more slowly.
messages sync <chat>asks for a page 5 to 10 seconds apart
instead of 2 to 4, as WhatsApp may ban a number that reads fast (limits). - A clock set back no longer stops
wafor hours. A computer that started with its clock ahead refused every
request to WhatsApp until the corrected clock caught up; the wait is now corrected by the size of the step. - The engine is built with Go 1.26.11, which fixes GO-2026-6859 in Go's
net/http. The engine reaches it through
whatsmeow's connection and media requests. Nothing changes in howwabehaves.
0.37.0
Added
muted:in search and stats, from@wirecat/cli-core0.633.0.muted:falseleaves out the chats you muted, so
stats messages show -- 'date>=30d muted:false'counts only what the sync still reads.stats messages responses
andstats messages waitingtake it too.store import, from@wirecat/cli-core0.633.0. Loads made-up chats, people and messages from a file marked synthetic into a test store, such as Desktop's sandbox; it refuses the owner's real store.
Changed — may break callers
- Built on cli-core 0.624.0 (was 0.618.0). The store moves to version 61 on first open (people ties, additive).
What changed in between is in cli-core's changelog. search messages --timeout 30smay search for up to about 29 seconds. It stopped at 2 seconds whatever time the
run was given, so a valid query over a large store failed in WireCat Desktop. Without--timeoutit stays 2 seconds,
for agents and MCP too.schedule pause <name>andschedule resume <name>take a schedule off its timer and keep it;schedule run
still runs it.--atrepeats:--at 08:30 --at 18:00runs twice a day.
0.36.0
Added
- A pull request adds its changelog entries as a fragment,
changes/<branch>.md. Open pull requests no longer
conflict under## Unreleased.pnpm docs:checkchecks each fragment, andbin/releasecollects them into the
version's section. An entry under## Unreleasedstill works during the move.
Fixed
wa serveexits when the build it runs is out of date, so its service starts the new one. Every minute it
checks whether the shared store moved to a format this build can no longer write, or whether a newer wa is
installed. If so it logsserve.outdatedand exits with code 3, and the systemd unit (Restart=on-failure)
starts the installed version. Before, a serve ran on 0.30.0 for a day after 0.33.0 was installed and stored nothing.- After
wa store recover run, the store marks what it held from a day before the last deep check that passed as
not fetched. WhatsApp cannot be asked for its chats, so only what the phone pushes whilewa serveruns comes
back. From cli-core 0.618.0 (was 0.616.0).
0.35.0
Added
wa account remove --keep-data|--delete-dataunlinks a profile and forgets it on this computer. It removes the
device on WhatsApp's side, then deletes the profile's device keys and folder and what cli-core keeps for it.
--keep-dataleaves the messages in the store, still searchable;--delete-datadeletes them. Other profiles stay.
A profile whose device WhatsApp already dropped is forgotten all the same. A bot profile's Business API token stays:
it is a separate account. Whilewa serveholds the profile the command refuses, likesession end.
A run with moved folders only deletes its own keys and does not unlink anything.
0.34.0
Added
contacts addandcontacts renamesave a person in your WhatsApp contacts.adduses the name WhatsApp
shows for them,renamethe name you give. It is a WhatsApp contact name: it shows on every device of the account,
and nothing is sent to the person. For someone saved in the phone's Contacts app, the phone keeps showing that
app's name. wa refuses the account's own number.contacts removeandimportstay refused.
0.33.0
Fixed
session startwaits until the phone says its history sync is done. It used to stop after 45 seconds without a
push, so a large account that paused longer was cut off while the phone was still linking, and the phone ended with
"couldn't link device" although wa had reported success. wa now ends the wait on the phone's own completion signal.
Only when the phone never sends it, wa gives up after five minutes of quiet, says so in awaitingprogress line and
asks you to keep WhatsApp open on the phone until it finishes.- The guide says a photo and a video group as one album only with text. Without a caption, a phone may show them
as two messages; with one, they were seen as one album on a phone.