pusher-js in the
browser and the official Pusher server libraries on the backend. To migrate an
existing Pusher app, point the client at the ClutchCall host. You change
one URL. You do not swap the SDK, rewrite the protocol, or learn a new
channel model.
Use it for live dashboards, presence (“who’s here”), in-app notifications,
activity feeds, and collaborative UIs. It fits any case where a browser needs a
durable, low-latency stream of events. You do not operate a socket cluster.
The one-URL migration
If you already have a Pusher app, the whole migration is the connection config. Keep your channel names, your client event handlers, your auth endpoint, and your server-sidetrigger() calls. Change where the client connects.
You create app credentials (
app_id, key, and secret) in the
Realtime Console. Create a key there. Put it in
the config above. Then you are connected.Two clients: pusher-js or the QUIC-native SDK
You connect with one of two first-class clients. Both speak the same Pusher protocol. Both use the same channels/events/presence API, the same auth endpoint, and the same server-side publish. The choice is only client-side. You can run different clients per platform against one app.Stock pusher-js (WebSocket)
This is unmodified
pusher-js over wss://realtime.clutchcall.dev/app/<key>.
It is the zero-change path. You add no dependency and swap no import. You
only repoint wsHost. Every official Pusher SDK works without changes. Use
it for a pure drop-in migration on normal, wired networks.ClutchCall QUIC-native client
This is a drop-in, pusher-js-API-compatible client from the
ClutchCall SDK. It has the same constructor and the same
channels/events/presence API. It prefers WebTransport/QUIC and
automatically falls back down a transport ladder. Use it when clients run
on lossy, mobile, or high-latency networks.
Comparison
Using the QUIC-native client
The QUIC-native client is a separate first-party package. It is a drop-in replacement for thepusher-js import. It ships in the ClutchCall SDK under
the realtime subpath and exposes a Pusher-compatible constructor. Only
the import line changes.
/app/<key> handler as WebSocket. If the client cannot
establish WebTransport, it steps down to ws, and then to sockjs. A
connection is always made. You do not write fallback logic.
When the QUIC client helps. On a clean, wired network, WebSocket-over-TCP
is already fast and reliable. The QUIC-native client does not make it
meaningfully faster. The QUIC-native client wins on lossy, mobile, and
high-latency networks. QUIC avoids TCP head-of-line blocking: one lost packet
does not stall every channel. QUIC also reconnects faster via 0-RTT session
resumption. Use stock
pusher-js for a straight drop-in migration. Then move
the mobile and flaky-network clients to the QUIC-native client.The browser WebTransport server plane is live. Raw QUIC end-to-end (no
WebTransport hop) is the native mobile SDK path. Adopt it through the
ClutchCall native iOS/Android SDK, not a browser bundle. If you are not sure
that the native raw-QUIC path fits your app, start on the QUIC-native
browser/JS client. The channel code is identical for both paths.
The channel model
Realtime has the same three channel types as Pusher, the same naming conventions, and the same authorization rules. The channel prefix selects the behavior.Public
Any client may subscribe. There is no authorization. Use it for open
broadcast: public status, live scores, and data that is not per-user.
Private
These channels are named
private-*. Your auth endpoint HMAC-signs
each subscription, so only authorized clients can join. Use them for
per-user or per-tenant streams.Presence
These channels are named
presence-*. A presence channel is a private
channel that also tracks membership. Each subscriber contributes member
info. Every subscriber gets a live who-is-here roster with add/remove
events.Authorizing private and presence channels
Private and presence subscriptions are authorized exactly as with Pusher. The client asks your server to sign the subscription. ClutchCall validates the signed token against your app secret. Pointpusher-js at your existing
auth route. No other change is necessary.
authorizeChannel() (or authenticate() on older versions). The signing logic
does not change.
Client events
On private and presence channels, clients can send client events (names prefixedclient-*). These events fan out to the other subscribers without a
server round-trip. Use them for ephemeral, high-frequency signals that do not
need to touch your backend: typing indicators, cursor positions, live drawing.
Client events are not allowed on public channels. This matches Pusher.
The transport ladder
The wire semantics are identical for both clients: channels, events, auth, and client events. Both use the same/app/<key> handler on ClutchCall. Only the
transport differs:
1
WebTransport / QUIC
This is the QUIC-native client’s preferred rung. In the browser this is
WebTransport over HTTP/3. Native mobile SDKs can use raw QUIC. This rung
helps most on lossy and mobile networks.
2
WebSocket
Stock
pusher-js uses this rung directly. The QUIC-native client falls
back to it when it cannot establish WebTransport. The address is
wss://realtime.clutchcall.dev/app/<key>.3
SockJS
This is the final fallback rung. It serves restrictive networks that block
both of the rungs above. A connection is always made.
Start on WebSocket for a drop-in migration. Move latency- or mobility-sensitive
clients to the QUIC-native client later. Your channel code, auth, and server
publish do not change.
Publishing from your server
For server-side publishing, use the Pusher server library pointed at ClutchCall. Configure it with your app credentials and host. Then calltrigger().
- Node
- Python
- REST
Webhooks
Realtime can notify your backend about the channel lifecycle over signed webhooks. The events are channel occupied and channel vacated, plus member added and member removed on presence channels. Configure webhooks in the Realtime Console.Under the hood
Your events fan out across many shards and nodes in an edge mesh. A channel’s subscribers can be spread across the fleet and still see every event in order. You do not operate any of this. You run no socket cluster, no presence store, and no fan-out tier. The other modalities share the same operational model: connect a client, publish, and the mesh delivers.Shipped today: public channels,
private-* with HMAC subscription auth,
presence-* with membership, client-* events, and REST publish. These are
the core features and are production-ready. Newer webhook/batch features are
noted as preview above.Related
SDK & API
The full
pusher-js client, server publish, and auth surfaces against
ClutchCall.Console
Create app keys, see live channel stats, and configure webhooks. No code is
necessary.
Cookbook
End-to-end, runnable examples: presence rosters, notifications, dashboards.
Recipes
Focused patterns for common realtime UI problems.

