Repository navigation
Releases: vianziro/Whatsapp-Dekstop
Release list
WhatsApp Desk 1.6.4 - Session, Startup, Preview and Windows Tray Fixes
Added
- Windows has a tray icon. macOS has had a status-bar item and Linux a StatusNotifierItem, so
Windows was the one platform where closing the window ended the process and its notifications
with it — the platform where a chat client is most expected to keep running. The close button now
hides the window instead of quitting, a right-click on the tray offers Show, Hide and Quit, and a
one-off notification says the app is still running so the window does not simply seem to have
vanished. The tray is created on a message-only window of its own, so it does not depend on the
browser window or on the vendored library's window procedure. It is deliberately fail-open: if
the tray cannot be created the window is left completely alone and the close button quits exactly
as before. - Every push to
mainand every pull request is now built and tested by CI. It checks formatting,
runsgo veton Linux — which also compilesapp_linux.go, a file no local build can reach —
cross-builds and vets the Windows target, and runs the test suite. The release workflow stays
manual on purpose, for the reason documented in its own header.
Changed
- The account rail no longer offers the add-account control once both accounts are present. With
the cap at two, the control could never be used, and a permanently greyed-out button reads as a
broken control rather than as a limit. It still appears while a slot is free, and returns as soon
as one is released.
Fixed
- The updater no longer offers an update whose download does not exist. The version check learns
the latest version from the release page redirect, and the download URL was then built from a
naming convention and never checked against the release itself — so on a platform with no
published build the user was shown an update and sent to a link that answered HTTP 404 the
moment they clicked it. The asset is now confirmed before it is advertised, and a release with no
build for this platform says so instead of being presented as "up to date". Only a definite
not-found counts: a timeout or a server error stays inconclusive, so a real update is never
hidden. - The diagnostic log is bounded. It was opened for append with no size cap, so it grew without
limit on exactly the machines that were being asked to send it in a bug report. It now rotates
past 2 MB, keeping one previous generation. - The memory figure in the diagnostic log is real. It reported the heap the Go runtime had
reserved rather than the memory the operating system had given the process, and it replaced the
accurate reading on macOS and Windows, so every measurement in the log was wrong by an order of
magnitude. It is now read from the operating system on each platform, and the log names where the
number came from so a wrong figure is visible rather than plausible. - The WhatsApp session can no longer be lost to the disk-cache trim on macOS. The 512 MB budget
measured the whole~/Library/WebKit/com.whatsapp.desktree, which is the session — cookies,
localStorage and IndexedDB — so the cap tripped on ordinary session growth rather than on cache
growth. The trim it then fired deleted~/Library/Caches/com.whatsapp.deskwhile the engine was
still running, on every window minimise and every close, and that directory is not a pure cache:
it holds WebKit's live service-worker registration database. The budget now measures and deletes
HTTP caches only, from one shared list so the measured set and the deleted set cannot drift, and
the delete happens once, before the engine starts. A target that never existed — the code looked
forNetworkCachedirectly under the WebKit root — is fixed, so the trim also works now (#74). - macOS handles SIGTERM and SIGINT. The app had no signal handler at all, so a logout, restart or
shutdown killed it with writes still in flight and left nothing behind — which is why the
symptom was indistinguishable from the app closing itself. Signals are now logged and the run
loop ends through AppKit, the same path the Quit menu takes, so WebKit closes its website data
store in order (#74). - The macOS updater quits cleanly before its bundle is replaced. It exited abruptly, which skips
WebKit's teardown, and the helper script that swaps the app waited a fixed one second — long
enough to begin replacing the bundle while the session store was still open. The helper now
waits for the process to actually disappear, bounded so a stuck process cannot block an update
(#74). - A missing WebView2 runtime now explains itself instead of crashing on Windows. The engine was
created without checking for the runtime, and the vendored library leaves its internal interface
pointer nil when the runtime is absent and then dereferences it — a panic that the startup
recovery turned into a silent exit with no explanation. The runtime is checked first, and a
missing one produces a dialog naming the download instead (#73). - Switching accounts keeps the window where it was on Windows. The replacement window is created
centred on the primary display, and the saved frame was looked up using that window's monitor,
so a switch made from a secondary display moved the window to the primary one. The outgoing
window's monitor is now carried across the switch. The switch also gets a visible transition
again: the page fades in a veil before asking the native side to switch, and the teardown used to
run in the same turn, so not one frame of it ever reached the screen (#72). - Opening a PDF shows the in-app preview again. Clicking a document forwards the click to the
document's own download control, which is how the file gets decrypted and fetched, and that
forwarded click was being recorded as an explicit download. The explicit-download marker
suppresses the preview by design, so every attempt to open a document fell through to WhatsApp's
own viewer instead. A forwarded click no longer counts as a download, and a preview that is
suppressed now records which guard suppressed it (#70). - The Linux blank-window workaround is applied automatically.
WEBKIT_DISABLE_DMABUF_RENDERER=1
only took effect for launches from a shell, so it was lost the moment the app was started from a
menu or a desktop entry. Setting it once now records it and every later launch keeps the
fallback. It is also applied by itself when there is no DRM render node at all, which covers VMs,
containers and remote desktops without a table of specific hardware. Machines that can composite
in hardware are unaffected (#63). - The microphone diagnostics actually record now. The capture probe read
navigator.mediaDevicesat document-creation time, when that API does not exist yet, and
returned silently — so themic:lines it was written to produce had never been written by any
build, and every request for them came back empty. The probe retries until the API appears,
within a bound, and records when it installs (#57).
Downloads & Verification
| Platform | Installer | Portable / Archive |
|---|---|---|
| macOS 12.0+ (Apple Silicon & Intel) | WhatsApp-Desk-macOS-Universal.dmg |
WhatsApp-Desk-macOS-Universal.zip |
| Windows 10/11 x64 (WebView2 runtime) | WhatsApp-Desk-Windows-x64-Setup.exe |
WhatsAppDesk.exe or WhatsApp-Desk-Windows-x64.zip |
Every published binary is covered by SHA256SUMS:
shasum -a 256 -c SHA256SUMS # macOS / Linux
certutil -hashfile <file> SHA256 # WindowsNote: this release ships macOS and Windows builds. Linux packages are not
built by this pipeline; see earlier releases for the most recent Linux build.
Full Changelog: v1.6.3...v1.6.4
WhatsApp Desk 1.6.3 - Attachment Saving Fixed & Idle Memory Reload
Added
- macOS: an optional idle memory reload frees the renderer's memory while the app is out of
sight. WebKit's WebContent process keeps every media item the page has decoded — measured at
~2 GB on a long-lived session — and purging its memory cache reclaims only about 6% of that,
because the rest is live page data WebKit is not allowed to drop. Once the window has been off
screen for 15 minutes the page is reloaded, which releases the decoded images, the JavaScript
heap and its typed arrays together. It only ever runs while the window is hidden, so an ordinary
alt-tab cannot trigger it; it runs at most once every 30 minutes; and the page is asked first —
window.waIdleReloadAllowed()refuses while offline, while an upload is in flight, while a
document preview is open, or before the chat list has loaded. "Hidden" means out of sight —
minimised, hidden, or fully covered by another window — not merely unfocused, so a window the
user can still see is never reloaded underneath them. Switch it off under
Settings → Maintenance. - The idle-reload countdown can be shortened for a support session by writing the number of
seconds intoidle_reload_secondsin the app's profile folder
(~/Library/Application Support/WhatsAppDesk/). The environment variable
WA_IDLE_RELOAD_SECONDSdoes the same for a direct run, but macOS does not give a
double-clicked bundle the shell's environment, so the file is the form a user can actually be
asked to set. Either way the value must be a sane positive number of seconds, so it can never
turn the feature into a reload loop. Each reload and each refusal is appended to
wa_idle_reload.login the same folder, and a refusal names the condition that blocked it
("the window is not hidden", "the chat list is not loaded", …) rather than leaving the reader to
guess which of several situations applied.
Fixed
- Saving an attachment no longer fails because of the name it was sent with. The filename comes
straight from the chat and reached the filesystem with nothing removed but the path separators,
so on Windows a document such asRapat 12:30.pdfwas rejected outright —< > : " | ? *are
illegal there — and a name ending in a dot or space was silently renamed. Names are now cleaned
of those characters, of control characters, of trailing dots and spaces, and of the reserved
device names (CON,NUL,COM1…), consistently on every platform, so the same attachment is
saved under the same name wherever the app runs (#68). - A download folder that cannot be used no longer ends the save. If the configured folder was
deleted, sits on a drive that is no longer mounted, or is refused by Windows' Controlled Folder
Access, the attachment is written to the default folder instead of being lost, and the toast says
where it actually went rather than reporting an ordinary success (#68). - A failed save now explains itself. The native side knew why it refused — an unusable folder, a
rejected name, a refused write — and threw the reason away, so the user saw only "Failed to save
file." with nothing to act on and no way to report it. The reason is now shown in the toast and
recorded in the page diagnostics (#68).
Downloads & Verification
| Platform | Installer | Portable / Archive |
|---|---|---|
| macOS 11.0+ (Apple Silicon & Intel) | WhatsApp-Desk-macOS-Universal.dmg |
WhatsApp-Desk-macOS-Universal.zip |
| Windows 10/11 x64 (WebView2 runtime) | WhatsApp-Desk-Windows-x64-Setup.exe |
WhatsAppDesk.exe or WhatsApp-Desk-Windows-x64.zip |
Every published binary is covered by SHA256SUMS:
shasum -a 256 -c SHA256SUMS # macOS / Linux
certutil -hashfile <file> SHA256 # WindowsNote: this release ships macOS and Windows builds. Linux packages are not
built by this pipeline; see earlier releases for the most recent Linux build.
Full Changelog: v1.6.2...v1.6.3
WhatsApp Desk 1.6.2 - Windows Close & Account-Switch Fix
The 1.6.1 binaries were first published with a Windows bug that made the app impossible to close,
and the corrected build was re-published under the same 1.6.1 version number — which the updater
never offers to installs already on 1.6.1. 1.6.2 carries the same fixes under a new number so they
finally reach every 1.6.1 install.
Fixed
- macOS: the app launches again on macOS 12 Monterey. The linker derived the bundle's minimum
macOS from the build host's SDK (13.0), so dyld refused to load the binary on anything older and
the documented "macOS 11.0+" requirement was silently false (#66, #67). The build now targets
12.0 — the oldest release the Go 1.26 runtime supports — and Info.plist declares
LSMinimumSystemVersion, so macOS warns before installing on an unsupported release instead of
failing after it. - Windows: the app closes normally again, and switching accounts no longer quits it. The session
loop inrunAppwasfor !switchRequestedwith the flag declared outside the loop, which put the
two paths exactly the wrong way round: an ordinary close left the flag false, so the loop went
round again and rebuilt the engine, reopening the window instead of exiting (#61, #64); a switch
set the flag true, so the loop fell out andrunAppreturned, ending the process instead of
rebuilding on the new account (#62). The flag is now declared per iteration and only an ordinary
close leaves the loop, and the thread's message queue is drained afterDestroy()so the
WM_QUITposted by the destroyed window'sWM_DESTROYcannot reach the next session'sRun(). - Privacy Mode no longer makes scrolling heavy. The sidebar refresh asked every
ancestor of the pointer target whether it was a sidebar control, and on a long
chat list that read the whole list's text and re-queried its subtree on every
pointer event; the refresh could also be dropped mid-flight, which risked leaving
a chat row readable. The check is now bounded to the row it belongs to, and the
refresh is deferred and rescheduled rather than dropped. - Document previews scroll as smoothly as the built-in viewer. The preview overlay
is a full-viewport fixed element, and blurring its backdrop forces the compositor
to re-render the page behind the modal on every scrolled frame; the four scroll
surfaces inside the card also repainted their whole overlay because nothing
contained them. The overlay now uses a flat dim, every scroll surface is a
containment boundary, and the card is layer-promoted.
Downloads & Verification
| Platform | Installer | Portable / Archive |
|---|---|---|
| macOS 11.0+ (Apple Silicon & Intel) | WhatsApp-Desk-macOS-Universal.dmg |
WhatsApp-Desk-macOS-Universal.zip |
| Windows 10/11 x64 (WebView2 runtime) | WhatsApp-Desk-Windows-x64-Setup.exe |
WhatsAppDesk.exe or WhatsApp-Desk-Windows-x64.zip |
Every published binary is covered by SHA256SUMS:
shasum -a 256 -c SHA256SUMS # macOS / Linux
certutil -hashfile <file> SHA256 # WindowsNote: this release ships macOS and Windows builds. Linux packages are not
built by this pipeline; see earlier releases for the most recent Linux build.
Full Changelog: v1.6.1...v1.6.2
WhatsApp Desk 1.6.1 - Crash Fixes, Reliable Drag & Drop, and Document Preview Recovery
Fixed
- Windows: the app no longer dies when the window is moved or activated while the
webview is still being created. A title-bar click enters Windows' modal move loop,
which re-entered the webview's message handler while its browser field was still
empty, and the resulting fault killed the process (#58, #59, #60). - macOS: the app no longer quits by itself when the account registry cannot be read
at startup, or when the webview fails to build on the first attempt. Both paths
ended the process; they now fall back to a single-account session and retry, and
any remaining exit path leaves a crash report behind. - Switching accounts is settled before another switch can start. A second switch
requested while the previous swap was still painting could tear down the incoming
view; switches now wait out the settle window. - Document previews no longer reopen in a loop. Dismissing WhatsApp's own viewer
makes it re-create the attachment, which re-entered the preview interceptor and
reopened the window indefinitely; the same document is now auto-previewed once per
window, and a fresh click is still honoured. - Previewing a PDF no longer fights WhatsApp's viewer. The dismissal ran for 2.4
seconds of close-button clicks and synthetic Escape keys; it is now bounded, and
stops immediately when there is no viewer to dismiss. - If the in-app PDF renderer cannot take a file, the preview card is shown instead
of nothing, so there is always a way to open or save the document. - Drag and drop works again for images and documents. The check that decided whether
WhatsApp had accepted the drop treated any open dialog as success — and WhatsApp
keeps dialog containers mounted permanently — so the fallback never ran and the
drop silently did nothing. - A second drop arriving while the first was still being staged no longer overwrites
it. - Privacy Mode no longer makes scrolling heavy. The sidebar refresh asked every
ancestor of the pointer target whether it was a sidebar control, and on a long
chat list that read the whole list's text and re-queried its subtree on every
pointer event; the refresh could also be dropped mid-flight, which risked leaving
a chat row readable. The check is now bounded to the row it belongs to, and the
refresh is deferred and rescheduled rather than dropped. - Document previews scroll as smoothly as the built-in viewer. The preview overlay
is a full-viewport fixed element, and blurring its backdrop forces the compositor
to re-render the page behind the modal on every scrolled frame; the four scroll
surfaces inside the card also repainted their whole overlay because nothing
contained them. The overlay now uses a flat dim, every scroll surface is a
containment boundary, and the card is layer-promoted. - Windows: switching accounts no longer closes the app.
runApplooped while a
switch had not been requested, and the Windows switch handler set that flag
unconditionally, so every switch fell out of the loop and ended the process
instead of rebuilding the engine on the new account. The loop is now
unconditional, and the thread's message queue is drained afterDestroy()so the
WM_QUITposted by the destroyed window'sWM_DESTROYcannot reach the next
session'sRun().
Added
- Capture diagnostics for calls (#57). The app now records the constraints the page
requests and the settings the engine grants, so a "robotic microphone" report can
be answered with data instead of a guess. The call path itself is untouched: the
probe passes the original arguments and return value straight through. - The in-app issue reporter now includes feature notes — decisions that changed what
the user saw, such as a suppressed duplicate preview — next to page errors.
Downloads & Verification
| Platform | Installer | Portable / Archive |
|---|---|---|
| macOS 11.0+ (Apple Silicon & Intel) | WhatsApp-Desk-macOS-Universal.dmg |
WhatsApp-Desk-macOS-Universal.zip |
| Windows 10/11 x64 (WebView2 runtime) | WhatsApp-Desk-Windows-x64-Setup.exe |
WhatsAppDesk.exe or WhatsApp-Desk-Windows-x64.zip |
Every published binary is covered by SHA256SUMS:
shasum -a 256 -c SHA256SUMS # macOS / Linux
certutil -hashfile <file> SHA256 # WindowsNote: this release ships macOS and Windows builds. Linux packages are not
built by this pipeline; see earlier releases for the most recent Linux build.
Full Changelog: v1.6.0...v1.6.1
WhatsApp Desk 1.6.0 - Multi-Account Profiles & a Quick-Tool Dock
Added
- Account profiles: link a second WhatsApp account alongside the existing one.
Each account keeps an isolated browser profile (WKWebsiteDataStore on macOS,
a WebView2 user-data folder on Windows, a WebKitGTK website-data manager on
Linux); the first account adopts the existing session by reference, so no
re-pairing is needed. One engine is live at a time, and the account dock in
the page rail switches, creates, and renames profiles, with
Ctrl/Cmd+Shift+1/2as shortcuts. On macOS and Linux the switch swaps the
browser view in place; on Windows it restarts the window. - Unread hint per account chip: the dock shows the badge value an account had
when it was last switched away from. Recorded once per switch, never polled. - Quick-tool zone in the account dock: Privacy Mode, Always on Top, and Blur
Profile Photos live as small icons below a divider under the account chips,
with active-state coloring, tooltips, and the existingCtrl/Cmd+Shift+P/T
shortcuts still working. Purely event-driven — no polling.
Fixed
- macOS 13 (and older): the second account now keeps its session across app
restarts. The named per-account data store API is macOS 14+ only, so the
fallback built an in-memory store before; it now builds the same persistent
store through WebKit's_WKWebsiteDataStoreConfiguration. Account IDs from
older registries (UUIDs without dashes) are canonicalized before parsing,
which previously failed silently and downgraded every account to an
in-memory store. - Account switching no longer blanks the window. The replacement view is
built before anything is touched on screen, the outgoing page stays visible
(with a soft veil and clicks disabled) until the incoming account paints.
Downloads & Verification
| Platform | Installer | Portable / Archive |
|---|---|---|
| macOS 11.0+ (Apple Silicon & Intel) | WhatsApp-Desk-macOS-Universal.dmg |
WhatsApp-Desk-macOS-Universal.zip |
| Windows 10/11 x64 (WebView2 runtime) | WhatsApp-Desk-Windows-x64-Setup.exe |
WhatsAppDesk.exe or WhatsApp-Desk-Windows-x64.zip |
Every published binary is covered by SHA256SUMS:
shasum -a 256 -c SHA256SUMS # macOS / Linux
certutil -hashfile <file> SHA256 # WindowsNote: this release ships macOS and Windows builds. Linux packages are not
built by this pipeline; see earlier releases for the most recent Linux build.
Full Changelog: v1.5.9.9...v1.6.0
WhatsApp Desk 1.5.9.9 - Privacy Reliability, Linux Self-Update & Update Banner Fixes
Fixed
- Privacy Mode keeps the Archived navigation row and guidance visible while blurring actual
archived chat rows, with localized Archived labels and bounded view-scoped scanning (#50, #52). - Linux self-updates prefer the
-webkit4.1tarball on systems without the WebKitGTK 4.0
runtime, including GUI launchers whose PATH omitsldconfiglocations, while preserving
architecture-safe fallback behavior (#55). - The update banner reserves layout space so it no longer covers the Archived header or back
button, and disconnects its resize observer when dismissed (#56).
Downloads & Verification
| Platform | Installer | Portable / Archive |
|---|---|---|
| macOS 11.0+ (Apple Silicon & Intel) | WhatsApp-Desk-macOS-Universal.dmg |
WhatsApp-Desk-macOS-Universal.zip |
| Windows 10/11 x64 (WebView2 runtime) | WhatsApp-Desk-Windows-x64-Setup.exe |
WhatsAppDesk.exe or WhatsApp-Desk-Windows-x64.zip |
Every published binary is covered by SHA256SUMS:
shasum -a 256 -c SHA256SUMS # macOS / Linux
certutil -hashfile <file> SHA256 # WindowsNote: this release ships macOS and Windows builds. Linux packages are not
built by this pipeline; see earlier releases for the most recent Linux build.
Full Changelog: v1.5.9.8...v1.5.9.9
WhatsApp Desk 1.5.9.8 - Click Recovery, Multi-File Upload Hardening & WebKitGTK 4.1
Six pull requests contributed by @MAliffadlan land here
together, with the macOS and spreadsheet-preview follow-ups they needed to be mergeable.
Security
- Self-update downloads are restricted to release artifacts of this repository served over
HTTPS fromgithub.com, so a page script can no longer point the updater at an arbitrary
URL (#44). - The download folder is validated against system and autostart locations, including symlink
escapes and dangling symlinks, and the open-file bridge is jailed to the download folder and
the internal preview directory (#44). - Attacker-controlled strings in the in-app document preview are HTML-escaped (#47), and
spreadsheet cell values are sanitized before they reach the preview table — SheetJS escapes
cell text but writes the raw value into adata-vattribute, which a crafted cell could use
to inject markup (#47 follow-up). - Self-update archives no longer propagate elevated mode bits on extraction, and the DBus tray
handler passes its error message as a format argument rather than as the format string
(#45, #46). - Self-update downloads are capped at 512 MB and saved attachments at 1 GB, checked before
decoding so an oversized payload cannot exhaust memory (#49).
Fixed
- Linux: opt-in WebKitGTK 4.1 build variant (
WA_DESK_WEBKIT=4.1) for Ubuntu 24.04,
Linux Mint 22.x and current Fedora, with-webkit4.1artifacts and honest DEB
Depends. The default 4.0 build is unchanged. Related to #8, #9. - Linux: the StatusNotifierItem tray properties no longer abort the process on launch on
desktops with a tray watcher (#48). wa_crash.logrotates past 1 MB with a single backup, so a crash loop can no longer grow it
without bound (#49).- macOS: the download-folder blocklist and the preview-directory check resolved only one side
of the comparison, so symlinked prefixes such as/etcand/varwere never matched
(follow-up to #44). - A file drop that hit an excluded target (a dialog, the settings modal) or arrived with an
empty file list — cloud placeholder files such as OneDrive's are the common case — left the
drag-over highlight class stuck. That class disables pointer events across the whole app, so
clicks stopped responding (including selecting a contact from the @mention popup) while
typing and Enter kept working, until the app was restarted. The drag state is now reset on
every drop and again ondragendand window blur. - The drop fallback that waits for WhatsApp's native editor used a single 400 ms check; when
the editor mounted slower than that — common on Windows — the app injected the dropped files
a second time over the batch WhatsApp had already accepted, which could leave only one file
in the editor. The fallback now probes for several rounds and only injects when no editor
appeared during the whole window.
Downloads & Verification
| Platform | Installer | Portable / Archive |
|---|---|---|
| macOS 11.0+ (Apple Silicon & Intel) | WhatsApp-Desk-macOS-Universal.dmg |
WhatsApp-Desk-macOS-Universal.zip |
| Windows 10/11 x64 (WebView2 runtime) | WhatsApp-Desk-Windows-x64-Setup.exe |
WhatsAppDesk.exe or WhatsApp-Desk-Windows-x64.zip |
Every published binary is covered by SHA256SUMS:
shasum -a 256 -c SHA256SUMS # macOS / Linux
certutil -hashfile <file> SHA256 # WindowsNote: this release ships macOS and Windows builds. Linux packages are not
built by this pipeline; see earlier releases for the most recent Linux build.
Full Changelog: v1.5.9.7...v1.5.9.8
WhatsApp Desk 1.5.9.7 - Notification Controls, Download Reliability & macOS Fixes
What's Changed in v1.5.9.7
A consolidation release: 24 pull requests merged since v1.5.9.6, 20 of them contributed by @agas007. It introduces configurable native notifications, makes downloads more reliable and less redundant, and clears a long backlog of macOS-specific issues.
Native Notifications
- Cross-platform notification controls (#31). A new Settings toggle enables or disables native desktop notifications consistently on macOS, Windows, and Linux. When switched off, no OS-level notification is raised.
- Modern macOS notification APIs (#25). Notification delivery now uses the
UserNotificationsframework instead ofNSUserNotification, which Apple deprecated in macOS 11.
Downloads & Attachments
- Original filenames preserved (#27). Attachments keep their real names — the filename is resolved from
Content-Dispositionand the source URL rather than falling back to a generic placeholder. - Content-based deduplication (#29). Downloading the same file twice no longer creates
name (1).extcopies. Files are matched by SHA-256 content hash and the existing path is reused. - Accurate duplicate reporting (#40). When a file is already on disk, the toast now reads "File already saved" instead of implying a fresh save.
- Saved badges track the filename (#28). The saved-state indicator stays aligned with its message bubble instead of drifting.
- Explicit downloads no longer open a preview (#18). Choosing Download from the context menu suppresses the in-app document viewer.
- Removed dead size-based deduplication bookkeeping (#39).
macOS
- Media permission recovery UX (#30). If camera or microphone access is denied, Settings now shows a recovery card with a direct link to System Settings and a retry action.
- Media permissions scoped to WhatsApp (#21). Permissions are no longer requested more broadly than necessary.
- Fullscreen preserved on Escape (#24). Closing a chat no longer drops the window out of fullscreen.
- PDF preview no longer closes the chat (#17).
- File picker uploads skip the native preview (#16).
- LaunchAgent state verified (#20). "Launch at Startup" now reflects the real system state on every launch.
- Safer self-updater restart (#19).
Privacy Mode
- Scoped hover reveal and timestamp blur (#22). Hovering a chat row reveals only that row, and sidebar timestamps are blurred consistently while staying readable.
Updater
- Clearer failure recovery (#32). Failed updates report a specific reason instead of failing silently.
Settings & Polish
- Shortcut button spacing corrected (#38).
Community & Documentation
- Added CONTRIBUTING.md (#34), CODE_OF_CONDUCT.md — Contributor Covenant (#35), SECURITY.md with a vulnerability reporting policy (#36), and GitHub issue / pull request templates (#37).
Build & Release
- Releases are now produced by the local build pipeline rather than the tag-triggered workflow.
Downloads & Verification
| Platform | Installer | Portable / Archive | Requirements |
|---|---|---|---|
| macOS | WhatsApp-Desk-macOS-Universal.dmg |
WhatsApp-Desk-macOS-Universal.zip |
macOS 11.0+ (Apple Silicon & Intel) |
| Windows 10 / 11 | WhatsApp-Desk-Windows-x64-Setup.exe |
WhatsAppDesk.exe or WhatsApp-Desk-Windows-x64.zip |
Windows 10/11 x64 with the WebView2 runtime |
All eight binaries are covered by SHA256SUMS. Verify your download before installing:
shasum -a 256 -c SHA256SUMS # macOS / Linux
certutil -hashfile <file> SHA256 # WindowsNote: This release ships macOS and Windows builds. Linux packages (
.deb/.rpm/.tar.gz) remain available in v1.5.9.2 and earlier.
Contributors
Thanks to @agas007, who authored 20 of the 24 pull requests in this release, and to everyone who reported the macOS and download issues resolved here.
Full Changelog: v1.5.9.6...v1.5.9.7
WhatsApp Desk 1.5.9.6 - Enhanced Privacy Mode & Avatar Blur
What's Changed in v1.5.9.6
This release resolves Issue #15 by significantly expanding Privacy Mode and Avatar Blur coverage across modern WhatsApp Web DOM structures:
- Archived Chats Privacy: Privacy Mode visual blur and Profile Photo blur now fully apply to the Archived Chats drawer and filtered lists (previously restricted to the main chat list container).
- All Profile Photo Variants Covered:
- Contacts currently posting a Status (avatar wrapped inside status ring SVG
<image>) are now correctly blurred. - Chats with Disappearing Messages and Pinned / Previously Pinned Chats (with badge overlays and Stylex container wrappers) are now consistently blurred.
- Saved and unsaved contacts without custom profile pictures (SVG default avatars) are now protected.
- Conversation header (
#main header) and group message bubble avatars are uniformly covered.
- Contacts currently posting a Status (avatar wrapped inside status ring SVG
- Symmetrical Instant Hover Peek: Hovering over any chat row or hovering directly over the profile photo reveals it instantly without delay.
- Timestamp Sparing: Message times in the sidebar and Archived Chats drawer remain readable.
Downloads & Verification
- macOS Universal (Apple Silicon + Intel, macOS 11+):
WhatsApp-Desk-macOS-Universal.dmg/.zip - Windows x64 (Windows 10/11 with WebView2):
WhatsApp-Desk-Windows-x64-Setup.exe(Installer) orWhatsAppDesk.exe/.zip(Portable) - Checksums available in
SHA256SUMS.
WhatsApp Desk 1.5.9.5 - Window & Settings Fixes
Fixes the two most-reported Windows issues.
Maximize / Restore Down (#14). The window now stores its real restored size, so Restore Down returns to your previous custom size instead of staying full-screen. Maximized state is remembered across restarts.
Settings consistency (#13). Launch at Startup now reflects the actual system state on every launch, the Settings icon no longer shifts position, and toast messages always appear above the Settings panel. Only one Settings control is ever shown at a time.
Windows installer. Setup wizard with branded graphics, Start Menu and desktop shortcuts, and a clean uninstaller. Portable EXE is still provided.
macOS build is universal (Apple Silicon and Intel). Requires macOS 11+, Windows 10/11 x64 (WebView2), or a Linux desktop with GTK3 and WebKitGTK.
Note: this release ships macOS and Windows. Linux packages remain available in earlier releases.