open source · typescript · postgres

notifications you own

push and in-app notifications inside your existing stack. your database, your endpoints, your users. no hosted notification service.

your database

devices, notifications, and deliveries are rows in your postgres. nothing lives in a service you do not control.

your framework

mount one handler in next.js, tanstack start, express, hono, nestjs, or node:http.

one call, every device

notify() fans out to web push, fcm on android, and apns on ios. each device routes by its own provider.

queue when you want one

one config line moves sends off the request path, with retries and backoff. dead tokens disable themselves and never crash a send.

configure once

export const push = betterPush({
  database: drizzleAdapter(db),
  providers: [webPush({ vapid })],
  session: getSession,
});

send from the server

await push.notify({
  userId: user.id,
  title: "your order shipped",
  data: { url: "/orders/123" },
});

add an in-app feed, user preferences, or an optional queue. configure only the parts your application needs.