Skip to content
LiveDeveloper preview is live

Notify your users. One API call.

One POST sends email, Slack, and in-app notifications. Sliding-window rate limiting, automatic retries, and a live delivery feed.

npm install pulsekit-sdk
pulsekit-sdk v0.1.1 on npm
TypeScript
await pulse.notify({
  event: "invoice.paid",
  user: "usr_4f91",
  data: { amount: 2400, currency: "USD" }
});
// 202 accepted
// { eventId: "1f9c2a…", receivedAt: "2026-09-18T14:32:08Z" }
One event, every channel

Infrastructure, not another workflow builder.

You define delivery targets; PulseKit runs the pipeline. Channels fail independently — a Slack failure never re-sends a delivered email.

Emailresend.com

Rendered from templates, sent via Resend with per-delivery status. No queue juggling on your side.

Slackincoming webhook

Fan out to channels or users through a plain incoming webhook. Failures are logged, never silently dropped.

In-appproject inbox

Written to the project inbox with read receipts and per-user targeting. New arrivals surface on the live feed.

How it works

Emit. Route. Observe.

01

Emit

Call notify once. Events are validated, persisted, and acknowledged with 202 before any work happens.

02

Route

Events pass a sliding-window rate limit, then the API enqueues delivery jobs. Channels fail independently — a failure on one never re-sends another.

03

Observe

Workers retry with exponential backoff + jitter and write a delivery log. Check status from the dashboard.

Proof, not promises

The contract, not the marketing.

Response codes, rate limits, and retry semantics are the product. Everything below is observable from the real API.

Ingest
202

accepted, queued, acknowledged

Rate limit
30/min

sliding window per project

Max attempts
5

exponential backoff + jitter

Live delivery feedLive

Illustrative sample — connect a project for the real feed

user.invited1.4s
invoice.paid1.7s
report.ready2.0s
security.alert2.3s

Explicit failure

Failures are recorded against the delivery log. No silent drops — a failed attempt is a visible status.

Boring primitives

One HTTP API, a queue, and workers. No esoteric SDK surface; the only moving part on your side is a POST.

Safe by default

Your secret key is issued once. User IDs and event names arrive as plain strings, and rate limits are on by default.

Your first event is one request away.

Create a project, copy a key, and call notify. The rest is a queue and a dashboard.