Three composable primitives — global key-value, real-time pub/sub, and unified job queues — built for Next.js and Vercel. No config files. No clusters. Just an API key.
Works with Next.js 13+ · App Router · Edge Runtime · Node.js
// Three APIs. One import.
import createClient from 'saasignal'
import NextResponse from 'next/server'
const ss = createClient(process.env.SAASIGNAL_KEY)
export async function POST(req: Request)
const orgId, metric, value = await req.json()
// Cache at the edge — ~200K writes / $1
await ss.kv.set(`metric:${orgId}`, value)
// Push to live dashboards — ~1M msgs / $1
await ss.channels.publish(`org:${orgId}`,
event: 'metric.updated',
data: metric, value
)
// Queue background work — ~1M jobs / $1
await ss.jobs.create(
trigger: type: 'immediate' ,
handler: 'https://acme.com/api/process',
payload: orgId, metric, value
)
return NextResponse.json( ok: true )
Queue, Task, and Cron are not different things — they're all "execute a handler, at some point, with retries." The only difference is the trigger.
Sub-millisecond reads from 300+ edge locations. Sessions, feature flags, rate limits, distributed locks — all from a single API.
import { createClient } from 'saasignal'
const ss = createClient(process.env.SAASIGNAL_KEY)
// Edge-fast sessions
await ss.kv.set('session:u_123', {
userId: 'u_123',
role: 'admin',
plan: 'pro',
}, { ttl: 86400 })
// Atomic counters
await ss.kv.increment('ratelimit:u_123')
// Batch operations
const { results } = await ss.kv.batch([
{ op: 'get', key: 'config:flags' },
{ op: 'get', key: 'config:limits' },
]) WebSocket and SSE subscriptions with presence, message history, and fan-out. Build live dashboards in minutes, not months.
// Publish from your API route
await ss.channels.publish('org:acme', {
event: 'metric.updated',
data: { mrr: 42840, delta: +1200 }
})
// Subscribe in the browser
const channel = ss.channels.subscribe('org:acme')
channel.on('metric.updated', ({ mrr, delta }) => {
setMRR(mrr)
})
// Presence — who's online right now
const { users } = await ss.channels.presence('org:acme')
console.log(users.length, 'users online') One primitive replaces three services. Immediate tasks, delayed execution, cron schedules, push queues, pull queues — all with retries and dead-letter.
// Send welcome email in background
await ss.jobs.create({
trigger: { type: 'immediate' },
handler: 'https://app.acme.com/api/on-signup',
payload: { userId: 'u_123' },
max_attempts: 3,
backoff: 'exponential',
})
// Nightly billing digest (cron)
await ss.jobs.create({
trigger: {
type: 'scheduled',
schedule: '0 9 * * *',
timezone: 'America/New_York',
},
handler: 'https://app.acme.com/api/digest',
}) Sign up, create an org, then a project. Takes 30 seconds.
Create a scoped key and add SAASIGNAL_KEY to your Vercel environment.
Run npm install saasignal and import with a single line.
Push to Vercel. KV, Channels, and Jobs are live on 300+ edge locations.
1 token ≈ $1 of Cloudflare infrastructure cost. Markup is built into top-up bundles & plans — usage itself is at-cost.
Start free. Scale as you grow. No infrastructure costs, ever.
1 token = $1.00 of real Cloudflare infrastructure cost.
Your subscription is how you bundle those tokens cheaply.
Need more? Contact us for enterprise pricing with SLAs.
Get KV, Channels, and Jobs in one API call. Free to start, no credit card required.