Now with AI-powered app builder & hosting

BuildReleaseHostDeploy multiplayermultiplatformmultiplayermultiplatform
appsgameswebsapps in minutesusing AIin minutesusing AI

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.

One platform.
Everything you need.

No infrastructure to manage. No boilerplate. Just your idea and a script tag — or just your idea and AI.

Realtime

Real-Time SDK

Rooms, messaging, an authoritative server, presenter role, and public info — all from a single neblla object. Multiplayer in 6 lines of code.

P2P & File Transfer

Messages and binary files travel directly between peers via WebRTC — no server hop, no quota consumed, no upload limits. Automatic socket fallback for messages.

Rooms & Presenter

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.

🌐

Host

Instant Hosting

Every app gets a live URL at neblla.com/id. Hot-served while active, auto-migrated to the edge when idle. Zero config.

Cross-Device Storage

.save() persists per device — and follows users across devices once they log in. State survives reloads, reconnections, and switches.

Custom Domains

Set your own domain for production apps. Sandbox mode available for localhost development. Full control over access.

🤖

AI for Builders

AI App Builder

Describe what you want and get a working app. Iterative "Edit with AI" to refine your creation. No coding experience needed.

Claude MCP Connector

Manage apps, files, and deployments directly from Claude. Full MCP integration — build and ship without leaving the conversation.

Bring Your Own Key

Plug your Anthropic API key in for unlimited AI edits using your own account. Free edits included for everyone to get started.

💳

Payments

Stripe Checkout

Sell digital products in a single call: neblla.buy(productId). Stripe handles checkout and payouts — you just set the price.

Consumables & Entitlements

Track purchases, spend with consume(), and validate other players' purchases. Built for in-app currencies, unlocks, and event tickets.

Anti-Cheat Verification

Continuous server-side checks plus P2P cross-verification between peers. Mismatches are reported automatically and corrected client-side.

🛡️

Trust & Anti-Cheat

Free: Prototype with friends

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.

Pro: Scale without rewriting

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.

Anti-cheat features (both tiers)

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.

👑

Presenter vs Server

Presenter = UI host

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.

Server = runs server/*.js

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.

Two roles, one model

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.

☁️

Neblla

App Store

Publish to the Neblla marketplace. Discover, fork, and remix apps built by the community. Coming to store.neblla.com.

User Login

Drop-in Google sign-in for your players via neblla.login(). Profiles and saves carry across devices — no auth code to write.

Free to Start

50K daily data units, hosting, editor, AI builder, P2P — all included. No credit card required. Upgrade only when you're ready.

From zero to live in 4 steps

Whether you code by hand or let AI do the work.

01

Sign up

Login with Google or email. Instant access, no credit card required.

02

Create an app

Click "+", name it, then pick: generate with AI, start from a blank canvas, or fork a template.

03

Build

Use the Neblla editor, iterate with AI, or manage everything from Claude via MCP.

04

Ship

Hit publish. Your app is live with a URL, hosted and scaled automatically.

Free to start. Scale when ready.

Pay only for real-time data. Hosting and tools included.

Pro
$10/mo
When the concept clicks. 20× the quota, server-side code on Cloudflare Workers, same simplicity.
  • 1M data units/day
  • Everything in Free
  • Priority support
  • Custom domains (soon)
On-Demand
$10
10M extra data units for spikes, events, or safety net. Lasts a year.
  • 10M data units (one-time)
  • Used after daily quota
  • Valid for 12 months
  • Stack with Free or Pro

A data unit = one character sent or received between your device and Neblla.
P2P messages are always free. Prices are per app.

Ready to build?

Join developers shipping multiplayer experiences with less code and more fun.

API Reference

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.

Methods

on(event, callback)

Registers a listener. Use '*' for all events.

off(event, callback)

Removes a listener. Empty string clears all.

sendMessage(data)

Broadcasts to everyone in the room. From a client → 'message' (also to you, fromMe); from the server → 'messageFromServer'.

tellPresenter(data)

Private message to the room's presenter (UI host). They get 'messageToPresenter'.

tellServer(data)

Private message to the server (server/*.js). It gets 'messageToServer'.

setState(state)

(server) Publish the authoritative state — everyone gets 'state' and neblla.state.

sendFile(file, options?)

P2P-only binary file transfer. Send to one peer or every peer in the room.

setPublicInfo(info)

Updates your profile and broadcasts the change. Persists across rooms.

joinRoom(room)

Joins a named room. Fires 'joinRoom' on success.

leaveRoom()

Leaves the current room.

createRoom()

(legacy) Books + joins a fresh room in one step. New code uses bookRoom → joinRoom → startRoom.

bookRoom({ config? })

Reserves a unique room name (with an optional config) without joining. Returns a Promise.

startRoom(name?)

Presenter (or server/gathering.js): flip a gathering room into 'running' and boot server/room.js.

save(json)

Persists data locally — and across devices once logged in.

login(opts?)

Sign in with Neblla SSO. Pass { scopes } to ask for email, friends or visibility.

logout()

Signs the user out and clears the persisted login token.

getFriends()

Force-refresh neblla.friends from the server.

getFriendRequests()

Force-refresh neblla.friendRequests.

requestFriend(target)

Send a friend request to a player currently in this app.

acceptFriend(requestId)

Accept a pending friend request.

rejectFriend(requestId)

Reject a pending friend request.

removeFriend(friendId)

Drop an existing friendship. Works whether the friend is online or not.

inviteToRoom(target)

Invite a friend currently in this app to your current room.

buy(productId, amount?)

Opens a Stripe Checkout popup for the given product.

consume(productId, amount?)

Spends a consumable purchase. Returns the new state.

validatePurchase(userId, productId)

Verifies a peer's purchase against the server.

getProducts()

Returns the public list of products configured for this app.

Properties
neblla.users

Everyone in the current room.

neblla.room

Current room object.

neblla.me

Your own user object (isPresenter, grantedScopes, …).

neblla.presenter

The current presenter (UI host) user, or null.

neblla.state

Latest authoritative state pushed by the server via setState().

neblla.gathering

(in the lobby) Rooms currently in their gathering window.

neblla.purchases

Your purchases keyed by productId.

neblla.friends

Your Neblla friends visible in this app, with online status.

neblla.friendRequests

Pending friend requests you've received.

Events

'message'

A peer broadcast (sendMessage from a client). { data, user, fromMe, time, p2p }.

'messageFromServer'

The server broadcast something (its sendMessage). The authoritative voice. { data, time }.

'messageToServer'

(server) A client called tellServer. Goes to lobby/gathering/room.js by phase. { data, user, time }.

'messageToPresenter'

A client called tellPresenter. Only the presenter device gets it. { data, user, time }.

'state'

The server published a new state via setState. Payload IS the state; neblla.state updated.

'joinRoom'

You successfully joined a room.

'leaveRoom'

You left a room.

'memberJoinedRoom'

A user joined (also for existing users on your join).

'memberLeftRoom'

A user left.

'publicInfo'

A user's public info changed.

'newPresenter'

The presenter (UI host) role changed.

'roomStarted'

A gathering room flipped to 'running'; server/room.js boots. { room, isMe }.

'newServerPeer'

The room's server peer was (re)assigned (first pick / hand-off / mid-game). { room, isMe }.

'gathering'

(in the lobby) The list of rooms in formation changed. { rooms }.

'reconnected'

Socket reconnected and the room has been re-synced.

'sessionExpired'

Server refused to re-issue a session — reload required.

'login'

Sign-in completed (also auto-login on reconnect). Includes grantedScopes.

'logout'

Sign-out completed.

'friendsUpdated'

Your friends list or any friend's online status changed.

'friendRequest'

Someone in this app sent you a friend request.

'friendAccepted'

A request you sent was accepted.

'friendRemoved'

A request was rejected, or a friendship was removed.

'roomInvite'

A friend invited you to their current room.

'purchase'

A room user bought, or anti-cheat corrected your state.

'fileStart'

A peer is about to send you a file.

'fileProgress'

Bytes received or sent during a file transfer.

'file'

A file transfer completed — file is a Blob.

See it in action

Download any example and start building on top of it.

💬

Chat

Real-time chat with user names and history.

📡

Events

Live events board with real-time updates.

🐺

Werewolf

Social deduction game with roles and voting.

♟️

Chess

Two-player chess with validation and sync.

🎨

Drawing Board

Collaborative whiteboard — everyone draws together.

Privacy Policy

Information We Collect

Developer info: email address and name to identify you as a user.

Subscription info: your Stripe customer ID and subscription ID.

What We Don't Collect

We do not store passwords, bank details, or payment info. Stripe handles that.

Third-Party Services

We use Stripe for payments and Google for authentication. These services may store cookies for their own purposes.

Data Sharing

We do not sell, share, or disclose your information. Contact [email protected].

Example

Claude
Neblla

Connect Claude to Neblla

Build, deploy, and host apps directly from your Claude conversations using the Neblla connector.

1

Open Claude settings

In the Claude app or claude.ai, go to Settings → Connectors.

2

Add a custom connector

Click "Add custom connector" and paste the Neblla MCP server URL:

https://neblla.com/mcp
3

Sign in with your Neblla account

Log in with the same account you use here and you're connected.

OptionalIn Claude, open the connector's permissions and enable "Always allow" for Neblla actions — this skips the approval prompt on every tool call.

4

Start building

Ask Claude to create an app, upload files, or deploy. It will use the Neblla tools automatically.

Try: "Make me a multiplayer trivia game with 4 categories and a scoreboard."