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.

POSThttps://api.your-notify.dev/v1/send
{
  "category": "deploy",
  "template": "deploy",
  "data": {
    "title": "Build finished",
    "branch": "main",
    "commit": "a1b2c3d",
    "status": "ok",
    "duration": "2m13s"
  },
  "actions": [
    {
      "label": "View logs",
      "url": "https://example.com"
    }
  ]
}
→ press Send to deliver this payload

send pops a live toast, top right — the actual desktop card component

How it works

01

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.

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.

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 →
the whole protocol
{
  "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.

Five minutes from token to toast.

Get startedpnpm add @saasflare-dev/sdk
Notify — a quiet notification center for builders.