channel.publish()
Channels
Fan out named events over WebSocket or REST to app-scoped channels with predictable delivery semantics.
Presence, pub/sub, channels, history, and low-latency sync for collaborative tools, marketplaces, live dashboards, communities, and multiplayer apps.
Built to run the multiplayer games on foony.com, now packaged for every developer team.
Live right now
demo:homepage · wss://realtime.foony.io
Connecting…
Connecting…
Live events on this channel
What subscribers receive
Realtime primitives
Foony Realtime gives product teams a managed realtime layer: channels for fanout, presence for liveness, history for recovery, and scoped auth for safe clients.
channel.publish()
Fan out named events over WebSocket or REST to app-scoped channels with predictable delivery semantics.
presence.enter()
Track who is online, refresh membership automatically, and react to enter, update, and leave events.
channel.history()
Replay recent messages from durable storage so clients can recover cleanly after reconnects.
POST /auth/token
Mint short-lived client tokens from your backend with channel-level publish, subscribe, presence, and history permissions.
Typical realtime platforms cap each channel at around 50 messages a second, reject payloads over a few kilobytes, and bill messages, connections, channels, and bandwidth separately. Foony Realtime meters one thing: messages.
Uncapped
Channels have no rate ceiling of their own. Push one channel as hard as your plan allows.
1 MB
On Growth and up. Free starts at 64 KB, the paid ceiling on most platforms.
150,000/s
Per-app throughput on Scale. Enterprise runs uncapped.
AES-256
Encrypt in the SDK with a key only you hold. The service only ever sees ciphertext.
30 days
Replay any channel, so reconnecting clients recover cleanly instead of starting blind.
$0.25
Flat plans from $0. Connections and channels never bill separately.
Create an app, install the SDK, publish an event, and watch it arrive in the channel inspector.
const realtime = new Realtime({ authCallback });const channel = realtime.channels.get('chat:lobby'); channel.on((message) => { showMessage(message.data);}); await channel.publish('chat', { text: 'hello' });await channel.presence.enter({ name: 'acorn' });Get an app ID, environment, and server key from the dashboard.
Use TypeScript-first clients for browser and server workflows.
Listen for messages, presence changes, and history from one app-scoped namespace.
Inspect channel traffic, delivery health, and usage before launch.
9M messages, 300 concurrent connections, and 300 channels every month, free. Upgrade when your traffic does.