Add realtime in-app notifications to your product with two SDK calls. Reliable queue-backed delivery, SSE streaming, and full self-host control with no vendor lock-in.
await pigeon.send({ userId: 'user_tz9k3m', type: 'order.shipped', title: 'Your order shipped!', body: 'Package #4521 is on its way.' })
Two packages. Two functions. Real-time in-app notifications in any app with no third-party vendor, no lock-in.
One package for your server, one for your React frontend.
Call send() with your API key. The notification is enqueued and delivered reliably — no duplicates with idempotency keys.
Wrap with NotifyProvider and call useNotifications(). Updates arrive in real-time over SSE — no polling.
Persistent server-sent event streams with automatic reconnect and missed-event replay using Last-Event-ID. No WebSocket complexity.
BullMQ processes every notification. Idempotent sends prevent duplicates.
HMAC-signed x-pigeon-signature POST requests. Every attempt fully logged — response codes, error messages, timestamps.
Isolated dev and production environments with scoped API keys per project.
Pigeon owns the infrastructure layer. You write the product logic.
Your backend calls pigeon.send(). The API validates your key, upserts the end user, inserts the notification, and enqueues the delivery job synchronously.
A BullMQ worker picks up the job, renders any configured template, marks the notification as delivered, publishes to Redis pub/sub, and enqueues webhook jobs.
The SSE stream forwards the event instantly. On reconnect, Last-Event-ID lets the API replay missed events from Redis Stream — zero notifications lost.
One docker compose up brings the full stack online: API, background worker, admin dashboard, PostgreSQL, and Redis. No external services required.