Realtime channels that scale to millions and idle for free.
A managed WebSocket service for channels, presence and live updates. Fan-out is free, idle connections cost nothing, and paid plans never hit a wall.
npm install @thunderclapjs/client @thunderclapjs/serverimport { Thunderclap } from "@thunderclapjs/client";
const thunderclap = new Thunderclap({
key: process.env.THUNDERCLAP_KEY,
// Grants private channels, fetched on every reconnect.
token: () => fetch("/api/realtime-token").then((r) => r.text()),
});
const room = thunderclap.subscribe("private-room-42");
room.bind("message", (data) => showMessage(data));
// Offline for a while? Fetch what you missed.
room.onGap((gap) => backfill(gap));Why Thunderclap
Built for traffic that spikes, and for the hours it doesn't.
Most realtime bills grow with every delivery and every idle socket. Thunderclap charges for what you send into it, and nothing for keeping people connected.
Fan-out is free
A message to one subscriber or a hundred thousand counts once. You pay for what you publish, never per delivery.
Idle costs nothing
Quiet connections hibernate and keepalives are answered at the edge, so a tab left open all night doesn't show up on your bill.
Elastic from zero
Capacity appears the moment it's needed and disappears when it isn't. No clusters to size, no warm pools, no scaling lag.
Never miss a message
Every event carries a sequence number. After a network drop, thunderclapJS tells you exactly which events to fetch from your own store.
Private channels, your way
Grant channels up front with a connection token, or authorize each one on demand. Your secret never leaves your server.
A five-minute Pusher migration
Point your existing Pusher clients and server SDKs at Thunderclap, then move to thunderclapJS when you're ready.
How it works
A mesh of tiny actors at the edge.
Connections land on lightweight shards near your users. Channels talk to shards, never to individual sockets, so a million people joining one room is a few hundred messages inside the mesh.
Capacity is a name, not a server
A shard exists the instant it's first used and costs nothing until then.
Channels scale with shards
Subscribe storms are absorbed at the edge instead of hitting one hot spot.
Ordered, with gaps reported
One writer per channel assigns sequence numbers, so clients know when to backfill.
Pricing
Plans that grow with you. No walls.
Pick a plan for what you expect. If you outgrow it, nothing gets cut off: extra usage is billed at simple pay-as-you-go rates, and every message fans out for free.
For side projects and prototypes.
$0/ month
- Public, private, presence and cache channels
- 1 app
- Community support
For your first real users.
$19/ month
- Everything in Spark
- Webhooks
- Gap detection
- 5 apps
- Email support
For products that live in realtime.
$79/ month
- Everything in Starter
- Presence up to 10k members
- Room affinity
- 99.9% uptime target
For scale, with guarantees.
$399/ month
- Everything in Pro
- Unlimited presence
- Relaxed-ordering channels
- Priority support
- 99.95% uptime target
Outgrow your plan? Keep going.
Paid plans are never capped. Usage beyond what your plan includes is billed on top, at the same rates on every plan. You get usage alerts, a live bill projection and an optional spending limit. Spark is free, so it stops at its limits instead.
| Beyond your plan | Rate |
|---|---|
| Peak connections | $2 per 1,000 peak connections |
| Messages | $3.50 per 1M messages |
| Fan-out to subscribers | Free |
Peak connections are measured at the 95th percentile of hourly peaks, so a few hours of spikes don't set your month's bill.
Millions of connections · Negotiated SLA · Region pinning · SSO and audit logs · Volume pricing
Spark is available now. Paid plans are coming soon; prices are in USD, excluding taxes, and may change before they open.
FAQ
Questions, answered.
Start building in minutes.
Sign in with your email: no password, no card. Your first organisation starts on Spark, the free plan, with an app and keys ready to use.