MIT on your Cloudflare account
Humans and agentsin the same room.
Chat, presence, Yjs, and invokeAgent share one room Durable Object. Public rooms take a pk_ in the browser. Self-host is MIT. Hosted is beta.
pnpm add @fluxy-chat/reactYour app
Live preview
Chat and agents first. Location, stream, collab, game, IoT, and Bridges run on the same Worker if you turn them on.
Try it without signing up.
Open a room, send a message, invoke an agent. This is the same Durable Object path as self-host. Hosted is still beta.
One room, humans and an agent
Same Durable Object. Pick a scaffold and copy the command.
npx @fluxy-chat/create-fluxy-chat@latest my-room --example shared-ai-roomDeploy in your account. Quotas live in D1. Console access can require a one-time ack; usage still runs through your Worker with your keys.
Bridges
You create the Slack, Discord, Telegram, WhatsApp, or Teams app and paste the token. WhatsApp in the EU is in a Commission case right now. We don't sell a WhatsApp channel.
Agents in-room
invokeAgent streams on the same timeline as chat. A copilot panel stays off the chat log.
One room DO
Chat, sendCursor, Yjs, HTTP ingest, invokeAgent. A second binary WebSocket only if you mount Yjs.
WorkflowAgent
Optional D1-backed agent steps on the Worker. Not required for invokeAgent.
Voice signaling
joinVoiceStage is a roster. Live audio is LiveKit. Clips are POST /messages/voice.
MIT self-host
Deploy the Worker + D1 in your Cloudflare account. Read every line of source.
Built for rooms that stay live
Chat, collab, and broadcast on one kernel
Same Durable Object room for messages, presence, and server events. Photos are product scenes, not a second stack.
Messaging basics, on the edge
Channels, presence, mentions, and webhooks without bolting on another realtime vendor. Tap or hover a row on desktop.
Rooms, presence, typing, delivery, polls, and invokeAgent on one Durable Object. Translation and your chrome stay in the product.
What ships in the box
Edge delivery, in-room agents, Bridges you wire yourself, and a console for day-two work. You own the UI. We run the room Durable Object.
Chat, presence, Yjs, and an agent sit on one Durable Object. Hosted is beta. Self-host is MIT. Pusher moves bytes. Liveblocks is the document. Stream Chat is a hosted chat product with channels and moderation.
- One room Durable Object: chat, presence, Yjs, invokeAgent
- Guest session or pk_ for public rooms; fc_ stays on the server
- fluxy.config onPublish plus hosted D1 overlay (no forked Worker)
- Bridges: you create Slack/Discord/Telegram apps on the same table
- Voice signaling (joinVoiceStage); media is LiveKit
- GDPR export/erasure on the Worker
- Named SDK errors (not_member, token_expired, anonymous_not_allowed)
- Open beta hosted. Pin npm versions.
Already set up? Open the console for rooms, agents, and billing.
Built-in architecture
Bridges
You create the vendor app. WhatsApp in the EU is in a Commission case. Build that connector yourself.
Streaming markdown
Table buffering, code fence tracking, inline marker healing for clean partial renders during AI streaming
invokeAgent
Agents on the same room timeline. A copilot panel stays off the chat log.
pk_ + guest
Publishable keys and joinPublicRoomAsGuest. fc_ stays on the server.
Middleware pipeline
Transform messages and AI responses before they land
Moderate, validate, enrich, and fan out from the edge. LLM middleware supports guardrails, caching, RAG injection, PII redaction, and logging via wrapGenerate / wrapStream / transformParams. Policy code stays on the data path, not in a sidecar you forget to deploy.
Developers
SDK, CLI, docs, and console in one repo
Auth, rooms, and retries sit behind hooks and route handlers. Scaffold a new project with create-fluxy-chat CLI. When you need keys, quotas, or billing, open the operator UI instead of wiring another admin surface.
Polls and GPS ride the same socket as chat
When someone votes, a device posts a reading, or a stage goes live, the room gets a server_event. You do not stand up a second realtime backend. Hosted is still beta.
Slack, Discord, Telegram, WhatsApp, Teams. You create the vendor app. Bindings live in one Worker table.
Modules on the same Worker
Marketplace, Web3, classrooms, stream, game, and IoT live in the sidebar. They are beta or labs, not a second product you buy.
- beta01
App Marketplace
Publish and install apps with signed manifests, scoped grants, and tenant installs.
Open - labs02
Cross-Channel Continuity
One identity across web, mobile, voice, and bot. Handoff without dropping the room.
Open - labs03
Spatial & Digital Twins
3D room scenes, entities, agent grants, and spatial presence on the same kernel.
Open - beta04
Web3 Chat
Wallet authentication, token-gated rooms, and on-chain message commitments.
Open
Also on the same worker
Realtime SDK
Chat, presence, Yjs, and agents in one room
Start with useChat. Cursors and ingest demos are on /labs. Voice goes through LiveKit. You wire Slack yourself in the console.
Ship a chat feature in an afternoon.
Rooms, presence, threads, and reactions on one Durable Object. Vertical events (polls, breakouts, stage live) arrive on the JSON socket via onServerEvent. Yjs, if you need it, is a second binary connection to the same object.
const { messages, sendMessage } = useChat({
roomId: "chat:room-42",
client,
onServerEvent: (ev) => {
if (ev.name === "edu.poll.created") showPoll(ev.data);
},
});
sendMessage("Hello from FluxyChat");Ship Squad
Leo: on it, adding you now.
Dana Ortiz
sounds great, will ping...
Design Circle
Wren: fresh comps up...
Leo Martins
You: deployed to staging
FluxyCollab
Everything teams need to build together
Whiteboard, kanban, documents, spreadsheets, and AI, all synced in real-time via CRDT. No save button required.
Stream, IoT, fleet, and game overlays are on /labs.
Cross-org rooms
A room other organisations can join
Cloudflare Agents is one agent in a Durable Object. This is a room. Two companies can sit in it with private whispers. Dangerous tools wait for a human. We wrap the payload on the Worker and can sign an export. Anyone with Worker secrets can unwrap. The model sees plaintext on invoke.
Cross-org rooms
Two companies, one room, private terms and settlement. Not a Cloudflare Agents class.
Critical-action quorum
High-risk tools and decisions wait for a binding ack from the humans who own the room.
Room envelope + attestation
Worker-wrapped payload and a signed export. Operators with Worker secrets can unwrap. Not customer KMS.
- Cross-org rooms and private terms
- Quorum on dangerous tools, on the same WebSocket as chat
- Worker-wrapped payload and a signed export. You do not hold a customer KMS.
- Room SQLite PITR (30-day bookmarks, restore on next wake)
- SSO and SCIM on self-host. Hosted login does not include SAML.
- Audit logs, retention, legal hold, GDPR export
- Per-tool approval gates and OpenTelemetry gen_ai spans
Walk the operator path in the cross-org console, room insights, and enterprise default story.
How we compare
Rough fit vs Stream, Ably, Pusher, and a DIY Durable Object. Full compare.
This table is the room. Spatial, IoT, and Stream have their own pages.
| Capability | Typical stream APIs | Typical Ably-style | Typical Channels (Pusher-style) | Fluxychat |
|---|---|---|---|---|
| Unit of value | Hosted chat (channels, moderation, Video SKU separate) | Pub/sub network | Pub/sub channels | The room: chat, presence, Yjs, invokeAgent on one Durable Object |
| pk_ in the browser (public rooms) | Usually user tokens | Token auth typical | Public channels | Yes: publishableKey + POST /tokens/anonymous. fc_ stays on the server |
| MIT server you can fork | No | No | No | Yes. Worker + D1 in your Cloudflare account |
| Chat history + pagination | Yes | Chat add-on / extra SKU | Cache-ish events | D1 + useChat loadMore |
| Agent on the room timeline | GenAI add-on | AI Transport (network) | No | invokeAgent writes chat messages |
| Hosted maturity | SLA on paid tiers | Enterprise SLA / HIPAA BAA | Enterprise-select SLA | Open beta. Pin npm. Written SLA only with a signed MSA |
| Tool approvals | GenAI add-on | Not the product | No | Mail previews do nothing. You press a button. You can require two people. |
Pricing
Free is the weekend plan. Starter is $20/mo after 200k persisted messages. Pro is $50/mo for heavier rooms. Calling the agent does not cost an extra seat. Hosted is still beta.
Console routes can require a one-time ack on your dashboard host. Billable usage still needs your Worker credentials.
Self-serve Stripe checkout when the Worker has STRIPE_SECRET_KEY. If /health.paymentsEnabled is false, pick a plan in the console or email us. Cards will not charge.
Free includes 200,000 messages, 5,000 agent invokes, and 50,000 webhook deliveries /mo. Starter is $20/mo. Pro is $50/mo.
Free
Weekend plan. No card. pk_ in the browser.
- 200,000 messages / month
- 5,000 agent invokes / month
- 50,000 webhook deliveries / month
- Public rooms with publishableKey. Cursors do not count as messages.
- 200k persisted messages and 5k agent invokes per month
- MIT self-host if you want the Worker in your account
- Community support on GitHub
Starter
Production traffic with fixed monthly limits.
- 500,000 messages / month
- 10,000 agent invokes / month
- 100,000 webhook deliveries / month
- Room kernel: chat, presence, Yjs, agents
- Signed webhooks with retries
- GDPR export and erasure endpoints
- Email support (best effort)
Pro
Heavy rooms, agents, and webhook volume.
- 5,000,000 messages / month
- 100,000 agent invokes / month
- 1,000,000 webhook deliveries / month
- 5M messages, 100k agent invokes, 1M webhook deliveries per month
- Priority support
- Custom retention and audit (contact us)
- Annual invoicing on request
Higher limits: email fluxychat@outlook.com. Hosted login does not include SAML.
Is chat end-to-end encrypted?▾
TLS in transit. You can wrap payloads with a room key the Worker holds. Anyone with Worker secrets can unwrap. The model sees plaintext when invokeAgent runs. There is no customer KMS.
Do agents count as seats or MAU?▾
No. Console seats are humans. Agents cost invokes: streaming replies, tool calls, MCP. A chatty bot is not extra MAU.
Why usage-based quotas?▾
Cost tracks messages, AI invokes, and webhook volume. Self-serve plans include fixed monthly quotas; heavy usage can be metered on Growth and above.
Do AI agent invokes count against my quota?▾
Yes. Each plan includes a monthly agent invoke limit. Streaming AI, tool calls, and MCP interactions count as invokes.
Are stream, collab, game, and IoT modules extra?▾
No separate SKU. Platform modules run on the same room and worker. Quotas apply to messages and agent invokes like chat.
Enterprise vs Business?▾
Business is high-limit self-serve with SSO add-on and audit export. Enterprise can add SCIM, DLP, a security review, and a written MSA. There is no public fleet SLO on this page.
What counts as a message?▾
Persisted chat messages (including agent replies on the timeline) and client_event frames that are not client-ephemeral-*. Cursors, typing, and presence_patch do not increment the message quota. Agent invokes are a separate meter. Room ids are not metered.
Is there a hackathon or maker plan?▾
Free is that plan. No card. Public rooms with a pk_ in the client. 200k persisted messages and 5k agent invokes per month. Hosted is beta. Self-host is MIT.
Is hosted production-ready?▾
Hosted is open beta. Pin npm versions. Cloudflare PoP RTT is Cloudflare's, not a FluxyChat SLA. Self-host MIT if you need the Worker in your account today.
Self-host vs hosted?▾
Same worker and SDK. Hosted is fastest to start; self-host gives full control on your Cloudflare account with MIT source.
Hosted is beta. Pin SDK versions.
FAQs
Questions we hear when teams compare hosted chat APIs and edge deployments.
What is the chat API vs the SDK?▾
Your backend talks to the Worker over HTTP. The browser uses @fluxy-chat/sdk to join a room, send, and render. Same product, two surfaces.
Can I keep the frontend on Vercel?▾
Yes. Lots of teams leave Next on Vercel or Netlify and run chat on Workers + Durable Objects. You skip the platform WebSocket limits and a second Pusher-style bill.
Is this Intercom, Zendesk, or a live-chat widget?▾
No. Those are support desks. FluxyChat is the room layer for chat inside your app: SDK, webhooks, agent timeline. You build the UI. Guide: /guides/in-app-chat-vs-support-desk.
Is this a Pusher or Ably replacement?▾
For tenant-scoped in-app chat on the edge, usually yes: rooms, history, reconnect, operator tools. For generic pub/sub or SMS/WhatsApp, keep those products and use FluxyChat for the chat slice.
How is this different from a fully managed vendor?▾
You can run the Worker and D1 in your Cloudflare account, read the MIT source, and control upgrades. Hosted cloud is there when you do not want to wire infra on day one.
Can I add moderation and webhooks?▾
Yes. Middleware on the edge, signed webhooks, and console pages for the boring admin work.
What are Durable Objects for chat?▾
Cloudflare puts shared state in a Durable Object. Chat rooms are the textbook case. FluxyChat uses one Room object per room and D1 for history. Guide: /guides/durable-objects-for-chat-rooms.
Humans and AI agents in the same room?▾
tool_call and tool_result ride the same WebSocket as user messages, so you replay one timeline instead of guessing what the agent did. Streaming markdown with table buffering and code fence tracking renders cleanly during AI responses. Guide: /guides/agent-events-same-websocket-stream.
What do Bridges cover?▾
A Bridge is a row in the console. You create the Slack (or Discord, Telegram, WhatsApp, Teams) app, paste the token, and point their webhook at the Worker. Web chat is just a room. We do not ship a 14-channel helpdesk.
What is MCP and how does FluxyChat use it?▾
Model Context Protocol lets your agents consume external tool servers. FluxyChat acts as an MCP client and auto-converts tools to LLM function-calling format. Point your agent at any MCP-compatible server.
Can I add guardrails or RAG to AI responses?▾
Yes. The LLM middleware pipeline supports wrapGenerate, wrapStream, and transformParams hooks. Plug in guardrails, caching, RAG injection, PII redaction, or logging on the edge before responses reach users.
Does WorkflowAgent survive deploys?▾
Yes. WorkflowAgent persists state to D1 after each step. If the Worker restarts or you deploy a new version, the agent resumes from the last completed step.
I finished Cloudflare's chat tutorial. Now what?▾
That tutorial is the right start. FluxyChat adds JWT, D1 history, reconnect in the SDK, and a console. See /guides/after-cloudflare-chat-tutorial.
Why not stay on Pusher?▾
You might not need to. Edge pricing you can read, self-host on your account, no socket VPS fleet. Compare at /compare.
Where should I start?▾
Run the quickstart for a JWT and first room, or read /guides if you are still picking between DIY Workers chat and a packaged layer.
Does a public dashboard mean anyone can spend my quota?▾
No. Billable calls need your JWTs and API keys. Turn on DASHBOARD_ACCESS_MODE=ack (and optional CONSOLE_GATE_SECRET) so console routes need a one-time ack first.
What does it actually cost on Cloudflare?
Estimate only. Cloudflare's chat Durable Object sample was dominated by duration, not request count. We have not published idle-socket duration from a real invoice. See Status and limits.
FluxyChat runs entirely on your Cloudflare account. You pay Cloudflare directly no per-seat or per-message markup from us on the self-host path.
| Plan | Monthly messages | D1 reads / day | Cost (USD) | Best for |
|---|---|---|---|---|
| Workers Free | ~3M / mo (100k req/day × 30) | 5M / day | $0 | Hobby · early beta · <1k MAU |
| Workers Paid ($5/mo) | ~300M+ / mo | 25M+ / day | $5 + usage | Growing SaaS · 1k–100k MAU |
| Self-host on your CF account | Unlimited* | Your plan limits | Your plan cost | Enterprise · cost-sensitive · compliance |
* Request and D1 rows are not Durable Object duration. Cloudflare's official chat sample billed almost entirely on duration. FluxyChat has not published idle-socket duration from an invoice. Treat this table as a request-side estimate. See Cloudflare's current pricing for live numbers. Run pnpm run check:pricing to verify your env assumptions match the published rates.
Same SDK on hosted or on your Cloudflare account.
Free has no card. Public rooms take a pk_. Private rooms take a member JWT minted with fc_ on the server. Hosted is beta. Self-host if procurement asks who owns D1.