whatsapp-desktop
latest GitHub

Free and open source · Fedora · Debian · Ubuntu · Arch

WhatsApp for Linux

A real desktop app for the WhatsApp you already use. It sits in the tray and tells you the moment a message lands, takes voice and video calls, shares your screen, and draws your chats in the font and the size you want to read them at. Same account, same chats, same phone — nothing to set up but the QR scan.

x86_64 · rpm, deb and a native Arch package

bash
$ curl -fsSL https://abdallah-shehawey.github.io/shinux-repo/install.sh | sudo sh
==> rpm system detected, installing shinux-release
==> done.
$ sudo dnf install --refresh whatsapp-desktop
Installed: whatsapp-desktop-1.6.1-1.x86_64
$ whatsapp-desktop
  • No browser needed — it carries its own Chromium.
  • Signed packages from the shinux repository.
  • Updates with your system, through dnf, apt or pacman.

What you get

WhatsApp, behaving like an app your desktop actually knows about.

A notification for every message

Not one per chat — one per message, with who wrote it, their picture and what they said. Click it and that conversation opens. Read it on your phone and it disappears here on its own. A photo says 📷 Photo and a voice note says how long it is.

Voice and video calls

Ring somebody, or pick up, from your computer — camera and microphone just work, and there is nothing to allow first. Share your whole screen or a single window while you talk. Every call opens in a window of its own.

A font for each alphabet

Not one font for everything: a family, a size and a weight for Latin, and another set for Arabic, each with its own switch. So you can give Arabic the face it deserves without touching your English, or the other way round. Left alone, it draws everything in your desktop's own font and follows it when you change it.

Arabic that reads like Arabic

Every line takes its direction from its own first word, so Arabic sits against the right and English against the left — in the same message, in a group, and in the replies under a community post. Letters get the room their descenders need, the timestamp stays off the last line, and the notifications read the same way. Nothing to switch on.

Lives in the tray

Close the window and it keeps running, so nothing is missed while it is out of the way. It can start with your session, already hidden, and the tray icon tells you when somebody is waiting.

Dark, light, or whatever the desktop is

One Settings window — Ctrl+, or the tray menu — with the theme, the zoom, start-at-login, what closing the window does, and which sounds you want; the fonts have a window of their own beside it. No text editor anywhere.

Smoother than the browser

Long conversations scroll on the graphics card, a wheel notch glides instead of jumping, and the panel beside a chat slides in and out. Reply to a message and the bar and the conversation above it move as one piece, rather than the bar growing and the messages catching up a frame later. Jump to a message — the pinned one at the top of a chat, a quoted reply, a search result — and you land on it and stay there, instead of sliding a screenful past it. Nothing to turn on — it is how it draws.

It says when there is a newer one

It asks GitHub once a day whether a release is out, and when there is one the tray menu names it. It never installs anything itself — your own package manager does that, on your say-so, with the rest of your system.

Your account is untouched

Inside the window is WhatsApp's own web app, the one you would open in a browser. Nothing is re-implemented, nothing is stored, and no server but WhatsApp's ever sees a message — it is linked from your phone exactly like a browser, and unlinked the same way.

The whatsapp-desktop Settings window: a theme picked from System, Dark and Light; switches for start at login, close to tray and minimise to tray; switches for desktop notifications, the notification sound and the outgoing message tone; and a zoom level.

Everything is a switch

One window — Ctrl+, or the tray menu — and every one of these takes effect the moment you set it. Nothing to restart, nothing to save.

Theme
System, dark or light. System turns when your desktop turns.
Start at Login
Starts hidden in the tray, so messages arrive before you open anything.
Close to Tray
Closing the window keeps the client running and connected.
Minimize to Tray
Minimising hides it away as well. Off by default — minimising is not closing.
Remember Window Size
Opens the way it was left: maximised, or at its own size — even when the machine went down with it open. Off for a tiling window manager, which picks the size itself, or a config kept in git.
Desktop Notifications
One banner per message, with the sender's picture and what they said.
Notification Sound
Your desktop's own tone when a message lands — the one the rest of your machine uses.
Outgoing Message Tone
The sound for a message you send. Off by default: it is already on screen with a tick under it.
Zoom Level
Scales the whole interface, pictures and spacing and all — the same as Ctrl++ / - / 0.

All of it lands in ~/.config/whatsapp-desktop/whatsapp-desktop.conf — the file is documented below.

The whatsapp-desktop Fonts window: a Latin and English section and an Arabic section, each with a use-the-system-font switch, a family picker, a size and bold and italic buttons, and each ending in a preview line drawn in the font chosen.

A font for English, and a different one for Arabic

Most apps give you one font for everything, which means picking the one that is least wrong for both alphabets. This one has a window — the tray's Fonts… — with the two scripts side by side and a switch on each, so an Arabic face of your own does not oblige you to choose a Latin one, or the other way round.

Two switches, not one
Leave either script on your desktop's own font and set only the other.
Family
Picked from the fonts actually installed on your machine — the Arabic list holds only the ones that can draw Arabic, so nothing on it comes out in boxes.
Size, per script
Arabic sits smaller than Latin at the same nominal size in almost every pairing. Nudge one up and it matches the other, in the same line, without moving the Latin.
Bold and italic
The family's real bold or italic face — never a slanted or smeared imitation. A family that has none says so instead of offering a button that does nothing.
A preview of each
A line in Latin and a line in Arabic, drawn in what you just picked.

It costs nothing to draw: the two scripts are two faces of one family split by character range, resolved by the font engine, rather than a style rule the page has to match against every element while you scroll.

The whatsapp-desktop About window: the app icon, the name, the version running, an update row reading Up to date with a Check button, and rows linking to the website and the source code.

It tells you when there is a newer one

About WhatsApp, in the tray menu, has the version you are running and a Check that asks GitHub for the latest release. It also looks once a day on its own, and when there is something newer the tray item says so by name — so you find out from the app rather than from somebody else's screenshot.

It never installs anything. Your package manager does that, and the command for your distribution is a few lines down this page. If you would rather it did not look at all, one switch in the configuration file stops the daily check and leaves the button.

Install

Pick your distribution and copy the commands — everything you need is on this page. The packages are signed and come from a repository, so your usual system update keeps WhatsApp up to date with everything else — and Update has the commands for doing it on its own.

1 · Add the signed repository

curl -fsSL https://abdallah-shehawey.github.io/shinux-repo/install.sh | sudo sh

One script for all three package managers: it detects dnf, apt or pacman, imports the signing key, writes a single repository file under /etc, and stops there. It installs no packages of its own. If you would rather not pipe into a shell, the three tabs beside this one spell the same steps out by hand.

2 · Install the client

sudo dnf install --refresh whatsapp-desktop        # Fedora and friends
sudo apt update && sudo apt install whatsapp-desktop  # Debian, Ubuntu 24.04+
sudo pacman -Syu whatsapp-desktop                  # Arch

The repository is brand new to your machine, so each of these fetches its list of packages first — that is what --refresh, apt update and the y in pacman -Syu do. Without it the package manager reads a list written before the repository existed and answers "no match".

First run. Launch WhatsApp from your applications menu or run whatsapp-desktop, then link it the way you would link a browser: on your phone, Settings → Linked devices → Link a device, and scan the code on screen. Nothing is typed into this client but the QR scan.

The package installs a system-wide autostart entry, so the client starts hidden in the tray at login. To stop that: Settings → Applications → Startup, or delete /etc/xdg/autostart/io.github.shehawey.whatsapp-desktop.desktop.

Everything above is signed with AE61 EBAE 9E82 36C0 2D44 F731 BAD3 F432 9468 897C

Downloads

Straight from the latest GitHub release — the latest release. Every file is built by CI from the tag, never uploaded by hand.

Also in the release: a debug package for Arch and SHA256SUMS over the lot. Older releases.

Verify what you downloaded

curl -fLO https://github.com/abdallah-shehawey/whatsapp-desktop/releases/latest/download/SHA256SUMS
sha256sum -c SHA256SUMS --ignore-missing

Packages from the shinux repository are GPG-signed as well, and dnf, apt and pacman check that for you.

Update

There is no updater inside the client: it is a package like any other, and your usual system upgrade carries it along. These are the commands for updating it on its own, and each one refreshes the repository's package list first — a release published this morning is not in the copy your machine downloaded yesterday.

1 · Update the client

sudo dnf upgrade --refresh whatsapp-desktop

--refresh throws away the cached package list and asks the repository again. Without it dnf answers from a list that can be a day old, and says there is nothing to upgrade when there is.

2 · Or with everything else — optional

sudo dnf upgrade --refresh

Your session survives an update. The link to your phone and every setting live in your home directory, so the client comes back to the conversation you left. Restart it after an update — a running copy keeps the old files open until it is quit from the tray.

Configure

Every switch in that window is also a line in a file, for anyone who would rather keep it there: ~/.config/whatsapp-desktop/whatsapp-desktop.conf. Each key is optional, and deleting one puts the default back.

Ctrl+ - 0zoom in, out, reset
Ctrl,Settings
CtrlFsearch the open chat, or the list on screen
CtrlShiftIdevtools
CtrlQquit for real
Escclose the emoji panel
window closehides to the tray, stays connected

Every key in the file

Grouped the way the file itself is: the section name is the heading, and each key under one is written the way it appears under it.

KeyDefaultWhat it does
[view]
themesystemfollows the desktop, or force dark / light
fontGNOME'sfamily for everything the client draws
font-size16size of the whole interface, in px
zoom1.0also set with Ctrl++/-
force-fonttruedraw the page in one family
[fonts] — every key twice, once per script
latin-inherit, arabic-inherittruethat script follows the system font until you say otherwise
latin-family, arabic-familythe system's owna font per script, chosen in the Fonts window
latin-size, arabic-size100that script's size, as a % of the family's own
latin-bold, arabic-bold, and the italicsfalsethe family's own bold or italic face — nothing is synthesised
[notifications]
enabledtrueoff hands notifications back to Chromium
soundtruea tone for the banners this client raises
outgoing-soundfalseWhatsApp's tone for a message you send
whatsapp-soundfalselet WhatsApp play its own arrival tone
banner-seconds12before a banner is refiled silently
hide-previewfalseon, a banner names the chat and never the words
[media]
ask-where-to-savetrueevery download asks; off, they land in ~/Downloads
download-dir—where the last one went, so the chooser opens there
download-stickerstruefetch stickers whether or not photos are, like the phone
hide-controls-when-pausedtruethe desktop's media card goes when a voice note is paused
[behaviour]
close-to-traytrueclosing leaves the client running
minimize-to-trayfalseminimise is not close
spellchecktrueChromium's own, in the box you type in
[window] · [links] · [updates] — the short ones
[window] remember-sizetrueopens the way it was left, maximised or at its size, written as it changes; off, it opens as below and never writes it — for a tiling WM, or a config in git
[window] maximizedfalseopen maximised, remembered as it changes
[window] width, height1200×800remembered as it changes, while remember-size is on
[links] claim-schemetrueopen whatsapp: links here, not in a browser tab
[updates] checktruethe daily look for a newer release; off, only About's Check asks

No banners on GNOME? The tray needs the AppIndicator extension, and GNOME suppresses banners while a window is fullscreen, while presence is BUSY, and while show-banners is off. Check that a plain notify-send hello world floats first.

Removing it

Two things went onto your machine: the client, and the repository it updates from. Pick your distribution and run the steps in order — the last one is optional and is the only one that touches your session.

1 · Remove the client

sudo dnf remove whatsapp-desktop

2 · Remove the repository

sudo rm -f /etc/yum.repos.d/shinux.repo

3 · Remove the signing key

sudo rpm -e $(rpm -q gpg-pubkey --qf '%{NVR} %{SUMMARY}\n' | grep -i shinux | cut -d' ' -f1)

The key is stored under a name made from its own fingerprint, which is why it is looked up rather than typed. Leaving it costs nothing; removing it means nothing of this repository is trusted any more.

4 · Your session and settings — optional

rm -rf ~/.local/share/whatsapp-desktop ~/.config/whatsapp-desktop

Nothing on your phone changes. This client is a linked device, like a browser tab: removing it here leaves the link listed on your phone under Settings → Linked devices, and that is where you end the session for good. Your messages live with WhatsApp and are all still on the phone afterwards.

Build it yourself

For anyone who would rather read the source than trust a package. Needs Node and nothing else; the licence is GPL-3.0-or-later.

git clone https://github.com/abdallah-shehawey/whatsapp-desktop
cd whatsapp-desktop
make            # fetches Electron
make install    # ~/.local, plus a desktop entry and icons
make autostart  # also start hidden at login
make test       # replays a chat list past the watcher

Or build a package

packaging/build-rpm.sh    # dist/*.rpm
packaging/build-deb.sh    # dist/*.deb
makepkg -si               # packaging/PKGBUILD

The same three scripts CI runs on every v*.*.* tag, so a local build is the same package as the release.

Report a bug

Something broken, or something missing? Both go to the same place — the issue tracker on GitHub, where every report is read and the fix rides the next release.

Something is broken

A short form asks what happened, the version you are running, your distribution and the steps that bring it back. That is usually all it takes to fix it.

The version is in About WhatsApp, in the tray menu. For the log the form asks about, start the client from a terminal with whatsapp-desktop and copy what it prints.

Something is missing

Ideas belong in the same tracker: what you are trying to do, and what you would like the client to do about it.

Worth reading the open ones first — somebody may have asked already, and a comment on that one carries further than a second issue.

An issue is public the moment you open it. Nothing is fixed any faster by a phone number, the text of a message or a screenshot of a conversation, so leave them out and redact a log before pasting it. Opening one needs a GitHub account, which is free.