Real-time SDK, hosting, code editor, AI builder, app store, and payments — everything to go from idea to shipped, in one platform. Prototypes that grow into real software.
No infrastructure to manage. No boilerplate. Just your idea and a script tag — or just your idea and AI.
Rooms, messaging, an authoritative server, presenter role, and public info — all from a single neblla object. Multiplayer in 6 lines of code.
Messages and binary files travel directly between peers via WebRTC — no server hop, no quota consumed, no upload limits. Automatic socket fallback for messages.
Named or auto-generated rooms with presenter election, member tracking, and a 3-minute reconnection grace so users keep their seat across drops and tab reloads.
Every app gets a live URL at neblla.com/id. Hot-served while active, auto-migrated to the edge when idle. Zero config.
.save() persists per device — and follows users across devices once they log in. State survives reloads, reconnections, and switches.
Set your own domain for production apps. Sandbox mode available for localhost development. Full control over access.
Describe what you want and get a working app. Iterative "Edit with AI" to refine your creation. No coding experience needed.
Manage apps, files, and deployments directly from Claude. Full MCP integration — build and ship without leaving the conversation.
Plug your Anthropic API key in for unlimited AI edits using your own account. Free edits included for everyone to get started.
Sell digital products in a single call: neblla.buy(productId). Stripe handles checkout and payouts — you just set the price.
Track purchases, spend with consume(), and validate other players' purchases. Built for in-app currencies, unlocks, and event tickets.
Continuous server-side checks plus P2P cross-verification between peers. Mismatches are reported automatically and corrected client-side.
This is where you start, on purpose. Server-side code runs on one of the connected devices — zero infrastructure, zero deploy, zero cost. Ship a multiplayer app for family and friends in an afternoon, validate the idea, iterate. Built-in safeguards: private user data stays in the user's session, payments are server-mediated, cheaters get banned from the backoffice.
When the concept clicks and you need real infrastructure, flip a config flag. The same code runs on Neblla's Cloudflare Workers. Same files, same events, same API — no migration, no platform swap. Easy entry, no ceiling.
neblla.confirm(event, value) lets every client report what they saw locally; the server peer compares for unanimity. Mismatch → neblla.flag() auto-fires, bumping flagCount on every user in the room (one flag per room). Devs spot cheaters across rooms in the backoffice.
A social role for asymmetric games — the bingo caller, the Jackbox screen. user.isPresenter tells your client.js who shows the host UI; address them with neblla.tellPresenter(data) (they get a 'messageToPresenter' event). The first device in the room is presenter; if they leave, the SDK promotes another. The presenter does not run the server/ files.
The authority — runs server/lobby.js / server/gathering.js / server/room.js. In peer mode it's a device the SDK picks per room (best CPU + lowest median P2P latency); in infra mode it's a Neblla Node process. Address it via neblla.tellServer(data) (it gets 'messageToServer'); broadcasts come back as 'messageFromServer' / 'state'. No neblla.server, no user.isServer — its identity is closure-private so your code survives the peer→infra move.
In peer mode they may coincidentally be the same device, but they're separate roles: presenter is a client, server runs the server/ files. neblla.setState(state) from server/room.js replicates the authoritative state to everyone (and to the pre-agreed successor) so a hand-off is instant. Same code keeps working when you move the server to Neblla's infra entirely.
Publish to the Neblla marketplace. Discover, fork, and remix apps built by the community. Coming to store.neblla.com.
Drop-in Google sign-in for your players via neblla.login(). Profiles and saves carry across devices — no auth code to write.
50K daily data units, hosting, editor, AI builder, P2P — all included. No credit card required. Upgrade only when you're ready.
Whether you code by hand or let AI do the work.
Login with Google or email. Instant access, no credit card required.
Click "+", name it, then pick: generate with AI, start from a blank canvas, or fork a template.
Use the Neblla editor, iterate with AI, or manage everything from Claude via MCP.
Hit publish. Your app is live with a URL, hosted and scaled automatically.
Pay only for real-time data. Hosting and tools included.
A data unit = one character sent or received between your device and Neblla.
P2P messages are always free. Prices are per app.
Join developers shipping multiplayer experiences with less code and more fun.
A Neblla app's canonical layout is six files: index.html, main.css, client.js on the front-end, plus three files in a server/ folder split by lifecycle phase — server/lobby.js (matchmaking), server/gathering.js (waiting window before a game starts), and server/room.js (authoritative game logic). Only index.html is strictly required; the rest exist as your app needs them. Client and server communicate through events only — never direct calls (tellServer/tellPresenter/sendMessage/setState + on('messageToServer'|'messageFromServer'|'messageToPresenter'|'message'|'state')). In client.js, set window.onNeblla to a callback and it fires once the SDK is ready. The server/ files are loaded by the SDK and run in an isolated scope (no DOM, no neblla.me) on the room's server peer — never the presenter. Pick the server mode in the Config tab: plain JS on a peer (default, inspectable), AssemblyScript→WASM on a peer (opaque to DevTools), or JS on Neblla's infra (coming soon). Click any item for full details.
Registers a listener. Use '*' for all events.
Removes a listener. Empty string clears all.
Broadcasts to everyone in the room. From a client → 'message' (also to you, fromMe); from the server → 'messageFromServer'.
Private message to the room's presenter (UI host). They get 'messageToPresenter'.
Private message to the server (server/*.js). It gets 'messageToServer'.
(server) Publish the authoritative state — everyone gets 'state' and neblla.state.
P2P-only binary file transfer. Send to one peer or every peer in the room.
Updates your profile and broadcasts the change. Persists across rooms.
Joins a named room. Fires 'joinRoom' on success.
Leaves the current room.
(legacy) Books + joins a fresh room in one step. New code uses bookRoom → joinRoom → startRoom.
Reserves a unique room name (with an optional config) without joining. Returns a Promise.
Presenter (or server/gathering.js): flip a gathering room into 'running' and boot server/room.js.
Persists data locally — and across devices once logged in.
Sign in with Neblla SSO. Pass { scopes } to ask for email, friends or visibility.
Signs the user out and clears the persisted login token.
Force-refresh neblla.friends from the server.
Force-refresh neblla.friendRequests.
Send a friend request to a player currently in this app.
Accept a pending friend request.
Reject a pending friend request.
Drop an existing friendship. Works whether the friend is online or not.
Invite a friend currently in this app to your current room.
Opens a Stripe Checkout popup for the given product.
Spends a consumable purchase. Returns the new state.
Verifies a peer's purchase against the server.
Returns the public list of products configured for this app.
neblla.usersEveryone in the current room.
neblla.roomCurrent room object.
neblla.meYour own user object (isPresenter, grantedScopes, …).
neblla.presenterThe current presenter (UI host) user, or null.
neblla.stateLatest authoritative state pushed by the server via setState().
neblla.gathering(in the lobby) Rooms currently in their gathering window.
neblla.purchasesYour purchases keyed by productId.
neblla.friendsYour Neblla friends visible in this app, with online status.
neblla.friendRequestsPending friend requests you've received.
A peer broadcast (sendMessage from a client). { data, user, fromMe, time, p2p }.
The server broadcast something (its sendMessage). The authoritative voice. { data, time }.
(server) A client called tellServer. Goes to lobby/gathering/room.js by phase. { data, user, time }.
A client called tellPresenter. Only the presenter device gets it. { data, user, time }.
The server published a new state via setState. Payload IS the state; neblla.state updated.
You successfully joined a room.
You left a room.
A user joined (also for existing users on your join).
A user left.
A user's public info changed.
The presenter (UI host) role changed.
A gathering room flipped to 'running'; server/room.js boots. { room, isMe }.
The room's server peer was (re)assigned (first pick / hand-off / mid-game). { room, isMe }.
(in the lobby) The list of rooms in formation changed. { rooms }.
Socket reconnected and the room has been re-synced.
Server refused to re-issue a session — reload required.
Sign-in completed (also auto-login on reconnect). Includes grantedScopes.
Sign-out completed.
Your friends list or any friend's online status changed.
Someone in this app sent you a friend request.
A request you sent was accepted.
A request was rejected, or a friendship was removed.
A friend invited you to their current room.
A room user bought, or anti-cheat corrected your state.
A peer is about to send you a file.
Bytes received or sent during a file transfer.
A file transfer completed — file is a Blob.
Download any example and start building on top of it.
Real-time chat with user names and history.
Live events board with real-time updates.
Social deduction game with roles and voting.
Two-player chess with validation and sync.
Collaborative whiteboard — everyone draws together.
Developer info: email address and name to identify you as a user.
Subscription info: your Stripe customer ID and subscription ID.
We do not store passwords, bank details, or payment info. Stripe handles that.
We use Stripe for payments and Google for authentication. These services may store cookies for their own purposes.
We do not sell, share, or disclose your information. Contact [email protected].