Pikoman is a hosted WebSocket service. It has public channels, presence channels with a member list, messages
between browsers, an HTTP API for your backend, and end-to-end encrypted channels. That is what Pusher Channels
does too. The difference is in the keys.
Pusher signs every request with an app secret, and Pusher keeps a copy of that same secret. One secret can do
everything. Pikoman signs with Ed25519 instead. Your browser makes the key pair and we receive only the public
half. You can have several API keys, and each one gets only the rights you give it: a
key for statistics cannot publish, and a bot's key reaches only its own channels.
Free
100 connections at once per app
We store
Only public keys
Switching
Not a drop-in: client and server code change
Pusher, Ably, PubNub and Pikoman
All four relay messages to connected clients. Here is where they differ.
Pusher Channels
Ably
PubNub
Pikoman
Keys with limited rights
No, a key can do everything
Yes, per channel
Tokens with read and write rights per channel, granted by your server with the secret key
Seven rights, plus channel kinds, prefixes, IP addresses and expiry
End-to-end encryption
private-encrypted- channels
AES-CBC, with a key the clients share
A cipher key in the client SDK
private-encrypted- channels, AES-256-GCM
Free plan
100 connections, 200,000 messages a day
200 peak connections, 6 million messages a month
200 monthly active users or 1 million transactions
100 connections at once per app
First paid plan
$49 a month: 500 connections, 1 million messages a day
As we read their public documentation, October 2026. PubNub is left out of the second table because we have not
checked how it signs requests. Tell us at hello@pikoman.se if we have
something wrong, and we will fix it.
What they cost
Prices per month in US dollars, from each provider's pricing page on 24 October 2026. They count different
things, so compare them with your own numbers.
Pusher Channels
A fixed plan for connections at the same time and messages a day.
Pusher's free 200,000 messages a day come to about 6 million a month, the same as Ably's free plan. Pusher's price
is fixed per plan; Ably's paid plans add what you use to the base fee.
Moving from Pusher
Pikoman is not a drop-in replacement. Pikoman 2.0 has its own protocol, so pusher-js and Laravel Echo cannot
connect to it. You change the client code and the server code. The concepts map one to one, so the change is
mostly renaming.
In the browser
Install npm install @pikoman/ws@next. subscribe becomes listen and
bind becomes on. There is no cluster to choose.
Pusher
import Pusher from "pusher-js";const pusher = new Pusher("app-key", { cluster: "eu" });const orders = pusher.subscribe("orders");orders.bind("order-shipped", (data) => { console.log(data.id);});
Pikoman
import Pikoman from "@pikoman/ws";const pikoman = new Pikoman("app-yourapp");const orders = pikoman.listen("orders");orders.on("order-shipped", (data) => { console.log(data.id);});
Private and presence channels
Channel names keep their private- and presence- prefixes. Pusher's auth endpoint
becomes a token endpoint: the client asks GET {auth_url}/{clientId}-{channel} and your backend
answers with a join token signed by the app's private key. Messages between members need no
client- prefix, and their handlers get the sender's connection id first.
Connection ids never contain -, so the path splits at the first one. OfflineAuthenticator
signs with the private key from the dashboard; 3 makes a full member. A PHP endpoint and one with no
library are in the quickstart. A custom request, such as a POST with a CSRF token,
works with your own authenticator.
Publishing from your backend
trigger becomes publish. The API key from the dashboard signs a short-lived token for
each request, so the key itself is never sent.
import { Rest } from "@pikoman/ws";const rest = new Rest({ app: "app-yourapp", apiKey: process.env.PIKOMAN_API_KEY,});await rest.publish("orders", "order-shipped", { id: 1042 });
From PHP or Python, signing the token takes about ten lines, and the
request is a plain POST. Encrypted channels keep the private-encrypted- name; how keys reach the
clients is in Encrypted channels.
What Pusher has that Pikoman does not
If you depend on one of these, Pusher is the safer choice today.
Webhooks
Pusher can call your server when a channel fills or empties and when members come and go. Pikoman has no
webhooks. Your backend can ask with stats and clients instead.
Libraries in many languages
Pusher has official server libraries for many languages, and clients for iOS and Android. Pikoman has a
JavaScript client and a Rust crate. Other languages sign tokens by hand, which the docs show for PHP and
Python.
Laravel broadcasting
Laravel has a Pusher driver built in, and Laravel Echo speaks Pusher's protocol. Neither works with Pikoman.
Push notifications
Pusher has mobile push notifications as a separate product, Beams. Pikoman only reaches open connections.
A long track record
Pusher has run in production for many years. Pikoman 2.0 is new: the client is a release candidate, and we
publish no SLA. The status page shows our measured uptime.
See it before you switch
The demos run on this site's own app and show their socket traffic. When you want your own, sign in with
GitHub and get an app key in a minute.
We would like to use Google Analytics to see which pages get read. It sets cookies and sends data to Google, so
nothing is loaded unless you say yes. Privacy and cookies