A ntfy.sh desktop client built with Electron which supports Windows, Linux, and MacOSX. This client rests in your taskbar tray and allows you to receive push notifications to your desktop without requiring you to leave your browser open.
This project allows you to access the official free / paid notification service ntfy.sh, or your own self-hosted version of ntfy from within a desktop application which utilizes Electron as the wrapper.
ntfy-win11 is a fork of Aetherinox/ntfy-desktop that rebuilds the notification core so it is reliable as an always-on tray app on Windows 11 (it still runs on Linux and macOS):
- Streams instead of polling. One long-lived connection to the ntfy
/jsonstream delivers messages instantly. A dead connection (sleep, Wi-Fi drop, server restart) is detected via the server keepalive and re-established with exponential backoff; the reconnect asks the server for everything published since the last message you received, so nothing is lost. A big backlog becomes one summary toast. - Native notifications. Toasts go through Windows' own notification API (no bundled
ntfytoast.exe), are attributed to Ntfy Desktop, and use the ntfy message properly:title,priority(silent / normal / sticky / urgent),tags(emoji),click,icon, image attachments as hero images, andview/httpactions as toast buttons. - One source of truth for topics. Whatever you subscribe to in the embedded ntfy web app is picked up automatically (muted subscriptions are honoured); an extra manual list is optional. Connection problems (bad token, unreachable server, rate limit) show up in the tray icon, its tooltip, and the App menu instead of only in a log file.
- Behaves like a Windows app. Single instance, Start with System, an NSIS installer plus a portable exe, GPU acceleration off by default for a tray app, and the embedded web app is muted so its sound does not double up with the toast.
See CHANGELOG.md for the full list. Everything below the fork notes is the upstream documentation, adjusted where the behaviour changed.
ntfy.sh (pronounced "notify") is a simple HTTP-based pub-sub notification service. With ntfy, you can send notifications to your phone or desktop via scripts from any computer, without having to sign up or pay any fees. If you'd like to run your own instance of the service, you can easily do so since ntfy is open source.
To install Ntfy on your system, visit the following links:
- Supports both the official ntfy.sh website / service or your own self-hosted instance
- To self-host, you must install Ntfy server on a local machine.
- View docs at https://docs.ntfy.sh/install/
- Two modes for minimizing app, configure in settings
- Close button exits app completely; OR
- Close button sends app to tray. Right-click tray icon to quit / show app
- Start app minimized, and optionally start with the system (login item)
- Runs as a single instance; launching it again just shows the window
- Shortcut key-binds
- Can disable the keyboard shortcuts
- Receive push notifications from ntfy server to desktop
- Persistent stream connection with automatic reconnect and catch-up after sleep / outages
- Native Windows / Linux / macOS notifications; on Windows the toast carries the app icon, a hero image for image attachments, and buttons for ntfy
view/httpactions - Emoji tags, titles, click URLs and priorities are rendered the same way the official apps do
- Notification options:
- Persistent (sticky) notifications which require user interaction to clear (high / urgent priority always are)
- Timed notifications which disappear after a few seconds
- Sound on / off, and a minimum priority filter
- Modify
datetimeformat - Topics: subscriptions from the embedded web app are synced automatically; add extra topics by hand
- Supports Ntfy API token
- Connection status in the tray icon, tray tooltip and
Appmenu - Taskbar unread message count / count
- Includes command-line arguments
To use this desktop client, you will be required to either have an Ntfy.sh account, or you must host your own instance of the Ntfy.sh server to pull notifications from.
You can install your own self-hosted copy of Ntfy server from:
The client keeps a single streaming connection open per instance (GET /<topics>/json), so there is no polling interval to tune and the official ntfy.sh rate limits are not an issue. When the connection drops, the client reconnects and asks the server for the messages published in the meantime (since=). For that catch-up to work on a self-hosted server, message caching must be enabled (cache-file in server.yml, which the official docker examples do); ntfy.sh caches for 12 hours. Set the catch-up window under App -> Settings -> Notifications.
If you are self-hosting your own copy of Ntfy, you must open the Ntfy Desktop client, click the top menu item App, go down to Settings and then click Instance. You must set your instance URL to your personal self-hosted instance. To set your instance URL back to the official ntfy server, clear the URL box and save.
If your topics are protected (auth-default-access: deny-all, or reserved topics), simply sign in inside the app - the desktop notifications use the same login. You can also create an access token on the server and paste it into App -> Settings -> API Token (it takes precedence). A rejected or missing login is reported as Error - unauthorized in the tray tooltip and as a notification that opens the API Token dialog.
We provide numerous different architectures you can download this app for. Below is a list:
| Architecture | Bits | Devices / Examples |
|---|---|---|
| ARMv7l | 32 | Raspberry Pi 2 & 3 (32-bit), Nexus 7, PS Vita (ARM Cortex-A9) |
| ARMv6l | 32 | Raspberry Pi 1, Pi Zero, iPhone 3G |
| ARM64 | 64 | Apple M1/M2/M3 Macs, Raspberry Pi 4 (64-bit OS), iPhone 5s+ |
| AMD64 | 64 | Modern PCs, PS5, Xbox Series X, Steam Deck |
| I386 | 32 | 386-era PCs, Windows 95 machines, Compaq Deskpro, old netbooks |
| IA32 | 32 | Same as i386; Intel Atom netbooks, Pentium 4 PCs |
This section explains how to use ntfy-desktop once you have it ready to go on your system.
The following keybinds can be used within ntfy-desktop:
| Key(s) | Description |
|---|---|
CTRL + R |
Refresh page |
CTRL + Q |
Quit application |
CTRL + M |
Minimize to tray |
CTRL + = |
Zoom in |
CTRL + - |
Zoom out |
CTRL + 0 |
Zoom reset |
CTRL + SHIFT + I |
Developer tools |
F12 |
Developer tools |
CTRL + G |
Show General settings window |
CTRL + I |
Show URL / Instance window |
CTRL + T |
Show API Token settings window |
CTRL + SHIFT + T |
Show Topics settings window |
CTRL + N |
Show Notifications settings window |
CTRL + SHIFT + R |
Reconnect to the ntfy server |
Note
Hotkeys are disabled by default. To enable hotkeys, select App in the top menu, and select Settings -> General.
Enable Allow usage of hotkeys to navigate
This client allows you to utilize the following command-line arguments with ntfy-desktop:
| Argument | Description | Available as setting |
|---|---|---|
--hidden |
Start app hidden in tray, suitable for auto-starting on system login/boot (or enable Start with System in the General settings) | ✅ |
--hotkeys |
Start app with hotkeys enabled (--hotkey is accepted too) |
✅ |
--terminate |
Top-right close button will completely exit app instead of minimize to tray (--quit is accepted too) |
✅ |
--devtools |
Start app with developer tools in App menu |
✅ |
--env <env_name> |
Define startup environment | ❌ |
If you are running ntfy-desktop from node, you can pass arguments using the following example:
npm run start -- --hidden --hotkeysIf using the pre-built binaries, pass arguments by opening your terminal / command prompt, and passing the arguments using:
# Windows
ntfy-desktop-win32-x64/ntfy-desktop.exe --hidden --hotkeys
# Linux
ntfy-desktop-linux-x64/ntfy-desktop --hidden --hotkeys
# MacOS
ntfy-desktop-darwin-x64/ntfy-desktop.app/Contents/MacOS/ntfy-desktop --hidden --hotkeysSubscribe to topics in the embedded ntfy web app exactly as you would in a browser. The client reads the web app's subscription list and streams those topics; muting a subscription in the web app also mutes its desktop notifications. If you would rather keep a separate list (or want notifications for a topic you do not want to see in the web app), add it under App -> Settings -> Topics -> Extra Topics, and turn Sync Web App Subscriptions off if you only want the manual list.
Only subscriptions on the configured instance are used; a subscription to another server inside the web app is ignored, and so are the web app's internal ones (the account sync topic st_...). If you gave a topic a display name in the web app, toasts use it as the title.
Messages are rendered the way the official ntfy apps render them:
| ntfy field | Desktop notification |
|---|---|
title |
Toast title (falls back to the topic name) |
message |
Toast body |
tags |
Tags that match an emoji (warning, skull, tada, ...) are prefixed to the title; the rest are listed in the attribution line |
priority |
1 / 2 silent, 3 normal, 4 sticky + sound, 5 sticky + sound + Windows urgent scenario (shown through Focus Assist when the app is allowed to) |
click |
Opened in the browser when the toast body is clicked; otherwise the app window is shown |
icon |
Used as the toast logo |
attachment |
Images (png / jpg / gif / webp, up to 4 MB) become the hero image; other files get an Open button |
actions |
view and http actions become toast buttons (Windows shows up to five). broadcast is Android-only and ignored |
Windows notes
- Notifications are delivered through the Windows notification platform, so they respect the system notification settings, Focus Assist / Do Not Disturb and the Action Center. The app appears as Ntfy Desktop in Settings -> System -> Notifications once the first toast has been shown.
httpaction buttons work by registering thentfy-desktop://URL scheme for the current user (HKCU\Software\Classes\ntfy-desktop). Windows launches that URL when the button is pressed and the running app performs the request. The registration is refreshed at startup and can be turned off by settingbProtocolHandlerto0in%APPDATA%\ntfy-desktop\prefs.json.- The installed version (NSIS setup) is registered with a proper application id; the portable exe identifies itself by its path, which is what Windows expects for unpackaged apps. Both show toasts without any extra steps.
Catch-up after sleep or an outage
When the connection comes back, the client asks the server for everything since the last message it processed, limited to the Catch-up Window (default 12 hours). Up to five missed messages are shown individually; more than that are folded into a single N missed notifications toast, and the messages themselves are waiting in the web app.
All settings live under App -> Settings and are stored in %APPDATA%\ntfy-desktop\prefs.json (~/.config/ntfy-desktop on Linux, ~/Library/Application Support/ntfy-desktop on macOS).
| Dialog | Setting | Default | Notes |
|---|---|---|---|
| General | Enable Developer Tools | off | |
| General | Enable Hotkeys | off | See Key Binds |
| General | Quit on Exit | off | Close button quits instead of hiding to tray |
| General | Minimize to Tray | off | Start hidden |
| General | Start with System | off | Registers a login item that launches the app with --hidden |
| General | Hardware Acceleration | off | GPU rendering for the embedded web app; takes effect after a restart |
| General | Mute Web App | on | Silences the web app's own notification sound |
| Instance | Instance URL | https://ntfy.sh/app |
Self-hosted: https://ntfy.example.com |
| API Token | API Token | empty | tk_... access token for protected topics. Optional: when empty, the login of the account signed in inside the app is used |
| Topics | Extra Topics | empty | Comma separated |
| Topics | Sync Web App Subscriptions | on | |
| Notifications | Sticky Notifications | off | Force every toast to stay until dismissed |
| Notifications | Sound | on | |
| Notifications | Minimum Priority | 1 | Hide toasts below this priority |
| Notifications | Datetime Format | YYYY-MM-DD hh:mm a |
moment.js style tokens |
| Notifications | Catch-up Window (hours) | 12 | 0 disables replay after reconnect |
The connection state is shown in the tray icon (amber dot = connecting / idle, red dot = the server rejected us), in the tray tooltip, and as the first entry of the App menu. Help -> Open Log Folder opens main.log.
There are numerous ways to build this application.
This produces the Windows installer (-setup.exe, per-user NSIS install with a Start Menu shortcut and uninstaller) and a portable single exe, and is what the releases of this fork are built with. It needs NodeJS 20+ and Git.
git clone https://github.com/1-tim/ntfy-win11.git
cd ntfy-win11/src
npm install
# Windows installer + portable exe for x64 and arm64 -> ../dist
npm run dist:win
# portable x64 only
npm run dist:win:portable
# other platforms (run on that platform)
npm run dist:linux # AppImage + deb
npm run dist:mac # dmg + zipThe build configuration lives in the build section of src/package.json.
This method makes use of the build.bat and build.sh scripts provided in this repository. Find your operating system below and follow the instructions:
Install NodeJS with NPM by going to the following URL. Make sure to select your current operating system at the top:
Next, run the following commands in Powershell or Windows Command Prompt:
# Clone ntfy-desktop repo, make sure you are in an EMPTY folder:
mkdir ntfy-desktop && cd ntfy-desktop/
git clone https://github.com/aetherinox/ntfy-desktop.git .
# install npm packages
npm install
npm install -g electron
# build ntfy
./build.batRun the following commands to install NodeJS + NPM, and then Ntfy Desktop:
# Install packages
sudo apt update
sudo apt install git nodejs npm wine64
# create the needed folders
mkdir ntfy-desktop && cd ntfy-desktop/
# clone repo
git clone https://github.com/aetherinox/ntfy-desktop.git .
# install npm packages
npm install
npm install -g electron-packager
# set wine symlink
sudo ln -s /usr/bin/wine /usr/bin/wine64
# change permissions
sudo chmod +x build.sh
# build ntfy
./build.shInstall NodeJS with NPM by going to the following URL. Make sure to select your current operating system at the top.
To install node / npm, download from:
To install Git on your system:
Open your Terminal app and run the following commands:
# install git
brew install git
# install wine
brew install --cask wine-stable
# create the needed folders
mkdir ntfy-desktop && cd ntfy-desktop/
# clone repo
git clone https://github.com/aetherinox/ntfy-desktop.git .
# install npm packages
npm install
npm install -g electron-packager
# set wine symlink
sudo ln -s /usr/bin/wine /usr/bin/wine64
# change permissions
sudo chmod +x build.sh
# build ntfy
./build.shYou can also build your own copy of ntfy-desktop by executing the included package.json run commands.
To run the npm commands, you must install NodeJS and NPM on your system. To install them, visit:
The package.json includes the commands listed below. Because the build commands have dynamic variables; you must run the command based on what operating system you are building from.
If you are building ntfy-desktop from a Windows machine:
npm run build:win:windowsnpm run build:win:linuxnpm run build:win:mac
If you are building ntfy-desktop from a Linux or MacOS machine:
npm run build:lin:windowsnpm run build:lin:linuxnpm run build:lin:mac
Install NodeJS with NPM by going to the following URL. Make sure to select your current operating system at the top:
Next, run the following commands in Powershell or Windows Command Prompt:
# create the needed folders
mkdir ntfy-desktop && cd ntfy-desktop/
# clone repo
git clone https://github.com/aetherinox/ntfy-desktop.git .
# install npm packages
npm install
npm install -g electron-packager
# build ntfy-desktop from Windows to Windows machine
npm run build:win:windows
# build ntfy-desktop from Windows to Linux machine
npm run build:lin:windowsRun the following commands to install NodeJS + NPM, and then Ntfy Desktop:
# Install NodeJS and NPM
sudo apt update
sudo apt install git nodejs npm wine64
# create the needed folders
mkdir ntfy-desktop && cd ntfy-desktop/
# clone repo
git clone https://github.com/aetherinox/ntfy-desktop.git .
# install npm packages
npm install
npm install -g electron-packager
# set wine symlink
sudo ln -s /usr/bin/wine /usr/bin/wine64
# build ntfy-desktop from Linux to Windows machine
npm run build:lin:linux
# build ntfy-desktop from Linux to Linux machine
npm run build:lin:windowsInstall NodeJS with NPM by going to the following URL. Make sure to select your current operating system at the top:
Install Git on your system next:
Open your Terminal app and run the following commands:
# Install NodeJS and NPM
sudo apt update
sudo apt install git nodejs npm wine64
# create the needed folders
mkdir ntfy-desktop && cd ntfy-desktop/
# clone repo
git clone https://github.com/aetherinox/ntfy-desktop.git .
# install npm packages
npm install
npm install -g electron-packager
# set wine symlink
sudo ln -s /usr/bin/wine /usr/bin/wine64
# build ntfy-desktop from Windows to MacOS machine
npm run build:win:mac
# build ntfy-desktop from Linux toL MacOS machine
npm run build:lin:macThis repository contains tests in order to test the functionality of this project. We utilize a Github workflow to handle the automation, however, you can run the tests locally.
In order to run these tests, you must have some dependencies installed on your system or runner:
sudo apt install xvfb -y
npm install
npx playwright install-depsIf you do not run the command playwright install-deps; then you will need to install all of the dependencies manually with the command:
sudo apt install xvfb -y
sudo apt-get install libasound2 libxslt-dev woff2 libevent-dev libopus0 \
libopus-dev libwebpdemux2 libharfbuzz-dev libharfbuzz0b libwebp-dev \
libenchant-2-dev libsecret-1-0 libsecret-1-dev libglib2.0-dev libhyphen0 \
libglfw3-dev libgles2-mesa-dev libudev1 libevdev2 libgles2-mesa yasm \
libudev1 libudev-dev libgudev-1.0-0 libx264-dev libgconf-2-4 libatk1.0-0 \
libatk-bridge2.0-0 libgdk-pixbuf2.0-0 libgtk-3-0 libgbm-dev libnss3-dev \
libxss-dev -y
npx playwright installYou can fork this repository and run the included Github workflows
In order for the workflow to work, your Github or self-hosted runner must have numerous dependencies installed. Ensure you do not remove the npm install and apt install commands from the workflow; otherwise the tests will fail.
You can also run the included tests manually without a Github workflow with the instructions below.
These tests specifically check the Electron app itself. They will attempt to open ntfy-desktop and make sure the application is in working order. These tests do NOT test the back-end code of the app.
cd ./src
npm run testYou should see numerous windows open and multiple copies of Ntfy Desktop start up. This is normal, and is the test checking out the functionality of the application.
If you want to run the tests from a CI without having a GUI available to see the tests; you can run the command:
xvfb-run --auto-servernum \
--server-args="-screen 0 1280x960x24" npx playwright test \
--trace onIf you want to run the tests, while having Electron running in debug / verbose mode; run the command:
DISPLAY=:0 DEBUG=pw:browser xvfb-run \
--auto-servernum \
--server-args="-screen 0 1280x960x24" npx playwright test \
--trace onThe tests should show something similar to the following:
[chromium] › tests/main.spec.js:65:1 › ✅ ensure interface can fully load
✅ Open New Window: About
[webkit] › tests/main.spec.js:65:1 › ✅ ensure interface can fully load
✅ Open New Window: About
[chromium] › tests/main.spec.js:65:1 › ✅ ensure interface can fully load
✅ Saved screenshot: test-results/fullload_1749458422355.png
[webkit] › tests/main.spec.js:65:1 › ✅ ensure interface can fully load
[SubscriptionManager] No browser subscription currently exists, so web push was never enabled or the notification permission was removed. Skipping.
✅ Saved screenshot: test-results/fullload_1749458422373.png
[firefox] › tests/main.spec.js:143:1 › ✅ fail to sign into invalid account
ntfy
[chromium] › tests/main.spec.js:143:1 › ✅ fail to sign into invalid account
ntfy
[webkit] › tests/main.spec.js:143:1 › ✅ fail to sign into invalid account
ntfy
9 passed (15.3s)
To open last HTML report run:
npx playwright show-reportThese tests check the back-end functionality of the app, including a lot of the functions that the source code comes with.
cd ./src
npm run test:unit:runThe results for the tests will be printed in your terminal / command prompt.
RUN v3.2.4 ntfy-desktop/src
✓ tests/storage.test.js (23 tests) 17ms
✓ tests/utils.test.js (26 tests) 31ms
✓ tests/logging.test.js (8 tests) 28ms
Test Files 3 passed (3)
Tests 57 passed (57)
Start at 10:19:17
Duration 577ms (transform 158ms, setup 0ms, collect 427ms, tests 76ms, environment 1ms, prepare 377ms)This node package comes with ESlint, and a set of rules which should be followed. If you have intentions of creating new features and contributing to this repository; you must follow these linter rules. You can check the current status of your code by running:
cd ./src
npm run lintAny failures will be reported in console:
ntfy-desktop\src\tests\storage.test.js
1:74 error Expected linebreaks to be 'LF' but found 'CRLF' @stylistic/linebreak-style
2:21 error Expected linebreaks to be 'LF' but found 'CRLF' @stylistic/linebreak-style
3:25 error Expected linebreaks to be 'LF' but found 'CRLF' @stylistic/linebreak-style
4:21 error Expected linebreaks to be 'LF' but found 'CRLF' @stylistic/linebreak-style
5:32 error Expected linebreaks to be 'LF' but found 'CRLF' @stylistic/linebreak-style
6:1 error Expected linebreaks to be 'LF' but found 'CRLF' @stylistic/linebreak-style
7:3 error Expected linebreaks to be 'LF' but found 'CRLF' @stylistic/linebreak-style
8:29 error Expected linebreaks to be 'LF' but found 'CRLF' @stylistic/linebreak-style
6:14 error A space is required after '[' @stylistic/array-bracket-spacing
6:29 error A space is required before ']' @stylistic/array-bracket-spacingYou must fix these before submitting a contribution. You can opt to automatically fix errors by running the command:
npm run lint:fixWarning
Opting to automatically fix linting errors may result in mis-aligned brackets. Make sure these are fixed before submitting any pull requests.
These steps allow you to validate the files sha256sum.txt.asc, sha1sum.txt.asc, and sha256sum.sig which we provide with every release.
Validating these files helps ensure that the actual .zip or binary files you have downloaded indeed came from the real developer. Before you start reading the sections below; ensure you have the following packages installed:
- GPG
- sha1sum
- sha256sum
You can install these by running the commands:
# Ubuntu / Debian Systems
sudo apt update
sudo apt install gpg gnupg sha1sum sha256sum
# Fedora / Redhat
(yum | or | dnf ) install gpg gnupgEach release includes two .sig files; these are known as a GPG Detached Signature.
- sha1sum.sig
- sha256sum.sig
To validate that these signatures are good, download each of the files to your local machine:
# sha1sum
wget https://github.com/Aetherinox/ntfy-desktop/releases/download/2.1.1/sha1sum.sig
# sha256sum
wget https://github.com/Aetherinox/ntfy-desktop/releases/download/2.1.1/sha256sum.sigNext, you will need the two associated files:
- sha1sum.txt.asc
- sha256sum.txt.asc
To download these, run the commands:
# sha1sum.txt.asc
wget https://github.com/Aetherinox/ntfy-desktop/releases/download/2.1.1/sha1sum.txt.asc
# sha256sum.txt.asc
wget https://github.com/Aetherinox/ntfy-desktop/releases/download/2.1.1/sha256sum.txt.ascNow we can validate that these files indeed came from the original developer; run the command:
gpg --verify sha1sum.sig sha1sum.txt.ascYou should see the output:
gpg: using RSA key 6921C2D3F6AE1188B7721C72F397BC89486A29A6
gpg: Good signature from "Binary Ninja (RSA 4096) <thebinaryninja@proton.me>" [unknown]
Primary key fingerprint: E8BA 8C94 B334 1673 0D8C 05C2 5769 7A1C BA63 B9FE
Subkey fingerprint: 6921 C2D3 F6AE 1188 B772 1C72 F397 BC89 486A 29A6Now validate the sha256sum.sig with the sha256sum.txt.asc:
gpg --verify sha256sum.sig sha256sum.txt.ascYou should see the output:
gpg: using RSA key 6921C2D3F6AE1188B7721C72F397BC89486A29A6
gpg: Good signature from "Binary Ninja (RSA 4096) <thebinaryninja@proton.me>" [unknown]
Primary key fingerprint: E8BA 8C94 B334 1673 0D8C 05C2 5769 7A1C BA63 B9FE
Subkey fingerprint: 6921 C2D3 F6AE 1188 B772 1C72 F397 BC89 486A 29A6If you get the above results; you have validated the signature files.
This section explains how you can validate the downloaded .zip files and see if they are indeed authentic from the original developer. Before you can validate these files, you need to download the public GPG key we use when we sign releases. You can download it by running the following command:
curl -s https://github.com/BinaryServ.gpg | gpg --importDownload the sha256sum.txt.asc and validate the file itself:
wget https://github.com/Aetherinox/ntfy-desktop/releases/download/2.1.1/sha256sum.txt.asc
gpg --verify sha256sum.txt.ascYou should see the following. The value 6921C2D3F6AE1188B7721C72F397BC89486A29A6 is the key's fingerprint.
gpg: Signature made Mon 01 Jun 2025 00:00:00 UTC
gpg: using RSA key 6921C2D3F6AE1188B7721C72F397BC89486A29A6
gpg: Good signature from "Binary Ninja (RSA 4096) <thebinaryninja@proton.me>" [ultimate]You can view your existing GPG key fingerprints by running:
gpg --list-keys --keyid-format=long --fingerprint --with-fingerprintThis will allow you to see where the 692XXXXX value comes from:
pub rsa4096 2025-04-21 [C]
E8BA 8C94 B334 1673 0D8C 05C2 5769 7A1C BA63 B9FE
uid [ unknown] Binary Ninja (RSA 4096) <thebinaryninja@proton.me>
sub rsa4096 2025-04-21 [S]
>>>> 6921 C2D3 F6AE 1188 B772 1C72 F397 BC89 486A 29A6
sub rsa4096 2025-04-21 [E]
25E9 AFEC C12F 2072 AA6E D5AB B077 63D0 A12F 0ED8
sub rsa4096 2025-04-21 [A]
AD79 A1EA CE17 962F B4ED B30A DBA8 EA76 62FC 54E2Next, download the sha256sum.sig
wget https://github.com/Aetherinox/ntfy-desktop/releases/download/2.1.1/sha256sum.sigTo validate the .sig file and your sha256sum file, run the command:
gpg --verify sha256sum.sig sha256sum.txt.ascYou should see:
gpg: using RSA key 6921C2D3F6AE1188B7721C72F397BC89486A29A6
gpg: Good signature from "Binary Ninja (RSA 4096) <thebinaryninja@proton.me>" [unknown]
Primary key fingerprint: E8BA 8C94 B334 1673 0D8C 05C2 5769 7A1C BA63 B9FE
Subkey fingerprint: 6921 C2D3 F6AE 1188 B772 1C72 F397 BC89 486A 29A6You can now validate the sha256sum.txt.asc file against the files you have downloaded from our repository. In order to verify that the files are legit, you must download them from the Releases page. They end with the extension .zip. You can also download them using wget. Make sure you download the zip files to the same folder where you downloaded the sha256sum.txt.asc and sha256sum.sig
# Download ntfy-desktop-2.1.1-darwin-amd64.zip
wget \
https://github.com/Aetherinox/ntfy-desktop/releases/download/2.1.1/ntfy-desktop-2.1.1-darwin-amd64.zip
# Download ntfy-desktop-2.1.1-darwin-arm64.zip
wget \
https://github.com/Aetherinox/ntfy-desktop/releases/download/2.1.1/ntfy-desktop-2.1.1-darwin-arm64.zip
# Download ntfy-desktop-2.1.1-linux-amd64.zip
wget \
https://github.com/Aetherinox/ntfy-desktop/releases/download/2.1.1/ntfy-desktop-2.1.1-linux-amd64.zip
# Download ntfy-desktop-2.1.1-linux-arm64.zip
wget \
https://github.com/Aetherinox/ntfy-desktop/releases/download/2.1.1/ntfy-desktop-2.1.1-linux-arm64.zip
# Download ntfy-desktop-2.1.1-linux-armv7l.zip
wget \
https://github.com/Aetherinox/ntfy-desktop/releases/download/2.1.1/ntfy-desktop-2.1.1-linux-armv7l.zip
# Download ntfy-desktop-2.1.1-win32-amd64.zip
wget \
https://github.com/Aetherinox/ntfy-desktop/releases/download/2.1.1/ntfy-desktop-2.1.1-win32-amd64.zip
# Download ntfy-desktop-2.1.1-win32-arm64.zip
wget \
https://github.com/Aetherinox/ntfy-desktop/releases/download/2.1.1/ntfy-desktop-2.1.1-win32-arm64.zip
# Download ntfy-desktop-2.1.1-win32-ia32.zip
wget \
https://github.com/Aetherinox/ntfy-desktop/releases/download/2.1.1/ntfy-desktop-2.1.1-win32-ia32.zipNext, extract the hashes from the hash digest sha256sum.txt.asc file by running the command:
gpg --output sha256sum.txt --verify sha256sum.txt.ascThe command above will create a new file called sha256sum.txt, now run that file with the program sha256sum:
sha256sum --check sha256sum.txtWhich will output:
# Successful validation
ntfy-desktop-2.1.1-win32-ia32.zip: OK
ntfy-desktop-2.1.1-darwin-amd64.zip: OK
ntfy-desktop-2.1.1-win32-amd64.zip: OK
ntfy-desktop-2.1.1-win32-arm64.zip: OK
ntfy-desktop-2.1.1-darwin-arm64.zip: OK
ntfy-desktop-2.1.1-linux-armv7l.zip: OK
ntfy-desktop-2.1.1-linux-amd64.zip: OK
ntfy-desktop-2.1.1-linux-arm64.zip: OK
# Files missing for validation
ntfy-desktop-2.1.1-linux-arm64.zip: FAILED open or read
# File did not pass validation
ntfy-desktop-2.1.1-linux-arm64.zip: FAILEDIf you see FAILED and the files are indeed there, ensure you downloaded them from our repository and not somewhere else.
If you see OK; this means the files are valid.
This section explains how you can validate the downloaded .zip files and see if they are indeed authentic from the original developer. Validating the sha1sum.txt.asc is similar to the sha256sum.txt.asc, first, download the public GPG key we use when we sign releases. You can download it by running the following command:
curl -s https://github.com/BinaryServ.gpg | gpg --importNext, download the sha1sum.txt.asc file:
wget https://github.com/Aetherinox/ntfy-desktop/releases/download/2.1.1/sha1sum.txt.ascNow verify that the sha1sum.txt.asc is properly signed:
gpg --verify sha1sum.txt.ascYou should see the following. The value 6921C2D3F6AE1188B7721C72F397BC89486A29A6 is the key's fingerprint.
gpg: Signature made Mon 01 Jun 2025 00:00:00 UTC
gpg: using RSA key 6921C2D3F6AE1188B7721C72F397BC89486A29A6
gpg: Good signature from "Binary Ninja (RSA 4096) <thebinaryninja@proton.me>" [ultimate]You can view your existing GPG key fingerprints by running:
gpg --list-keys --keyid-format=long --fingerprint --with-fingerprintThis will allow you to see where the 692XXXXX value comes from:
pub rsa4096 2025-04-21 [C]
E8BA 8C94 B334 1673 0D8C 05C2 5769 7A1C BA63 B9FE
uid [ unknown] Binary Ninja (RSA 4096) <thebinaryninja@proton.me>
sub rsa4096 2025-04-21 [S]
>>>> 6921 C2D3 F6AE 1188 B772 1C72 F397 BC89 486A 29A6
sub rsa4096 2025-04-21 [E]
25E9 AFEC C12F 2072 AA6E D5AB B077 63D0 A12F 0ED8
sub rsa4096 2025-04-21 [A]
AD79 A1EA CE17 962F B4ED B30A DBA8 EA76 62FC 54E2Next, download the sha1sum.sig
wget https://github.com/Aetherinox/ntfy-desktop/releases/download/2.1.1/sha1sum.sigTo validate the sha1sum.sig file and your sha1sum.txt.asc file, run the command:
gpg --verify sha1sum.sig sha1sum.txt.ascYou should see:
gpg: using RSA key 6921C2D3F6AE1188B7721C72F397BC89486A29A6
gpg: Good signature from "Binary Ninja (RSA 4096) <thebinaryninja@proton.me>" [unknown]
Primary key fingerprint: E8BA 8C94 B334 1673 0D8C 05C2 5769 7A1C BA63 B9FE
Subkey fingerprint: 6921 C2D3 F6AE 1188 B772 1C72 F397 BC89 486A 29A6You can now validate the sha1sum.txt.asc file against the files you have downloaded from our repository. In order to verify that the files are legit, you must download them from the Releases page. They end with the extension .zip. You can also download them using wget. Make sure you download the zip files to the same folder where you downloaded the sha1sum.txt.asc and sha1sum.sig
# Download ntfy-desktop-2.1.1-darwin-amd64.zip
wget \
https://github.com/Aetherinox/ntfy-desktop/releases/download/2.1.1/ntfy-desktop-2.1.1-darwin-amd64.zip
# Download ntfy-desktop-2.1.1-darwin-arm64.zip
wget \
https://github.com/Aetherinox/ntfy-desktop/releases/download/2.1.1/ntfy-desktop-2.1.1-darwin-arm64.zip
# Download ntfy-desktop-2.1.1-linux-amd64.zip
wget \
https://github.com/Aetherinox/ntfy-desktop/releases/download/2.1.1/ntfy-desktop-2.1.1-linux-amd64.zip
# Download ntfy-desktop-2.1.1-linux-arm64.zip
wget \
https://github.com/Aetherinox/ntfy-desktop/releases/download/2.1.1/ntfy-desktop-2.1.1-linux-arm64.zip
# Download ntfy-desktop-2.1.1-linux-armv7l.zip
wget \
https://github.com/Aetherinox/ntfy-desktop/releases/download/2.1.1/ntfy-desktop-2.1.1-linux-armv7l.zip
# Download ntfy-desktop-2.1.1-win32-amd64.zip
wget \
https://github.com/Aetherinox/ntfy-desktop/releases/download/2.1.1/ntfy-desktop-2.1.1-win32-amd64.zip
# Download ntfy-desktop-2.1.1-win32-arm64.zip
wget \
https://github.com/Aetherinox/ntfy-desktop/releases/download/2.1.1/ntfy-desktop-2.1.1-win32-arm64.zip
# Download ntfy-desktop-2.1.1-win32-ia32.zip
wget \
https://github.com/Aetherinox/ntfy-desktop/releases/download/2.1.1/ntfy-desktop-2.1.1-win32-ia32.zipNext, extract the hashes from the hash digest sha1sum.txt.asc file by running the command:
gpg --output sha1sum.txt --verify sha1sum.txt.ascThe command above will create a new file called sha1sum.txt, now run that file with the program sha1sum:
sha1sum --check sha1sum.txtWhich will output:
# Successful validation
ntfy-desktop-2.1.1-win32-ia32.zip: OK
ntfy-desktop-2.1.1-darwin-amd64.zip: OK
ntfy-desktop-2.1.1-win32-amd64.zip: OK
ntfy-desktop-2.1.1-win32-arm64.zip: OK
ntfy-desktop-2.1.1-darwin-arm64.zip: OK
ntfy-desktop-2.1.1-linux-armv7l.zip: OK
ntfy-desktop-2.1.1-linux-amd64.zip: OK
ntfy-desktop-2.1.1-linux-arm64.zip: OK
# Files missing for validation
ntfy-desktop-2.1.1-linux-arm64.zip: FAILED open or read
# File did not pass validation
ntfy-desktop-2.1.1-linux-arm64.zip: FAILEDIf you see FAILED and the files are indeed there, ensure you downloaded them from our repository and not somewhere else.
If you see OK; this means the files are valid.
Ntfy Desktop relies on the following packages:
| Package | Language | Description |
|---|---|---|
| electron | Javascript | Application shell; its built-in Notification API delivers the native toasts |
| electron-builder | Javascript | Builds the Windows installer / portable exe and the Linux / macOS packages |
| electron-log | Javascript | File logging |
| electron-plugin-prompts | Javascript | Node package which allows for more detailed and customizable interface forms |
| ntfy emoji list | JSON | Tag-to-emoji mapping, regenerated with npm run gen:emojis |
We are always looking for contributors. If you feel that you can provide something useful to this project, then we'd love to review your suggestion. Before submitting your contribution, please review the following resources:
Want to help but can't write code?
- Review active questions by our community and answer the ones you know.
The following people have helped get this project going:






