Live cursors
A shared canvas where every visitor's pointer shows up with a name and a colour.
Pikoman is a hosted WebSocket API. Your systems publish with one signed HTTP request, and every dashboard, tablet, browser and bot that should know is told within milliseconds. No polling, no servers of your own to keep running. Your keys are made in your browser, and we only ever receive their public half.
Every depot sees a shipment move the moment it does.
The background traffic is simulated. This sends one real message through the API to everyone on this page.
Gates, loading bays and cameras tell the control room what is happening on site.
North gate, Plant 2 Trucks today 14
Machines report to the control room as it happens, and alarms reach the floor at once.
Line 4 Produced today 1,284
The whole floor on one screen: machines, belts and forklifts report as they move.
Plant 2, floor view Shipped today 1,284
The whole team sees who is online and who has picked up what.
Queue
Agents
Every feature is a small JSON message on a WebSocket. Its op says what kind of message it is, and
each kind has its own colour across the site.
Shared pointers, selections and edits. Browsers send to each other through a presence channel, no backend round trip.
Know who is in the room, with the profile data your server signed for them, and get told when they leave.
Tell a user their export finished or their order shipped. One POST from any language that can speak HTTP.
Keep the truth on your server and push each new state. Late joiners fetch once, then follow the stream.
Every request to Pikoman is signed with Ed25519, and no password or secret key is ever sent. What we store is not enough to publish as your app, or to join its private and presence channels.
Each key is a key pair, made in your browser. The private half is shown to you once and never sent; Pikoman only ever receives the public half. Or make the pair on your computer and paste in just the public key.
Your backend sends a token it signed itself, valid for at most ten minutes, never the key. The API refuses plain HTTP.
Pick its rights: publish, stats, clients, disconnect,
disconnect_all, subscribe, client_events. Then, if you like, limit it
to channel kinds, channel prefixes, IP addresses and an expiry date.
An app can have several API keys, and several signing keys for its users' join tokens. Add the new one, switch to it, delete the old: nobody is turned away.
On private-encrypted- channels the messages are encrypted before they reach us, and Pikoman only
relays ciphertext it cannot read.
3 rights, every channel, never expires.
Never expires. Delete it when you no longer need it.
| What leaks | What it can be used for |
|---|---|
| Pikoman's stored data: database, logs, backups | Nothing on your app. Public keys cannot sign, so they cannot publish, or join your private and presence channels. |
| One of your API keys | Only that key's rights, on its channels, from its addresses, until it expires or you delete it. A deleted key stops working within 30 seconds. |
| One signed request | The same rights as its key, for what is left of the token's ten minutes at most. |
| A user's join token | One channel, for the one connection it was made for, for at most ten minutes. |
What this does not cover: someone who took over our running servers could let forged requests through, as with
any hosted service. Content that must stay private even then belongs in private-encrypted- channels.
How it all works is in Keys and the HTTP API.
Give a bot an API key of its own, with the subscribe right and only the channels it needs. It signs
its own join token and connects straight to Pikoman: no web page and no token endpoint of yours in between.
Shop backend
Order 1042
18,900 kr
Pikoman
private-orders- eu
Order botAI agent
Order 1042 Needs a look
Outside the shop's rule
Pikoman
private-orders- staff
Staff screen
Order 1042 needs a look
New customer, 3× usual amount, ships abroad
Order botk_3f9a1c0e5b7d2468
subscribe client_events publishprivate-orders-203.0.113.7What the bot sends and gets
The token's header names the key (kid), so Pikoman checks it against that key's rights and limits.
Without client_events a bot can only listen. With it, it can send in the channels it has joined, and with publish it can post over HTTP with the same key.
In a presence channel Pikoman lists the bot with the key it joined with, next to its member data, never in it. Your users can tell, and nobody can pass as a bot by writing "bot": true.
A support bot that steps into a chat and answers until a person takes over. An assistant that follows your live events through an MCP server. A stock watcher that tells the warehouse channel when an item runs low.
Swedish speech-to-text for interviews and meetings. Pikoman delivers its live updates.
Story point estimation for scrum teams. Pikoman keeps everyone in a room in sync.
An invite-only social network. Pikoman carries what happens inside, live.
Fuel prices and price alerts for drivers across South Africa. Pikoman delivers its live updates.
Your product could be next. Tell us what you are building and we will help you get it live.
The JavaScript client is one small package. Publishing needs no SDK, only a signed token.
Run npm install @pikoman/ws@next and open a connection with your app id from the dashboard.
import Pikoman from "@pikoman/ws";
const pikoman = new Pikoman("your-app-id");Subscribe to a channel and handle the events you care about. Payloads arrive parsed.
const orders = pikoman.listen("orders");
orders.on("shipped", (order) => {
showToast(`Order ${order.id} is on its way`);
});
POST to /{channel}/{event} from your backend, with a short-lived token signed by an API key that
may publish. Everyone listening gets it. Signing takes a few lines in any language.
curl -X POST https://next-api.pikoman.se/orders/shipped \
-H "Authorization: Bearer $PIKOMAN_TOKEN" \
-d '{"id": 1042}'Pusher is the service most people know. Both do channels, presence and encrypted channels; the difference is in the keys.
| Pusher Channels | Pikoman | |
|---|---|---|
| How a request is proven | HMAC signature with the app secret | Ed25519 signature, valid at most ten minutes |
| What the provider holds | The same secret you sign with | Only public keys |
| Rights per key | No, a key can do everything | Seven rights, plus channel kinds, prefixes, IP addresses and expiry |
| A bot joins a private channel | Through a client and your own auth endpoint | With its own key, nothing in between |
| End-to-end encrypted channels | private-encrypted- |
private-encrypted- |
Pusher as described in its public documentation, October 2026. Rights per key work like Stripe's restricted keys, with one difference: a Stripe key is sent with every request, and a Pikoman key never is. Full comparison with Ably and PubNub, prices and how to switch.
Each one shows its socket traffic while you use it, so you can see exactly what your app would send and receive.
A shared canvas where every visitor's pointer shows up with a name and a colour.
A private room with a member list, typing indicators and a greeting pushed from the server.
Write a notification, send it through the HTTP API and watch it land. The page shows the matching curl command.
Vote and watch the totals move for everyone. The server owns the count and broadcasts each change.
Paste your app id and private key, join a channel and send events. The key never leaves the page.
Sign in with GitHub, create an app and get its keys right away, then follow the quickstart. The example repository is a working SolidJS starter.