Pushforge
A modern, cross-platform Web Push Notification library with full VAPID support. Handles payload encryption, authentication, and delivery across Node.js, Browsers, Deno, Bun, and Cloudflare Workers. Zero dependencies, TypeScript-first, and built for modern web applications.
Install / Use
/learn @draphy/PushforgeREADME
PushForge
Web Push Notifications for the Modern Stack
Zero dependencies · Works everywhere · TypeScript-first
Documentation · npm · Report Bug
</div>Live Demo
See PushForge in action at pushforge.draphy.org — a fully working test site powered by PushForge on Cloudflare Workers.
- Enable push notifications on your device with a single toggle
- Send a test notification to all active devices — anyone visiting the page can send and receive
- See it working across browsers — Chrome, Firefox, Edge, Safari 16+, and more
- Subscriptions auto-expire after 5 minutes — no permanent data stored
The entire backend is a single Cloudflare Worker using buildPushHTTPRequest() from @pushforge/builder with zero additional dependencies.
The Problem
Traditional web push libraries like web-push rely on Node.js-specific APIs that don't work in modern edge runtimes:
❌ Cloudflare Workers - "crypto.createECDH is not a function"
❌ Vercel Edge - "https.request is not available"
The Solution
PushForge uses standard Web APIs that work everywhere:
import { buildPushHTTPRequest } from "@pushforge/builder";
const { endpoint, headers, body } = await buildPushHTTPRequest({
privateJWK: VAPID_PRIVATE_KEY,
subscription: userSubscription,
message: {
payload: { title: "Hello!", body: "This works everywhere." },
adminContact: "mailto:admin@example.com"
}
});
await fetch(endpoint, { method: "POST", headers, body });
Why PushForge?
| | PushForge | web-push | |---|:---:|:---:| | Dependencies | 0 | 5+ | | Cloudflare Workers | ✅ | ❌ | | Vercel Edge | ✅ | ❌ | | Convex | ✅* | ❌ | | Deno / Bun | ✅ | Limited | | TypeScript | Native | @types |
* Requires "use node"; directive — see example
Quick Start
# Install
npm install @pushforge/builder
# Generate VAPID keys
npx @pushforge/builder vapid
Frontend - Subscribe users:
const subscription = await registration.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: VAPID_PUBLIC_KEY
});
// Send subscription.toJSON() to your server
Backend - Send notifications:
import { buildPushHTTPRequest } from "@pushforge/builder";
const { endpoint, headers, body } = await buildPushHTTPRequest({
privateJWK: process.env.VAPID_PRIVATE_KEY,
subscription,
message: {
payload: { title: "New Message", body: "You have a notification!" },
adminContact: "mailto:admin@example.com"
}
});
await fetch(endpoint, { method: "POST", headers, body });
See the full documentation for platform-specific examples (Cloudflare Workers, Vercel Edge, Convex, Deno, Bun).
Packages
| Package | Description | |---------|-------------| | @pushforge/builder | Core library for building push notification requests |
Requirements
- Node.js 20+ or any runtime with Web Crypto API
- Supported: Cloudflare Workers, Vercel Edge, Convex, Deno, Bun, modern browsers
Development
git clone https://github.com/draphy/pushforge.git
cd pushforge
pnpm install
pnpm build
Contributing
Contributions welcome! See CONTRIBUTING.md for guidelines.
License
MIT © David Raphi
