Push notifications at the edge.
Open source alternative to Expo Push Notification Service. Send native iOS and Android pushes through a single API, running on Cloudflare Workers.
import { Edgepush } from "@edgepush/sdk";
const client = new Edgepush({
apiKey: process.env.EDGEPUSH_KEY, // io.akshit.app|...
});
await client.send({
to: userDeviceToken,
title: "New order",
body: "Your coffee is ready ☕",
data: { orderId: "abc123" },
});No more separate APNs and FCM integrations.
edgepush abstracts the differences and dispatches to the right platform.
Use native tokens, bring your own credentials.
Your APNs .p8 keys and FCM JSONs stay encrypted in D1. Revoke anytime.
How it works
Bring your credentials
Upload your APNs .p8 key and Firebase service account JSON in the dashboard. Both are encrypted with AES-GCM before being written to D1.
Generate an API key
Keys are scoped to a single app and prefixed with the package name so they self-identify in logs: io.akshit.myapp|abc...
Send from anywhere
Use the SDK or POST directly to /v1/send. Dispatched through Cloudflare Queues with automatic retries and a dead letter queue.
Built for production
Fully open source
MIT licensed. Self-host on your own Cloudflare account with one wrangler deploy.
Native tokens
No proprietary token format. You use real APNs device tokens and FCM registration tokens.
Delivery receipts
Every send returns a ticket id. Poll the receipt or subscribe to webhooks for delivered/failed events.
Rate limiting built-in
Per-app token bucket via Durable Objects. No surprise throttling from your own code.
Webhook events
Get HMAC-signed POSTs when a message is delivered or fails. Automatic token invalidation detection.
Encrypted credentials
Your APNs .p8 and FCM service account JSON are encrypted at rest. The raw key is never exposed via the API.
Ship pushes in 5 minutes.
Free forever on the hosted service, or self-host on your own Cloudflare account.