The developer-first alternative to OneSignal: push, email and SMS on your own accounts, in-app inbox, live messages and native attribution through one idempotent API, with per-device delivery logs that show you the raw provider response, not a shrug.
Free tier forever · first notification in ~10 minutes · sign in with GitHub or Google
import { Notibase } from "@notibase/node";
const nb = new Notibase(process.env.NOTIBASE_KEY);
await nb.messages.send({
audience: { filter: { attr: "country", op: "in", value: ["NP","IN"] } },
content: {
title: "Hello {{first_name | default: 'there'}} 👋",
inapp: { title: "Also in their inbox" }, // persists
live: { title: "…and on screen right now" }, // instant banner
email: { subject: "And in their email", html }, // your SMTP
sms: { text: "…and a text, if it matters" }, // your gateway
},
}); // idempotent by default, retries can never double-notify
One send call. Push to their device, email through your SMTP server, SMS through your gateway — addressed to a person, not to a device, so the last two reach people who never installed anything.
Why Notibase
Every feature exists because the alternative was a support ticket.
Per-device delivery timelines with the raw APNs/FCM/browser response preserved, plus AI explanations of any error code. No more "it says delivered".
Zero-dependency SDKs for Web, iOS, Android, Flutter and Node. No version conflicts, no bloat, first push on your own screen in ~10 minutes.
Web push, APNs and FCM behind a single send call. Write the notification once; we handle each platform's quirks, tokens and retries.
A versioned filter language over typed attributes, with live counts. Describe an audience in English and let AI build the filter.
A persistent in-app inbox, live in-app messages (banners/modals over WebSocket), email through your own SMTP server and SMS through your own gateway all ride the same send. One API call, five surfaces — and the last two reach people who never installed anything.
Branch-style links: click → install → purchase revenue per campaign, first-touch honest, exact vs inferred labeled. No second SDK.
Also in the box: scheduled sends — including the same local hour in every time zone — six team roles, and AI that writes the copy and builds the audience filter from a sentence. See the docs →
SDKs
Every SDK is dependency-free or close to it. No version conflicts with your app, ever. Mobile cores are end-to-end tested against the real API in CI before every release.
import { Notibase } from "@notibase/web";
const nb = new Notibase({ clientKey: "ck_live_…" });
await nb.init(); // worker, permission prompt, device registered
await nb.identify("user-42", { signature }); // verified identity
await nb.trackPurchase(9.99); // revenue, per campaign
import { Notibase } from "@notibase/node";
const nb = new Notibase(process.env.NOTIBASE_KEY);
await nb.messages.send({
audience: { filter: { attr: "country", op: "in", value: ["NP","IN"] } },
content: { title: "Hello {{first_name}} 👋" },
}); // idempotent, retries never double-send
import Notibase // Swift Package Manager, zero dependencies
Notibase.configure(clientKey: "ck_live_…")
Notibase.registerForPushNotifications() // permission, APNs, opens, links
Notibase.identify("user-42", signature: sig)
Notibase.trackPurchase(9.99, productId: "pro_monthly")
// Kotlin, zero dependencies, works with your existing FCM setup
Notibase.init(context, clientKey = "ck_live_…")
// That is the whole integration. Tokens register themselves, taps are
// recorded, and a message's link opens, nothing else to wire.
Notibase.identify("user-42", signature)
Notibase.trackPurchase(9.99, productId = "pro_monthly")
import 'package:notibase_flutter/notibase_flutter.dart';
await Notibase.configure('ck_live_…');
await Notibase.attachFirebase( // pure Dart, one dependency
FirebaseMessaging.instance,
onMessageOpenedApp: FirebaseMessaging.onMessageOpenedApp);
await Notibase.trackPurchase(9.99, productId: 'pro_monthly');
import Notibase from "@notibase/react-native";
await Notibase.configure({ clientKey: "ck_live_…" });
// Pure TypeScript beside expo-notifications or react-native-firebase.
// No native module, so nothing to link and no pod to install.
await Notibase.setPushToken(token);
await Notibase.trackPurchase(9.99, { productId: "pro_monthly" });
npm i @notibase/nodenpm i @notibase/webcom.github.notibaseorg:notibase-androidgithub.com/notibaseorg/notibase-iosflutter pub add notibase_flutternpm i @notibase/react-nativeHow it works
Sign in with GitHub or Google, generate web-push crypto with one click, mint a client key for your frontend and a server key for your backend.
Two lines in the browser or app registers the device. Your APNs/FCM credentials upload once, validated live, sealed at rest.
Target with typed filters, ride the same send into the inbox and live banners, then watch delivery, growth and revenue in Analytics.
Pricing
One send is one message to one recipient — so a campaign to 10,000 people is 10,000 sends, not one. Campaigns, segments and subscribers are unlimited on every plan; the quota counts what actually goes out. Paid plans do not stop when you reach it — they keep sending and bill the difference, up to a ceiling each card states, so a leaked key or a retry loop cannot run up a bill nobody set.
Subscribers are unlimited on every plan, so growing an audience never costs more on its own — only messaging it more often does. Need more, or custom terms? [email protected]
Security
Full details in the security docs · responsible disclosure: [email protected]
Writing
How push actually works, what breaks, and how to debug it, written by the people building the platform.
Free forever tier · first push on your own screen in ~10 minutes · no card.
Occasional, substantive updates only. We are a notification company; we know better.