Desktop notifications, without the noise

Webhook in.Toast on your desktop.

Notify is a minimal, resident notification center. Send any message to your desktop, whether a deploy, an alert, or a ping to yourself. Auto-categorized, never lost offline.

Download the app ↓Read the docs
Try it, send a payload
curl -d "Nightly backup complete" \
  notify-server.saasflare.dev/v1/send/ntfy_…
Start with a line. Add structure when you need it.

Tap a tab and the card pops top-right. It’s a simulation: exactly how the installed desktop app would render this message.

Lives in your menu bar

One quiet place for everything.

Tray-resident and a few MB of memory. Your own categories, unread counts instead of noise, and full history kept in local SQLite.

Notify
NotifyNotify
onStack toasts
All4
alerts1
ci2
deploy1
Sign outSign out
All · 4Mark all read
offline msg 2
ci · 2026/6/10 17:55:45
offline msg 1
ci · 2026/6/10 17:55:45
M2 alert check
alerts · 2026/6/10 17:54:13
M2 persistence check
deploy · 2026/6/10 17:54:13
ci · text
offline msg 2
Received while offline and replayed on reconnect. Stored in local SQLite, searchable and readable any time.
RECEIVED
2026/6/10 17:55:45
MESSAGE ID
89a088cc-4cc3-4b45-a0b0
Mark readCopy payload
How it works

Webhook to toast in three moves.

01

Send

POST a JSON payload to your personal webhook URL, from CI, cron, a monitor, or any script. Anything that speaks HTTP is a sender; no SDK, no keys.

02

Route

Each account gets its own Durable Object: an isolated queue with a live WebSocket to your desktop. Messages buffer while you are offline.

03

Receive

The resident desktop app pops a card toast, files it by category, counts unread in the tray, and keeps full history in local SQLite.

The protocol

Data over the wire, components in the app.

A message is a template key plus data, never markup, never code. The desktop app renders it with components compiled into the bundle, so senders stay untrusted and cards stay fast. Unknown templates fall back to plain text; nothing is dropped.

Browse card templates →
{
  "category": "deploy",          // grouping, unread, filters
  "template": "deploy",          // key into the card registry
  "data": {                      // props for that card
    "title": "Build finished",
    "branch": "main",
    "status": "ok"
  },
  "style":   { "accent": "#22c55e", "urgency": "normal" },
  "actions": [{ "label": "View logs", "url": "https://…" }]
}
Built in

Everything a quiet inbox needs.

Real-time push

WebSocket from a per-user Durable Object; no polling, idle costs nothing.

At-least-once delivery

Queued before pushed, deleted only after your desktop acknowledges.

Local-first history

Every message lands in local SQLite, searchable and readable offline.

Card templates

Messages carry a template key and data. Components ship in the app; code never travels.

Tenant isolation

One Durable Object per user. Your queue, connections and storage are physically yours.

Quiet by design

Tray-resident, a few MB of memory, categories with unread counts instead of noise.

Get the app.

Builds are not code-signed yet: on macOS right-click the app and choose Open the first time; on Windows choose More info → Run anyway in SmartScreen.

One webhook from your first toast.

Get startedcurl -d "build passed" notify-server.saasflare.dev/v1/send/ntfy_…