A multi-server ntfy client for the Omarchy bar. Omartfy combines notifications from ntfy.sh and self-hosted servers into one keyboard-friendly panel while keeping each server's authentication, connection state, and unread count separate.
Website · Latest release · Report a bug
The screenshots use local fixture data. Omartfy follows the active Omarchy theme.
- One symbolic bar icon with unread, urgent, and connection indicators
- Merged chronological All inbox plus per-server tabs and quick filtering
- Multiple topics and credentials per server profile
- Bearer token, Basic, and unauthenticated connections
- Local read, delete, and clear state without publishing changes to ntfy
- Configurable header action to delete all notifications in the active view (with confirmation) or mark them all as read
- ntfy view, copy, and opt-in HTTP actions in an ntfy-style action row
- Timed or indefinite DND from the bar context menu
- Opt-in native Omarchy desktop toasts with global, per-server, duration, DND, and click-to-open controls
- Lazy icon and image-attachment previews with strict size, format, redirect, and origin checks
- Keyboard navigation, inline search, overflow tabs, and a dedicated server editor
- Durable cursor replay and event deduplication across shell restarts
- Omarchy with the Quattro shell plugin system
- Python 3
setprivfrom util-linuxwl-copyfrom wl-clipboardomarchy-launch-browseromarchy-notification-send
No pip package, npm package, third-party ntfy SDK, SSE package, or WebSocket package is required.
omarchy plugin add https://github.com/DailenG/omartfy --enableThe widget defaults to the right bar section. Open the panel and select Settings to add an ntfy server and one or more comma-separated topics.
Omartfy intentionally creates no default subscription: an unprotected ntfy topic name can act as a public address.
omarchy plugin update dailen.omartfyRestart the shell only if an update does not hot-reload:
omarchy restart shellEach profile has its own connection and trust boundary:
- Label: unique local name shown on tabs and notifications
- Base URL:
https://ntfy.shor a self-hosted HTTP(S) URL; reverse-proxy path prefixes are supported - Topics: one or more comma-separated ntfy topic names
- Authentication: none, Bearer token, or Basic username/password
- Allow publisher-supplied HTTP actions: disabled by default; enable only for trusted publishers
- Show toasts from this server: enabled per profile by default; the global desktop-notification switch remains the master control
- Allow credentials over insecure HTTP: shown only when credentials would cross non-loopback plain HTTP
A blank secret while editing an existing profile preserves the stored secret. Selecting a connected server filters the inbox; use the pencil button in Settings to edit that profile.
Native Omarchy toasts are disabled globally after installation and updates. Enable Show native Omarchy toasts in Settings, then disable individual noisy profiles with Show toasts from this server.
Omarchy default follows ntfy priority: low-priority messages use the native low lifetime, normal and high messages use the native normal lifetime, and urgent messages remain until dismissed. The explicit 8 seconds, 15 seconds, and 30 seconds choices use that exact lifetime regardless of priority; Until dismissed requires manual close.
Initial cached history populates the Omartfy inbox silently. New messages after the established cursor, including reconnect catch-up messages, can create native toasts. Left-clicking a toast summons the Omartfy panel on the focused monitor; right-clicking dismisses it.
Omartfy DND and Omarchy's global notification DND both suppress popups while the durable Omartfy inbox continues collecting. Omarchy owns native notification history as presentation state; it is not synchronized with Omartfy read or delete state.
In Settings, the Header action setting controls the panel header button:
- Delete all (default): Clears all notifications in the active view or server tab after confirmation.
- Read all: Immediately marks all unread notifications in the active view or server tab as read without removing them from the inbox.
Omarchy plugins do not claim global compositor shortcuts. To open Omartfy directly with Super+N, add this user-level binding to ~/.config/hypr/bindings.lua:
o.bind("SUPER + N", "Omartfy notifications", "omarchy-shell shell toggle dailen.omartfy '{}'")The panel focuses its first notification when opened from the shortcut.
| Key | Action |
|---|---|
j / k, Up / Down |
Select notification |
h / l, Left / Right |
Switch server tab |
| Enter / Space | Mark selected notification as read |
e |
Expand or collapse selected notification |
1–3 |
Run the corresponding visible ntfy action |
o |
Open the notification click URL |
a |
Open the attachment URL |
d, x, or Delete |
Delete locally |
r |
Reconnect and reload |
s |
Open server settings |
/ |
Search |
| Escape | Close search, nested UI, or panel |
| Tab / Shift-Tab | Switch adjacent Omarchy panels |
Right-click the Omartfy bar icon and choose 1 hour, 4 hours, Until tomorrow, or Until turned off. DND continues collecting notifications while suppressing the unread badge and urgent icon color. The setting survives shell restarts; use Turn off DND from the same menu to resume normal presentation.
Omarchy plugins run unsandboxed with the current user's permissions. Omartfy:
- Reads configuration from
${XDG_CONFIG_HOME:-~/.config}/omarchy/ntfy.json - Stores cursor, notification, deletion, DND, and media state under
${XDG_STATE_HOME:-~/.local/state}/omarchy/ntfy/ - Writes configuration and state atomically with mode
0600; the state directory uses mode0700 - Stores configured tokens and passwords locally in the mode-
0600JSON configuration file; it does not use a keyring - Sends credentials only in HTTP authorization headers, never URLs or process arguments
- Never disables TLS certificate verification
- Keeps HTTP actions disabled per server until explicitly enabled
- Runs publisher-provided HTTP actions only after user activation, without redirects or retries
- Launches validated HTTP(S) view URLs through
omarchy-launch-browserand copies values throughwl-copy - Fetches notification icons and attachment previews only from the configured server's exact scheme, host, and effective port; every automatic-media redirect must retain that origin
- Keeps explicit, user-activated opening of validated HTTP(S) view and attachment URLs separate from automatic media fetching
Review topic access controls and publisher trust before enabling a server or HTTP actions. See SECURITY.md for the reporting policy and implementation boundaries.
Use the profile's Test button first. Confirm that the base URL is reachable, the topic exists, and the configured credentials can read it. Reverse proxies must allow long-lived HTTP streaming; if they buffer or close the stream, Omartfy automatically falls back to periodic polling.
Press r or use the ↻ header button to reconnect and reload configuration. Omartfy resumes from its persisted ntfy cursor and deduplicates replayed events.
View and copy actions require a valid destination. HTTP actions additionally require Allow publisher-supplied HTTP actions on that server. Enable it only when every publisher on the subscribed topics is trusted.
Validate the installed plugin and restart the shell:
omarchy plugin validate ~/.config/omarchy/plugins/dailen.omartfy
omarchy restart shellomarchy plugin remove dailen.omartfyRemoval leaves configuration and local notification history in place so reinstalling does not lose state. To remove that data too, after removing the plugin run:
rm -rf ~/.config/omarchy/ntfy.json ~/.local/state/omarchy/ntfyValidate and test from the repository root:
python3 -W error::ResourceWarning -m unittest discover -s test -p 'test_*.py'
node --test test/model.test.js
omarchy plugin validate "$PWD"test/mock_ntfy.py provides a local ntfy-compatible HTTP fixture for stream, action, authentication, and media checks. Contribution setup and pull-request expectations are in CONTRIBUTING.md.
Omartfy is licensed under the MIT License. Copyright © 2026 Dailen Gunter.
The ntfy mask in assets/ntfy-mask.svg is copied from ntfy commit 4c2b69e0591b51d7ed7b2e71954f0f7be936b47f and remains licensed under Apache-2.0. Its attribution and complete license text are preserved in the asset and third_party/ntfy-APACHE-2.0.txt.

