Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
452 commits
Select commit Hold shift + click to select a range
3a7fdf8
Updater: keep WinZapp's npm out of the user's npm, relaunch without e…
rfiorentino1 Oct 10, 2026
430b4ef
Merge main into fix/npm-etarget-stale-cache
claude Oct 10, 2026
b4dca68
Adding the Incomum Groups tab to contact details. (#455)
pedro-hdias Oct 10, 2026
fdff81b
Merge pull request #459 from gabrielhhaber/fix/npm-etarget-stale-cache
gabrielhhaber Oct 10, 2026
10ddd7a
Fix "Attempt to exit a non-running event loop" on late modal completi…
gabrielhhaber Oct 10, 2026
f3c8832
Fix WPPConnect update startup validation and show copyable error details
Ed-Fe Oct 10, 2026
4e5f903
Place WPPConnect error report entry in release news list
Ed-Fe Oct 10, 2026
7b558f2
Fix lost accents in translations and docs path check for WPPConnect u…
claude Oct 11, 2026
e2e0d77
Comunidades: leitura e envio acessíveis de respostas aos avisos (#460)
Ed-Fe Oct 11, 2026
13e39af
Merge origin/main into claude/project-thread-vu6lx2
claude Oct 11, 2026
6dcf552
CLAUDE.md: recomendar PR separado para entradas de changelog ao mescl…
gabrielhhaber Oct 11, 2026
f2ec5ee
Merge pull request #463 from gabrielhhaber/claude/project-thread-vu6lx2
gabrielhhaber Oct 11, 2026
ee96074
PR de fork com ajustes vira PR novo no repositório; permissões de mer…
gabrielhhaber Oct 11, 2026
6964a1a
macOS: update through Sparkle 2, gated by the official release tag
rfiorentino1 Oct 11, 2026
5e07acc
macOS Sparkle: review fixes (404-only empty feed, appcast tags via en…
claude Oct 11, 2026
5319753
Changelog: macOS updates through Sparkle 2, in every locale
claude Oct 11, 2026
1aa50ad
macOS Sparkle: move the account/slot/verdict logic to a pure module
claude Oct 11, 2026
38fef05
macOS Sparkle: release patch rebased on the current mac-releases, cha…
claude Oct 11, 2026
a7a6c39
Merge pull request #466 from rfiorentino1/feature/macos-sparkle-updates
gustavo-barrios2006 Oct 11, 2026
5b2c1a6
Transcription: hand faster-whisper the decoded WAV instead of a path
claude Oct 11, 2026
de2cc91
Transcription tab: Alt keys on every button, verify lands on the resu…
claude Oct 11, 2026
3f2cb66
Transcription tab: cancel a background download, mark models in the l…
claude Oct 11, 2026
74757a2
Voice messages: Ctrl+Shift+T puts the transcription in the message's …
claude Oct 11, 2026
9ca4e02
Move the inline-transcription key from Ctrl+Shift+T (locks a chat) to…
claude Oct 11, 2026
6447103
Updater: remove the extracted release from %TEMP% after installing, a…
claude Oct 11, 2026
44cafae
Messages: Alt+Shift+J / Alt+Shift+O jump to the next mention / next r…
claude Oct 11, 2026
c5d0e99
Messages: ten configurable shortcuts to review the last ten messages …
claude Oct 11, 2026
9a0917f
Forwarding: say a successful forward to the screen reader instead of …
claude Oct 11, 2026
038a5cf
Sync: limit the pools' get-messages calls to two at a time
claude Oct 11, 2026
2f6dd1c
Transcription cache per model, with a button to clear one model's sav…
claude Oct 11, 2026
3d57a94
Settings: keep the clear-cache button's label in the relabel audit
claude Oct 11, 2026
d9a4809
Transcription: keep the model loaded in memory (option, off by default)
claude Oct 11, 2026
7ce4b03
Transcription: reuse CUDA libraries and whisper.cpp programs download…
claude Oct 11, 2026
482692e
Transcription: optionally transcribe received voice messages on arriv…
claude Oct 11, 2026
c948f1c
Encaminhar: seta para baixo na pesquisa vai ao primeiro resultado e f…
claude Oct 11, 2026
f985aa6
Add a "Profile picture" button to the chat and group data dialog
claude Oct 11, 2026
77aa1d6
Merge remote-tracking branch 'origin/main' into claude/project-thread…
claude Oct 11, 2026
412d489
Profile picture: review follow-ups
claude Oct 11, 2026
4001348
Merge pull request #467 from gabrielhhaber/claude/project-thread-xf4bw2
gabrielhhaber Oct 11, 2026
2809319
Profile picture: test the Open-with fallback
claude Oct 11, 2026
3560c9c
Merge pull request #468 from gabrielhhaber/claude/project-thread-fu8vh8
gabrielhhaber Oct 11, 2026
7b8ae36
Strip the companion-device suffix from LIDs so sending to oneself works
claude Oct 11, 2026
51ffe2c
Normalize the persisted self LID and test mapping registration
claude Oct 11, 2026
96f8396
Strip the device suffix with a pure helper so stubs need no _normaliz…
claude Oct 11, 2026
7cacb55
Add jid_device helper and use it where stubs lack _normalize_jid
claude Oct 11, 2026
2ed700e
Strip the device suffix from the participant before learning my_lid
claude Oct 11, 2026
0199434
Merge pull request #470 from gabrielhhaber/claude/self-send-lid-devic…
gabrielhhaber Oct 11, 2026
9612db6
Send and read polls
claude Oct 11, 2026
163d1f9
Show a progress bar per poll option
claude Oct 11, 2026
1c31511
Never speak unknown poll votes as zero
claude Oct 11, 2026
715f4b2
Teach the localized-preview test the poll row keys
claude Oct 11, 2026
bdd2669
Poll vote counts: 0 votes, 1 vote, N votes
claude Oct 11, 2026
845489d
Vote in polls and show real vote counts
claude Oct 11, 2026
4a7acce
Type the poll runtime's own-vote set so the API compiles
claude Oct 11, 2026
ee90a5b
Make the poll runtime functions self-contained for Puppeteer
claude Oct 11, 2026
63452b1
Transcription: cache switch, per-model cache choice and a button to c…
claude Oct 12, 2026
54c3b23
Vote on single-answer polls from the message list
claude Oct 12, 2026
e48f4f4
Make the inline poll options list safe to leave and to fail
claude Oct 12, 2026
b84eeef
Refresh the translation catalogs for the poll options list
claude Oct 12, 2026
54fa389
Give the message-list test stubs the inline poll hooks
claude Oct 12, 2026
02f326a
Merge pull request #471 from gabrielhhaber/claude/polls-cvyycf
gabrielhhaber Oct 12, 2026
1f7d977
Transcription: transcribe videos from their sound track, with every o…
claude Oct 12, 2026
bbae243
Show who voted what in polls and each option's share of the votes
claude Oct 12, 2026
42e344e
Bulk transcription of the selected messages, in both ways a single on…
claude Oct 12, 2026
46f3101
Merge origin/main into claude/brave-goldberg-9d8rnx
claude Oct 12, 2026
6ae86b6
Test the poll vote-refresh logic of the panel
gabrielhhaber Oct 12, 2026
2b00cf7
Name poll voters the way message senders are named
claude Oct 12, 2026
878ef64
Poll voters: name them from WhatsApp Web's contact when the client ca…
gabrielhhaber Oct 12, 2026
e5ae717
Tests: fix three tests this branch left wrong
claude Oct 12, 2026
4376fc3
Refresh the translation catalogs after the voter naming change
claude Oct 12, 2026
1dfc3fc
Merge pull request #472 from gabrielhhaber/claude/polls-followup
gabrielhhaber Oct 12, 2026
d8d559b
Review fixes, slice 1 (transcription settings and runtime)
claude Oct 12, 2026
e42b292
Slice 1 nits: stranded-focus check before hiding Cancel; pt-BR wording
claude Oct 12, 2026
aac655d
Fix group actions and add invitation QR, preview and join dialogs (fr…
gabrielhhaber Oct 12, 2026
91befd6
Inline poll list: update the voted option's count and label the list …
claude Oct 12, 2026
65cc547
Refresh the translation catalogs for the poll options label
claude Oct 12, 2026
f47d80a
Merge pull request #475 from gabrielhhaber/claude/poll-inline-fixes
gabrielhhaber Oct 12, 2026
6bc3457
Describe videos from a single frame and describe photo and video stat…
claude Oct 12, 2026
c426071
Merge main into describe video/status branch
claude Oct 12, 2026
d82210a
Keep the status panel tests in step with the Describe button
claude Oct 12, 2026
3f280cd
Let Ctrl+Shift+V and Ctrl+Alt+Shift+V place calls from the message field
claude Oct 12, 2026
71fd242
Merge pull request #476 from gabrielhhaber/claude/project-thread-tkxl9p
gabrielhhaber Oct 12, 2026
8cc7a59
Merge pull request #477 from gabrielhhaber/claude/project-thread-mlkirx
gabrielhhaber Oct 12, 2026
64910b5
Review fixes, slice 2 (storing, showing and producing transcriptions)
claude Oct 12, 2026
043d28d
Slice 2 nits: keep other models on a tied sync, redraw only the own c…
claude Oct 12, 2026
efbd7a6
fix(updater): serialize cancellation and installer handoff
m-enes-senovali Oct 12, 2026
3b6e588
Pin WPPConnect Server 2.10.48
claude Oct 12, 2026
cc14937
fix(updater): preserve installer script write errors
m-enes-senovali Oct 12, 2026
49305b4
Review fixes, slice 3: review keys with no default, changelog, behavi…
claude Oct 12, 2026
3b77f0a
Slice 3 nits: Polish changelog quotes the real sentence; installer te…
claude Oct 12, 2026
6c58a9c
Merge origin/main into claude/brave-goldberg-9d8rnx
claude Oct 12, 2026
e1ebd15
test(updater): verify prompt release through install completion
m-enes-senovali Oct 12, 2026
bc93a64
Transcription tab: report a job that never started by the caller's ac…
claude Oct 12, 2026
d7b64b2
Merge pull request #478 from m-enes-senovali/fix/updater-install-handoff
gabrielhhaber Oct 12, 2026
42ea2b8
Merge origin/main into claude/brave-goldberg-9d8rnx
claude Oct 12, 2026
a7e6c0c
Transcription tab: start a job with the arguments it had before the b…
claude Oct 12, 2026
2995f08
Merge pull request #479 from gabrielhhaber/claude/brave-goldberg-9d8rnx
gabrielhhaber Oct 12, 2026
b6cd30f
Update Polish translation
djgraco Oct 13, 2026
2f9e017
Fix history replay ordering and sync alias outcomes
m-enes-senovali Oct 13, 2026
7de68bf
Polish: use 'prywatnych' and 'członek', align changelog with 'zabezpi…
claude Oct 13, 2026
4a549d1
Bind historical call-log test stub to canonical merge
m-enes-senovali Oct 13, 2026
a1fbc80
Merge pull request #481 from djgraco/polish-translation
gustavo-barrios2006 Oct 13, 2026
447a9c9
Address review of history replay ordering
claude Oct 13, 2026
32da4b1
Merge pull request #480 from m-enes-senovali/fix/history-replay-sync-…
gabrielhhaber Oct 13, 2026
53c69ee
Speak sync and media-download progress every few seconds
reffehcsoibaf Oct 13, 2026
47237fb
Add Spoken content boxes for the chat-sync and media progress
reffehcsoibaf Oct 13, 2026
4b9c995
Show a verified business's name instead of its phone number
reffehcsoibaf Oct 13, 2026
36a0f7f
Completa a lista de países do pareamento e localiza os nomes em todos…
claude Oct 13, 2026
d54d77e
Merge pull request #483 from gabrielhhaber/claude/project-thread-c09mv7
gabrielhhaber Oct 13, 2026
a0a111d
Address review of sync progress announcements
claude Oct 13, 2026
88155dd
Polish sync progress changelog wording and guard every round speaks
claude Oct 13, 2026
bcd9f57
fix(updater): guard codec failures and require explicit alpha consent
m-enes-senovali Oct 13, 2026
9d243d0
Handle missing reply quotes before sending and preserve recovery text
m-enes-senovali Oct 13, 2026
cd0781a
feat: WhatsApp settings window with the account's Privacy tab
reffehcsoibaf Oct 13, 2026
76f0199
fix(privacy): accessible Status picker, @lid audience ids, list read-…
reffehcsoibaf Oct 13, 2026
14d2be0
Merge remote-tracking branch 'origin/main' into claude/pr-484-fixes
claude Oct 13, 2026
d796134
Address review of the verified business name
claude Oct 13, 2026
4d06daa
Address review of the updater codec and alpha consent fix
claude Oct 13, 2026
d1beb8f
Address review of the missing reply quote recovery
claude Oct 13, 2026
15047ba
Address review of the WhatsApp settings Privacy tab
claude Oct 13, 2026
e446d3c
Status picker: look up a non-contact's name like the rest of the app
claude Oct 13, 2026
551a153
Test that a failed manual check speaks once, not once per quick retry
claude Oct 13, 2026
3ba5c58
Changelog: describe the update fix by what a stable user notices
claude Oct 13, 2026
365c9da
Drop a sent reply's recovery copy instead of storing it forever
claude Oct 13, 2026
ddb93ee
Merge pull request #482 from reffehcsoibaf/feat/sync-progress-announc…
gustavo-barrios2006 Oct 13, 2026
e4b1d89
Also drop the recovery copy when a cancelled reply was delivered anyway
claude Oct 13, 2026
60d92db
Merge pull request #484 from reffehcsoibaf/feat/verified-business-name
gustavo-barrios2006 Oct 13, 2026
d0f9187
Merge pull request #485 from m-enes-senovali/fix/updater-codec-alpha-…
gustavo-barrios2006 Oct 13, 2026
467abe9
Merge remote-tracking branch 'origin/main' into claude/pr-487-fixes
claude Oct 13, 2026
8a03eaa
Merge remote-tracking branch 'origin/main' into claude/pr-486-fixes
claude Oct 13, 2026
be9f475
Merge pull request #486 from m-enes-senovali/fix/quoted-reply-not-found
gustavo-barrios2006 Oct 13, 2026
f4540c1
Merge pull request #487 from reffehcsoibaf/feat/whatsapp-privacy-tab
gustavo-barrios2006 Oct 13, 2026
8f6a45d
Show mute state and disappearing-messages timer in the personal chat …
claude Oct 14, 2026
dda3e2f
Changelog: mute state and disappearing messages in the personal chat …
claude Oct 14, 2026
d2801ea
Merge pull request #489 from pedro-hdias/main
gabrielhhaber Oct 14, 2026
7743842
Novos recursos e correções: Comunidades, Carrinhos/Pedidos, Transcriç…
gustavo-barrios2006 Oct 14, 2026
57d0015
Comunidades na lista de navegação, após Ligações (#495)
gabrielhhaber Oct 14, 2026
4b8a5c6
Add the Profile tab to File > WhatsApp settings: name, About and phot…
reffehcsoibaf Oct 14, 2026
4cc672f
Add the pt-BR usage guide (docs/guia-de-uso), covering alpha 2.1.0.4395
reffehcsoibaf Oct 14, 2026
4c8e76a
docs: guia de uso em 7 idiomas, atualizado até a alpha 4397
reffehcsoibaf Oct 14, 2026
9fb05cb
Add Help > Usage guide, a complete user guide in all 7 languages
reffehcsoibaf Oct 14, 2026
9c3fe69
Open the usage guide in the default browser instead of an in-app window
reffehcsoibaf Oct 14, 2026
d56f190
Require the usage guide to be up to date before an alpha can ship
reffehcsoibaf Oct 14, 2026
4d36c98
Fix build test namespace, announce when the usage guide cannot open, …
claude Oct 14, 2026
4dced69
Merge pull request #497 from gabrielhhaber/claude/guia-de-uso-496
gabrielhhaber Oct 14, 2026
9acac11
Strip the full PKCS#7 padding block from decrypted media
Ed-Fe Oct 15, 2026
3f7d314
Profile tab opens with the current values; Ctrl+Shift+comma opens Wha…
claude Oct 15, 2026
a079f99
Merge pull request #498 from Ed-Fe/fix-decrypt-padding
gabrielhhaber Oct 15, 2026
a6b1cb9
Adiciona ao changelog a correção do padding de mídias baixadas (#498)
claude Oct 15, 2026
6bdc796
Merge pull request #499 from reffehcsoibaf/feat/whatsapp-profile-curr…
gabrielhhaber Oct 15, 2026
1c49157
Merge remote-tracking branch 'origin/main' into claude/changelog-498
claude Oct 15, 2026
795edad
Cobre no guia de uso o item de changelog do padding de mídias baixadas
claude Oct 15, 2026
796dc4f
Merge pull request #500 from gabrielhhaber/claude/changelog-498
gabrielhhaber Oct 15, 2026
794e0ff
Show the encryption and disappearing-messages notices of a new person…
claude Oct 15, 2026
a94993c
Changelog and usage guide: notices of a new personal chat
claude Oct 15, 2026
5ea8078
Online transcription: button to put the result in the message's line
reffehcsoibaf Oct 15, 2026
83568b7
Regenerate translation catalogs for ai_put_in_line
reffehcsoibaf Oct 15, 2026
c0c65f6
Descriptions of pictures, stickers and videos can go in the message's…
reffehcsoibaf Oct 15, 2026
d272e79
Automatic online transcription and description of received messages
reffehcsoibaf Oct 15, 2026
b33f9dc
Per-conversation switches for the automatic transcription and descrip…
reffehcsoibaf Oct 15, 2026
6ea8c33
Scope for the automatic transcription and description: all conversati…
reffehcsoibaf Oct 15, 2026
592bbee
Scope choice label ends with a colon so a screen reader separates it …
reffehcsoibaf Oct 15, 2026
5cfe903
Age limit and request ceiling for the automatic transcription and des…
reffehcsoibaf Oct 15, 2026
6641e8f
Media cleanup: delete downloaded media files of chosen conversations …
reffehcsoibaf Oct 15, 2026
4c46907
Fix CI for online transcription in the message line and add the chang…
claude Oct 15, 2026
856311b
Media cleanup: an index so cleaned media does not come back
reffehcsoibaf Oct 15, 2026
21d1610
Reflow two condition lines left on one line by a merge
claude Oct 15, 2026
fbc42cf
Media cleanup index: F5 keeps it, only a logout or a new pairing clea…
reffehcsoibaf Oct 15, 2026
528253f
Cover online transcription in the message line in the usage guide and…
claude Oct 15, 2026
b5396d4
Use czat in the Polish media cleanup strings; add changelog and usage…
claude Oct 15, 2026
7aec49a
Merge pull request #504 from gabrielhhaber/claude/project-thread-w1m04y
gabrielhhaber Oct 15, 2026
e256dde
Merge origin/main into media cleanup
claude Oct 15, 2026
62bc669
Remove conflict markers left in the changelogs; use czat in Polish cl…
claude Oct 15, 2026
2a54fa6
Merge pull request #506 from gabrielhhaber/claude/media-cleanup-505
gabrielhhaber Oct 15, 2026
41545e6
macOS: background updates, faster updates, VoiceOver list fixes
rfiorentino1 Oct 16, 2026
a5a2469
wa-js 4.7.1: sending voice messages and documents works again on the …
reffehcsoibaf Oct 16, 2026
014d807
wppconnect 2.3.5: keep the pairing and injection patches working on t…
claude Oct 16, 2026
028f212
Fix a literal newline in the upgrade notes
claude Oct 16, 2026
8411056
macOS: move the install-on-quit logic out of sparkle_mac into install…
claude Oct 16, 2026
23a13fd
Register the voice/document send fix in the usage-guide coverage
claude Oct 16, 2026
8d74748
Merge pull request #510 from gabrielhhaber/claude/project-thread-v1aaqz
gabrielhhaber Oct 16, 2026
4bcfcb7
Merge origin/main into the wppconnect 2.3.5 branch
claude Oct 16, 2026
d494222
Merge pull request #509 from gabrielhhaber/claude/wppconnect-2.3.5-wa…
gabrielhhaber Oct 16, 2026
b937072
macOS: a chat list row opens the chat it shows after rows moved
rfiorentino1 Oct 16, 2026
1171c4b
macOS: a button's mnemonic no longer takes a Command shortcut
rfiorentino1 Oct 16, 2026
ceb8d49
Changelog: add the intermediate V2.0.1.0 stable release section
claude Oct 16, 2026
f7aecdc
Merge pull request #513 from gabrielhhaber/claude/main-changelog-2.0.1.0
gabrielhhaber Oct 16, 2026
fa4aa5f
CI: stop bumping main's version.py when a stable release is published
claude Oct 16, 2026
ceab3ee
Docs: fix stale release-published mention and the post-release versio…
claude Oct 16, 2026
af6fe13
Merge remote-tracking branch 'origin/main' into claude/macos-chat-row…
claude Oct 16, 2026
93816cf
Register the macOS button-key fix in the usage guide and separate its…
claude Oct 16, 2026
4938440
Merge main into PR 512 branch
claude Oct 16, 2026
b49d86e
Merge pull request #515 from gabrielhhaber/claude/remove-release-vers…
gabrielhhaber Oct 16, 2026
a022375
Merge pull request #516 from gabrielhhaber/claude/macos-chat-rows-and…
gabrielhhaber Oct 16, 2026
c4ee244
Merge pull request #517 from gabrielhhaber/claude/project-thread-afbomc
gabrielhhaber Oct 16, 2026
408c12b
Decodifica entidades HTML nas prévias de links no envio e na leitura
claude Oct 16, 2026
740d3d7
Caption field of attachments accepts several lines
claude Oct 16, 2026
4ede8be
Fix echo cancellation doing nothing on answered calls
claude Oct 16, 2026
44b7648
Merge origin/main into caption multiline branch
claude Oct 16, 2026
905dee0
Precede names of unsaved contacts with a tilde (~)
claude Oct 16, 2026
65131cb
Polish wording: czaty for the unsaved-contact setting
claude Oct 16, 2026
c6fab49
Merge origin/main into claude/unsaved-contact-tilde
claude Oct 16, 2026
9c4d465
Guia de uso: descreve a decodificação de entidades HTML nas prévias d…
claude Oct 16, 2026
6fef2f5
Cover the multiline caption in the usage guide and update the single-…
claude Oct 16, 2026
3630e03
Register the echo cancellation fix in the user guide coverage
claude Oct 16, 2026
7558325
Fix CI: user guide entry, settings load, stub-safe chat row helper, t…
claude Oct 16, 2026
32ed812
Merge pull request #518 from gabrielhhaber/claude/project-thread-70ome3
gabrielhhaber Oct 16, 2026
24265d5
Fix chat list serialization across the Puppeteer boundary
viniciusSiqueira195 Oct 16, 2026
95ae25c
Merge pull request #519 from gabrielhhaber/claude/project-thread-k5qdyo
gabrielhhaber Oct 16, 2026
4d1fca6
Merge main into the echo cancellation fix
claude Oct 16, 2026
124b425
Merge origin/main into claude/unsaved-contact-tilde
claude Oct 16, 2026
aa74568
Merge pull request #520 from gabrielhhaber/claude/project-thread-vq7dgs
gabrielhhaber Oct 16, 2026
026ef45
Merge pull request #521 from gabrielhhaber/claude/unsaved-contact-tilde
gabrielhhaber Oct 16, 2026
f103e9f
Guia de uso: descreve a correção da ressincronização da lista de conv…
claude Oct 16, 2026
9ba7c68
Merge pull request #523 from gabrielhhaber/claude/project-thread-sid2r3
gabrielhhaber Oct 16, 2026
037f7a4
Corrige ordem e retomada da presença online da conta
Ed-Fe Oct 16, 2026
46a7c6e
Avoid hidden media downloads and coalesce transfer progress updates
viniciusSiqueira195 Oct 16, 2026
2688c2e
Guia de uso: descreve a presença online que acompanha a janela
claude Oct 16, 2026
cffb25f
Guia de uso: descreve a correção de downloads indevidos e do acúmulo …
claude Oct 16, 2026
e47f059
Merge pull request #526 from gabrielhhaber/claude/project-thread-sqg7u7
gabrielhhaber Oct 16, 2026
a6d1ce0
Merge origin/main into claude/project-thread-8h7il0
claude Oct 16, 2026
e0b9324
Merge pull request #527 from gabrielhhaber/claude/project-thread-8h7il0
gabrielhhaber Oct 16, 2026
b7a498f
Fix CUDA library preparation before faster-whisper inference
zersiax Oct 17, 2026
ede6eae
Fix cached-chat lookup selecting the wrong WhatsApp module
zersiax Oct 17, 2026
3636947
Removing an account removes everything it owns, and the only account …
reffehcsoibaf Oct 17, 2026
dca2d17
Guia de uso: descreve a correção do carregamento do CUDA no Windows
claude Oct 17, 2026
ffddcdb
Merge pull request #535 from gabrielhhaber/claude/pr529-cuda-guide
gabrielhhaber Oct 17, 2026
8e52783
Merge main into account removal
claude Oct 17, 2026
8934789
Account removal: refresh catalogs, formal Romanian, changelog, exit-p…
claude Oct 17, 2026
eef82ce
User guide: describe removing an account, including the only one
claude Oct 17, 2026
6b1dceb
Merge pull request #537 from gabrielhhaber/claude/project-thread-k2lbks
gabrielhhaber Oct 17, 2026
c097618
Account removal: fix Romanian register and menu labels quoted in chan…
claude Oct 17, 2026
9bdf8a2
Merge pull request #539 from gabrielhhaber/claude/fix-account-removal…
gabrielhhaber Oct 17, 2026
a56c652
Guia de uso: descreve a correção do erro "chat not found" ao enviar
claude Oct 18, 2026
e730c5f
Guia de uso: ajusta o vocabulário do polonês e do romeno na linha nova
claude Oct 18, 2026
359a40f
Settings: option to play voice messages in sequence automatically
claude Oct 18, 2026
1b56a28
Add the new voice-sequence setting to settings_default.json
claude Oct 18, 2026
912fb65
Merge pull request #541 from gabrielhhaber/claude/auto-play-voice-seq…
gabrielhhaber Oct 18, 2026
862b70d
Merge origin/main into claude/pr530-user-guide
claude Oct 18, 2026
fe3f128
Merge pull request #540 from gabrielhhaber/claude/pr530-user-guide
gabrielhhaber Oct 18, 2026
0bedffa
WPPConnect Server 2.10.58: portar as mudanças para os arquivos sobres…
gabrielhhaber Oct 18, 2026
4fb6420
WPPConnect Server: instalar e oferecer só a versão fixada (#543)
gabrielhhaber Oct 18, 2026
32596c5
WPPConnect Server: oferecer versões aprovadas para o pin de cada buil…
gustavo-barrios2006 Oct 18, 2026
18155db
Changelog: add the V2.0.2.0 stable release notes between 2.1.0.0 and …
gabrielhhaber Oct 18, 2026
0b85f08
Changelog: V2.0.2.0 keeps the installed WPPConnect Server on a WinZap…
gabrielhhaber Oct 18, 2026
5566c5c
Remove the Communities feature (code, API patches, tests, docs)
claude Oct 21, 2026
56ccd4a
Remove the Communities strings from every translation catalog
claude Oct 21, 2026
fb41518
Changelogs: V2.1.0.0 section without Communities
claude Oct 21, 2026
66dfddd
Remove Communities from the user guide, coverage record and test fixt…
claude Oct 21, 2026
624093b
Release 2.1.0.0: bring the 2.1 cycle from main (without Communities a…
claude Oct 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .claude/agents/winzapp-implementer.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ uv run pytest tests/test_<what you touched>.py
```

Run the test files for what you changed. CI runs the whole suite on every PR;
run `uv run pytest -n auto` locally only for a cross-cutting change. Never pass
run `uv run pytest` serially, at most once, locally only for a cross-cutting change. Never pass
`--run-wx-gui`.

Hand the diff to `winzapp-reviewer` before opening a PR. Report what you did,
Expand Down
9 changes: 5 additions & 4 deletions .claude/agents/winzapp-reviewer.md
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ for n, line in enumerate(open(sys.argv[1], encoding="utf-8", errors="replace"),
EOF
```

Non-Latin letters are normal inside `client/languages/*.json` string values
Non-Latin letters are normal inside `translations/**/*.po` string values
and the changelogs; they are a finding anywhere else, and a `Cf` character
(bidi control, zero-width) is a finding everywhere.

Expand Down Expand Up @@ -197,12 +197,13 @@ release before.
correlation ID and is matched to a pending virtual message **by message
type**. Changing that matching swaps real WhatsApp IDs between unrelated
messages — wrong status, wrong audio played.
- **Every locale.** Any user-facing string exists in every file named by
- **Every locale.** Any user-facing string exists in every catalog
(`translations/<locale>/LC_MESSAGES/winzapp.po`) named by
`language_map.json`, with matching `{}` placeholders and `&&` for a
literal ampersand.
- **Established terminology.** A new or changed value uses the words its own
locale file already uses for that concept — grep the file to check. Flag a
synonym that diverges (e.g. Polish `rozmowa` where `pl.json` settled on
locale catalog already uses for that concept — grep the PO to check. Flag a
synonym that diverges (e.g. Polish `rozmowa` where the Polish catalog settled on
`czat` in f292049f): existing terms were chosen by native speakers, and no
test catches the drift.
- **Screen reader.** Plain wx controls; all speech through
Expand Down
2 changes: 1 addition & 1 deletion .claude/rules/screen-reader-speech.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,6 @@ paths:

**Read `docs/traps/screen-reader-speech.md` before changing these files.** Short form:

Suppressing a focus announcement is done by the focus cloak (MSAA state without FOCUSED, disarmed after ~500 ms), never by cancelling speech. A list row must not be rewritten while focus is moving off it — hold repaints and release them when the sequence ends.
Suppressing a focus announcement is done by the focus cloak (MSAA state without FOCUSED, disarmed after ~500 ms), never by cancelling speech. A list row must not be rewritten while focus is moving off it — during a voice-note sequence hold the repaints of the focused row and of the row the chain just left (only those: `core/chain_repaint_guard.py`) and release them when the sequence ends or is paused.

Switching to a chat panel (Alt+1, Alt+4, locked, navigation list) goes through `show_chat_panel()` only: a real switch from another panel hides the open conversation's pane (the conversation stays open, never reshown by a switch: that was a perceptible delay), but pressing Alt+1/Alt+4 inside the panel the conversation is already visible in switches nothing and keeps it (`keep`), focuses the panel's chat list (never a message list), and never rebuilds, loads or requests anything. The conversation returns only on an explicit ask (Alt+M, Alt+2, Alt+3: `reveal_open_conversation()`, in the panel it belongs to) or by opening a chat.
22 changes: 22 additions & 0 deletions .claude/rules/transcription.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
---
paths:
- "client/core/transcription/**"
- "client/ui/transcription_flow.py"
- "client/ui/dialogs/transcription_*.py"
- "client/main_window/transcription_store.py"
- "client/main_window/transcription_background.py"
- "client/main_window/auto_transcription.py"
- "client/ui/conversation_panel/bulk_transcription.py"
- "client/ui/conversation_panel/accelerators.py"
- "client/ui/conversation_panel/message_accels.py"
- "client/ui/conversation_panel/message_menu.py"
- "client/core/tls_trust.py"
- "client/core/database.py"
- "tests/test_transcription_*.py"
---

# Local transcription

**Read `docs/traps/transcription.md` before changing these files.** Short form:

No top-level import of the backend or wx in `client/core/transcription/`: a copy without it must still open (whisper.cpp, or `BACKEND_MISSING`). No int8 on a card unless chosen, and never from sm_120 up or on an unknown capability. whisper.cpp's CUDA build only for [5.0, 12.0), and whisper-cli always gets `-l`. Catalogues pin revision, sizes and sha256. A single-language model forces its language, and the automatic choice never downloads a third-party model or a 32-bit GGML file. Resolve an unsupported precision before the load, because CTranslate2 refuses it. Probe free memory right before the run, off the wx thread. The models folder is install-wide: `coord_locks.models_lock()`, `canonical_dir()`, `_app_settings` with the underscore. A user's own model is never copied or deleted. Downloads go through `tls_trust`. `vad_used is False` is always spoken. The stored text lives in the encrypted record and needs both defences. Never log the text, the contact or the message id; a file path is logged as its basename. New temp prefixes go into `temp_sweep.PREFIXES`. A status's text lives in the status's own record (`core/transcription/statuses.py`) and is carried over whenever the tab's list is rebuilt.
7 changes: 7 additions & 0 deletions .claude/rules/updater.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,16 @@
paths:
- "client/updater.py"
- "client/update_coord.py"
- "client/update_channel_choice.py"
- "client/update_background.py"
- "client/update_package.py"
- "client/update_progress.py"
- "client/core/update_handoff.py"
- "client/update_relaunch.py"
- "client/update_node_kill.py"
- "client/core/npm_environment.py"
- "client/core/api_staging.py"
- "client/core/update_keeps_server.py"
- "client/main_window/wpp_background_update.py"
- "client/version.py"
- ".github/workflows/*.yml"
Expand Down
5 changes: 4 additions & 1 deletion .claude/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,10 @@
"Bash(git diff:*)",
"Bash(git log:*)",
"Bash(git show:*)",
"Bash(git branch:*)"
"Bash(git branch:*)",
"mcp__github__merge_pull_request",
"mcp__github__update_pull_request",
"Bash(git push https://github.com/gabrielhhaber/WinZapp_Python*:*)"
]
},
"enabledPlugins": {
Expand Down
9 changes: 5 additions & 4 deletions .claude/skills/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ primeiro vem junto com o `git clone`.
### Skills: ninguém invoca, elas aparecem

Uma skill **carrega sozinha** quando a tarefa bate com a descrição dela. Mexeu
em `client/languages/`, a `i18n-ui-string` entra em cena e o agente já sabe dos
arquivos de todos os idiomas registrados, do `&&` e dos placeholders — você não precisa lembrar de nada.
em `translations/` ou `client/languages/`, a `i18n-ui-string` entra em cena e o agente já sabe dos
catálogos de todos os idiomas registrados, do `&&` e dos placeholders — você não precisa lembrar de nada.
Para forçar, digite `/nome-da-skill`.

### Agentes: você chama pelo nome
Expand Down Expand Up @@ -95,8 +95,9 @@ próprio agente quando a tarefa se encaixa na descrição — não é preciso in
| `write-test` | Teste novo ou estendido. `MainWindow` é `wx.Frame` e `ConversationsPanel` é `wx.Panel`: nenhum dos dois instanciável sem `wx.App`, então ou a lógica sai para nível de módulo, ou o método real é ligado a um stub. Também as fixtures do `conftest.py` e o `asyncio_mode=auto` (teste async é só `async def`, sem decorator). |
| `wppconnect-patch` | Conserto do lado Node. São três mecanismos de patch diferentes, cada um com suas listas; escolher o errado é silencioso, e a mudança some no próximo `setup_api.py`. Nunca editar `client/api/` direto. |
| `accessible-ui` | Qualquer mexida em `client/ui/`, `status_panel.py` ou no wx do `main.py`. Controles padrão do wx, toda fala por `speak_output`, `Freeze`/`Thaw` com `try/finally` em volta de mutação de lista, e o limite de 511 caracteres do SysListView32. |
| `extract-from-god-file` | Extrair lógica testável ou dividir um módulo de mixin que excedeu o orçamento, sem mudar comportamento. Os índices dos pacotes mostram a responsabilidade de cada módulo. |

As quatro estão escritas em inglês, para casar com o `CLAUDE.md` e o `AGENTS.md`
As skills do projeto estão escritas em inglês, para casar com o `CLAUDE.md` e o `AGENTS.md`
— são documentos do mesmo tipo, dirigidos ao agente.

### Escrevendo uma skill nova
Expand Down Expand Up @@ -229,5 +230,5 @@ Vale saber antes de alguém pedir "roda o code-review" e receber outra coisa:

O `ci.yml` roda a suíte completa em todo PR para a `main`. Localmente rode só
os arquivos de teste do que você mudou (`uv run pytest tests/test_x.py`); a
suíte inteira (`uv run pytest -n auto`, ~1 min) fica para mudanças transversais. Os testes
suíte inteira (`uv run pytest`, serial, no máximo uma execução local) fica para mudanças transversais. Os testes
`load` só rodam no CI ou com `--run-load`. Nunca `--run-wx-gui`.
5 changes: 4 additions & 1 deletion .claude/skills/accessible-ui/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,13 +56,16 @@ Row-by-row mutation fires one accessibility event per row.
focused = self.messages_list.GetFocusedItem()
self.messages_list.Freeze()
try:
... # inserts, deletes, DeleteAllItems + rebuild
... # apply changed rows through _sync_message_rows()
finally:
self.messages_list.Thaw()
# restore focus, adjusting the index if rows before it moved
```

`try/finally` is mandatory, and so is restoring the focused row.
The messages list must never be cleared and rebuilt. Use
`MessageRowsMixin._sync_message_rows()` and preserve its row identities;
`DeleteAllItems()` re-announces the focused message even inside Freeze/Thaw.

## The 511-character limit

Expand Down
29 changes: 20 additions & 9 deletions .claude/skills/i18n-ui-string/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,24 +1,32 @@
---
name: i18n-ui-string
description: Add, change or remove a user-facing string in WinZapp. Use whenever a change introduces text a person can read or a screen reader can speak — dialog titles, buttons, menu items, list labels, error boxes, notifications, tooltips — or whenever a file under client/languages/ needs editing. Covers every registered locale (language_map.json), the mnemonic and placeholder rules, and the tests that enforce them.
description: Add, change or remove a user-facing string in WinZapp. Use for readable/spoken UI text or editing translations/*.po and language_map.json. Covers every registered locale, gettext updates, mnemonics, placeholders and validation.
---

# Adding a user-facing string

`I18n.t()` is `translations.get(key, key)` (`client/core/i18n.py`): no
fallback to another locale. A missing key is not an error — the screen reader
speaks the raw key name. So **a key added anywhere is owed by every locale
file listed in `client/languages/language_map.json`, in the same change.**
catalog listed in `client/languages/language_map.json`, in the same change: CI and release
builds reject a missing or fuzzy entry.**

## Procedure

1. Name the key in English `snake_case`, after its role
(`status_reply_send`, not `send_button_2`).
2. Add it to every locale file in `client/languages/` with a real
translation; a blank value fails the suite.
2. Add `msgctxt` (stable key) and `msgid` (English source) to
`translations/en-US/LC_MESSAGES/winzapp.po`.
3. Call it as a literal: `i18n.t("my_key")`. A key built at runtime escapes
the static check.
4. Run the tests below.
4. Update POT and merge every locale with `uv run translations-update`.
Translate the new blank entries and review changed `fuzzy` entries in
`translations/<locale>/LC_MESSAGES/winzapp.po`. Preserve translator comments.
Use `uv run translations-check-draft` while work is pending. When every PO
is complete, run `uv run translations-compile` and then
`uv run translations-check`. Never edit generated MO/key-map resources or POT.
Details: `docs/reference/gettext-migration.md`.
5. Run the tests below.

## Rules

Expand All @@ -40,6 +48,7 @@ file listed in `client/languages/language_map.json`, in the same change.**

```
uv run pytest tests/test_language_files_in_sync.py tests/test_i18n_keys_exist.py
uv run pytest tests/test_gettext_catalogs.py
```

The first compares the locale files with each other (keys, blanks,
Expand All @@ -48,7 +57,9 @@ mnemonics, placeholders); the second checks every literal `i18n.t("...")` in

## Adding a locale

Drop `<code>.json` into `client/languages/` and add
`"<code>": "<Display Name>"` to `language_map.json` (dict order is the
Settings combobox order). Tests derive the locale list from the map — never
write the list out in a test.
Add `"<code>": "<Display Name>"` to `client/languages/language_map.json`
(dict order is the Settings combobox order), run `uv run translations-update`,
translate its new `translations/<code>/LC_MESSAGES/winzapp.po`, then run
`uv run translations-compile` and `uv run translations-check`.
Update the installer/uninstaller tables too (`docs/reference/build-and-setup.md`).
Tests derive the locale list from the map — never repeat it in a test.
12 changes: 8 additions & 4 deletions .claude/skills/wppconnect-patch/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ carry that list; a test holds them equal.
homologated pair, pinned exact.** Mechanism 3 rewrites their compiled code
by literal search-and-replace, so a moved version silently disables a
patch. To move the pair: bump both keys and
`client/wpp_minimum_version.txt` in one commit, after running all five
`client/wpp_minimum_version.txt` in one commit, after running all six
`node_modules` patches against the candidate.
- When a new runtime restructures patched code, add a **second patch set
selected by matching the file** (as `host.layer.js` has for ≤ 2.3.1 and
Expand All @@ -48,22 +48,26 @@ carry that list; a test holds them equal.

## 3 — compiled code inside `node_modules`

For bugs in `@wppconnect-team/wppconnect`'s compiled output. Four modules in
For bugs in `@wppconnect-team/wppconnect`'s compiled output. Five modules in
`client/core/`:

```
wppconnect_host_layer_patch.py host.layer.js pairing-code lifecycle
wppconnect_sender_layer_patch.py sender.layer.js attachment sending
wppconnect_status_layer_patch.py status.layer.js status post success/failure
wppconnect_welcome_layer_patch.py welcome.js
wppconnect_browser_layer_patch.py browser.js injectApi readiness timeout
```

Each holds `ORIGINAL_*` / `PATCHED_*` constants and an `ALL_PATCHES` tuple,
The first four hold `ORIGINAL_*` / `PATCHED_*` constants and an `ALL_PATCHES` tuple,
applied by idempotent search-and-replace (re-running must be a no-op). A
shipped `_V<n>` constant is never edited — add a version and a migration
(`docs/traps/large-media.md`).

A fifth module patches the other half of the pair, `@wppconnect/wa-js`'s
`wppconnect_browser_layer_patch.py` is shaped like the wa-js one below instead
(matched by structure, owns its file handling).

A sixth module patches the other half of the pair, `@wppconnect/wa-js`'s
bundle — the script injected into the WhatsApp Web page, so a bug in
`WPP.*` itself is fixed there:

Expand Down
2 changes: 1 addition & 1 deletion .claude/skills/write-test/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,5 +87,5 @@ uv run pytest tests/test_<subject>.py
```

Run the files for what you touched. CI runs the whole suite on every PR; run
`uv run pytest -n auto` locally only for a cross-cutting change (`tests/conftest.py`,
`uv run pytest` serially, at most once, locally only for a cross-cutting change (`tests/conftest.py`,
a shared helper, a module split). Never pass `--run-wx-gui`.
5 changes: 3 additions & 2 deletions .github/scripts/audit_wpp_upgrade.py
Original file line number Diff line number Diff line change
Expand Up @@ -252,8 +252,9 @@ def built_source_changes(changed_paths) -> list:
build configuration and scripts at the repository root.

They reach an install through a server update, but every WinZapp update
brings the release's own api/ (dist/ built at the pin) back over it, so
they would come and go with each WinZapp release. A release approved without a WinZapp release must have
copies the release's dist/, built at the pin, back over it
(core/update_keeps_server.py), so they would come and go with each
WinZapp release. A release approved without a WinZapp release must have
none.
"""
return sorted(p for p in set(changed_paths) if _is_built(p))
Expand Down
2 changes: 1 addition & 1 deletion .github/scripts/release_signing.py
Original file line number Diff line number Diff line change
Expand Up @@ -338,7 +338,7 @@ def cmd_sign_stable(args) -> int:
return 0
_gh(["--method", "PATCH", f"repos/{repo}/releases/{release['id']}",
"-F", "draft=false", "-F", "prerelease=false", "-f", "make_latest=true"])
print(f"Published {tag}. release-published.yml now bumps client/version.py on main.")
print(f"Published {tag}. client/version.py on main is not touched; change it yourself when main's version should move.")
return 0


Expand Down
19 changes: 10 additions & 9 deletions .github/workflows/alpha-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,16 +23,17 @@
# Settings > General. It is also a real, parseable WinZapp version
# (parse_version() in updater.py accepts a dev/alpha/beta suffix), so an
# alpha still compares correctly against stable versions.
# - No bump-version job: client/version.py in main must keep tracking the
# stable release line. Committing an alpha version back to main would
# also push to main, which is what triggers this workflow.
# - No bump-version job: client/version.py in main is changed by hand, only
# when the maintainers want main's version to move. Committing an alpha
# version back to main would also push to main, which is what triggers
# this workflow. Publishing a stable release never touches main.
name: Alpha Build

on:
push:
branches: [main]
# version.py-only commits come from release-published.yml's bump-version job (which
# already marks them [skip ci]); nothing in a docs/CI-only change alters
# A version.py-only commit changes nothing that gets compiled, and nothing
# in a docs/CI-only change alters
# what gets compiled, so don't burn a ~15 minute build and a release on it.
paths-ignore:
- "client/version.py"
Expand Down Expand Up @@ -100,8 +101,8 @@ jobs:
# two channels stop ordering against each other. updater.py compares
# ((major, minor, patch, build), pre_order) with alpha < beta < final, so:
#
# base 0.25.0.0beta (client/version.py, kept current by
# release-published.yml's bump-version job) + commit count N -> 0.25.0.<N>alpha
# base 0.25.0.0beta (client/version.py, changed by hand
# when main's line moves) + commit count N -> 0.25.0.<N>alpha
#
# The suffix on the base is irrelevant to all of this — only major.minor.
# patch are read off it — so the scheme keeps working unchanged when the
Expand Down Expand Up @@ -264,8 +265,8 @@ jobs:
# Uses the default GITHUB_TOKEN deliberately: GitHub does not re-trigger
# workflows for events raised by GITHUB_TOKEN, so publishing this release
# (and the tag GitHub creates for it) does NOT fire release.yml's tag
# push trigger or release-published.yml (both also skip alpha tags
# outright, as a second line of defence).
# push trigger (which also skips alpha tags outright, as a second
# line of defence).
# A run cancelled partway through the upload below leaves its draft
# behind, and cancellation is routine here (a newer commit supersedes an
# in-flight build). Nothing ever collects those, so they'd pile up on the
Expand Down
Loading
Loading