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.
curl -d "Nightly backup complete" \ notify-server.saasflare.dev/v1/send/ntfy_…
Tap a tab and the card pops top-right. It’s a simulation: exactly how the installed desktop app would render this message.
Tray-resident and a few MB of memory. Your own categories, unread counts instead of noise, and full history kept in local SQLite.
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.
Each account gets its own Durable Object: an isolated queue with a live WebSocket to your desktop. Messages buffer while you are offline.
The resident desktop app pops a card toast, files it by category, counts unread in the tray, and keeps full history in local SQLite.
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://…" }]
}WebSocket from a per-user Durable Object; no polling, idle costs nothing.
Queued before pushed, deleted only after your desktop acknowledges.
Every message lands in local SQLite, searchable and readable offline.
Messages carry a template key and data. Components ship in the app; code never travels.
One Durable Object per user. Your queue, connections and storage are physically yours.
Tray-resident, a few MB of memory, categories with unread counts instead of noise.
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.