← Back to blog
MIGRATION GUIDE6 min read

Migrate from Pusher to NoLag

HB
Henco Burger
July 29, 2026

Pusher Channels popularised hosted realtime pub/sub, and a lot of apps still run on it. If you are moving to NoLag, the good news is that the mental model is almost identical: you subscribe to a channel, you bind to events, and a publisher sends data to everyone listening. This guide maps Pusher concepts onto NoLag and shows the same subscribe-and-publish flow in both.

Why teams move

NoLag keeps the pub/sub foundation you already rely on and adds a few things Pusher does not focus on:

  • Blueprint SDKs for chat, notifications, dashboards, tracking, and more, so common patterns are a few lines instead of a from-scratch build.
  • A coordination layer for AI agents: dispatch work, share state, observe decisions, and gate actions with human approval, on the same infrastructure as your app.
  • Quality-of-service levels and presence built in.

Concept map

PusherNoLag
App key + clusterApp (a container for rooms and topics)
ChannelRoom + topic
channel.bind('event', cb)room.on('topic', cb)
pusher.trigger('channel', 'event', data)room.emit('topic', data)
Presence channelPresence (per room)
Private channel + auth endpointActors, access tokens, and per-topic ACL

Before: Pusher

import Pusher from 'pusher-js'

const pusher = new Pusher('APP_KEY', { cluster: 'eu' })

const channel = pusher.subscribe('chat')
channel.bind('message', (data) => {
  console.log('Received:', data)
})

// On your server, using the pusher server SDK:
// pusher.trigger('chat', 'message', { text: 'Hello!' })

After: NoLag

import { NoLag } from '@nolag/js-sdk'

const client = NoLag('your_access_token')
await client.connect()

const room = client.setApp('chat').setRoom('general')
room.subscribe('message')

room.on('message', (data) => {
  console.log('Received:', data)
})

// Publish from any authorised client:
room.emit('message', { text: 'Hello!' })

The shape is the same. The main differences are that NoLag groups topics inside a room (so you get natural namespacing and presence per room), and access is controlled with actors and tokens rather than a per-channel auth endpoint.

Auth and access control

In Pusher, private and presence channels call back to an auth endpoint you host. In NoLag, a connection authenticates once with an actor access token, and what that actor can read or write is enforced at the broker with per-topic ACL. For browser clients, you can mint short-lived client tokens from your project signing keys so you never ship a long-lived secret.

Presence

Pusher presence channels map to NoLag presence, tracked per room. You get join and leave events and the current member list without standing up your own tracking.

Next steps