easy-pingv0.10.3

Get in touch

Questions, bug reports, or anything about easy-ping. Either of these reaches me.

Emailmain@easy-pings.comDiscorddiscord.gg/bJ5wGFD3H

For anything others would benefit from, a GitHub issue is better than a DM, because it's searchable.

GitHub

Open-source notifications for TypeScript

easy-ping.

Add an inbox, email, and push notifications to your app.

Send once. Deliver to every channel you choose. Respect user preferences. Keep the data in your own database.

$pnpm add easy-ping
  • v0.10.3
  • MIT
  • 1 runtime dep
  • no services to run

In-app inbox / Email / Web push / Telegram / Mobile push beta

app/api/comments/route.ts
await notify.send("commentReply", {
  to: threadOwnerId,
  payload: { authorName: "Dana", commentId: "c_123" },
  dedupeKey: "commentReply:c_123",
});

See it work

One send(). Every screen.

Press send. The bell updates, a push notification appears, the email lands on the phone, and a Telegram message follows.

app/api/comments/route.ts
await notify.send("commentReply", {
  to: userId,
  payload: { authorName: "Dana", commentId: "c_123" },
});
  • In-app
  • Web push
  • Email
  • Telegram

Simulated in your browser. Nothing is sent.

Launch plan
MailInboxUp to date
  • AAcmeYour weekly summary3 projects moved this week.Mon
  • AAcmeWelcome to AcmeHere is how to get started.Sep 2

From your first bell to every channel

What you can build

Start with the inbox. Add channels, preferences, and digests as you grow.

Keep users in the loop

An inbox inside your app

Live updates, unread badges, read states, and pagination. Headless React hooks hold the state. You build the UI.

Replies / mentions / activity

Read the guide

Reach beyond the app

Email, push, and Telegram

Transactional email, browser push, and Telegram from the same event. Native mobile push is in beta.

Order updates / reminders / alerts

Read the guide

Give users a choice

A notification preference center

Each user picks which notifications reach which channels. Their choices apply when you send.

Per user / per notification / per channel

Read the guide

Less noise, more context

Daily and weekly digests

Roll updates into a scheduled summary instead of sending each one. Delivery follows each user's timezone.

Activity summaries / daily roundups

Read the guide

Fits the app you already have.

Bring your database and authentication. No separate notification service to deploy.

How it compares

A library, not another service to run

The alternatives are good, and most are platforms you run. easy-ping is a dependency you install. That difference decides almost everything else.

easy-pinga libraryNovuself-hostedKnock · Courierhosted SaaS
What you deployNothing. It runs inside the app you already have.Four services. API, worker, dashboard and websocket.Nothing. It runs in their cloud.
Infrastructure it addsNoneMongoDB, Redis and S3, on top of your ownNone
Where notifications are storedYour Postgres, MySQL, SQLite or MongoDB, in tables you can queryNovu's own MongoDBTheir database, reachable by API
Cost per notificationNoneNone, but you pay for the serversMetered per send
LicenseMIT, all of itMIT core, commercial enterprise modulesProprietary
How you integrateOne config file, one send(), one hookHTTP API plus an embeddable inboxHTTP API plus an embeddable inbox
Visual workflow editorNo. A notification is code, reviewed like codeYesYes
Channels out of the boxIn-app, email, web push, mobile push, TelegramDozens of providers across every channelDozens of providers across every channel

Checked 22 September 2026 against Novu's repository and self-hosting guide, and the Knock and Courier pricing pages. They are good tools solving a bigger problem. If you need a workflow editor that a non-developer can edit, use one of them.

Delivery

Four ways to deliver, one durability floor

Persist first, then deliver. Retries live in your database. Delivery is at-least-once, with no queue service to run.

ModeDelivery happensLatencyNeeds cron
inlineBefore send() resolvesin-requestrecommended
deferredAfter the response, via waitUntil~1 syes
workerIn-process loop, woken by send()instantoptional
cronWhen the sweep runsup to the intervalyes

Built for how you actually work

Your AI doesn't know this library yet.

easy-ping shipped after every current model's training cutoff. Ask Cursor or Claude to wire it up cold and you'll get a confident, fluent, completely invented API.

So we ship the context. Grab a prompt below, paste it in, and your assistant writes against the real surface instead of guessing at it.

without the context
notify.createNotification({ … })
// plausible. fluent. does not exist.
with it
await notify.send("commentReply", { to, payload })
// typed against your own definition

Ship it this afternoon.

Schema, config, one send(), and the bell. The quickstart covers it in order, gotchas included.