Desktop notifications, without the noise
Webhook in. Toast on your desktop.
Notify is a minimal, resident notification center. Pipe deploys, alerts and cron results into one quiet place — rendered as cards, categorized, stored locally, replayed when you come back online.
{
"category": "deploy",
"template": "deploy",
"data": {
"title": "Build finished",
"branch": "main",
"commit": "a1b2c3d",
"status": "ok",
"duration": "2m13s"
},
"actions": [
{
"label": "View logs",
"url": "https://example.com"
}
]
}send pops a live toast, top right — the actual desktop card component
How it works
Send
POST a JSON payload to /v1/send with an API token — from CI, cron, a monitor, or the thin SDK. Anything that speaks HTTP is a sender.
Route
Each account gets its own Durable Object: an isolated queue with a live WebSocket to your desktop. Messages buffer while you are offline.
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.
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 counts, 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
- 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.