Open-source game backend · Early access
Build the game.We'll handle the players.
Start your game with real-time multiplayer. Add matchmaking, player saves, accounts and spend caps. Open source, with payments coming soon.
What you get
Multiplayer
READYPlayer 2 has entered the game.
Rooms fill, split when they're crowded and sleep when they're empty. Matchmaking is built in.
Saves
READYEvery player's progress, on real Postgres.
Profiles, levels and inventory that survive crashes and updates. Export it whenever you want.
Player select
READYOne click to play.
No sign-up screen between a player and your game. They start as a guest, claim an account when they're hooked, and their progress follows them to every device.
Shop
WAITINGRun a shop, not a payments company.
Coins, items and a web store, with payouts straight to your account. Coming after launch.
How it works
From prompt to players in three steps.
Add Lobby to my game. Make it multiplayer with 4-player rooms, save each player's progress, and let players start as guests.$ npx lobby initimport { defineGame, data, room, clamp } from '@lobby/server';
export default defineGame({
data: {
progress: data.object({
level: data.int({ default: 1 }),
coins: data.int({ default: 0 }),
}),
},
rooms: {
arena: room({
maxPlayers: 4,
onJoin(ctx) {
ctx.broadcast('joined', { id: ctx.player.id });
},
// Validate movement input: clamp to the map
onMove(ctx, { x, y }) {
return { x: clamp(x, 0, 800), y: clamp(y, 0, 600) };
},
onMessage: {
// Only the server writes saves
levelComplete(ctx, { level }) {
const progress = ctx.player.data.progress;
progress.level = Math.max(progress.level, level + 1);
progress.coins += 10;
},
},
}),
},
});import Phaser from 'phaser';
import { Lobby } from '@lobby/client';
const lobby = new Lobby({ key: 'pk_your_project_key' });
export class PlayScene extends Phaser.Scene {
async create() {
await lobby.connect(); // guest first, account later
this.room = await lobby.rooms.join('arena');
this.progress = await lobby.saves.get('progress'); // read-only
this.room.on('player:update', (p) =>
this.others.get(p.id)?.setPosition(p.x, p.y),
);
}
update() {
this.room.me.move({ x: this.player.x, y: this.player.y });
}
onLevelDone(level) {
// Ask the server; it checks the level and awards coins
this.room.send('levelComplete', { level });
}
}import * as THREE from 'three';
import { Lobby } from '@lobby/client';
const lobby = new Lobby({ key: 'pk_your_project_key' });
await lobby.connect(); // guest first, account later
const room = await lobby.rooms.join('arena');
const progress = await lobby.saves.get('progress'); // read-only
room.on('player:update', (p) =>
others.get(p.id)?.position.set(p.x, p.y, 0),
);
renderer.setAnimationLoop(() => {
room.me.move({ x: player.position.x, y: player.position.y });
renderer.render(scene, camera);
});
function onLevelDone(level) {
// Ask the server; it checks the level and awards coins
room.send('levelComplete', { level });
}$ npx lobby deploy
checking lobby.ts
✓ data progress
✓ rooms arena (4 players)
✓ accounts guest first
deploying to Lobby Cloud
▶ READY · multiplayer · saves · accountsBuilt for breakout
Room's full? Pip opens another.
Lobby grows and shrinks with your players. A quiet Tuesday and a packed launch weekend run the same way: rooms open as players arrive and close when they leave. Spend caps keep the bill where you set it.
Hosting
We run the backend. You ship the game anywhere.
Lobby Cloud
We run the servers. Rooms run close to your players, so movement feels instant, and sleep when nobody's playing. Spend caps and a live cost meter are on by default.
Your cloud, if you need it
For teams with data-residency or compliance requirements, Lobby can run in your own infrastructure. Same lobby.ts, same client.
Talk to usYour game, anywhere
Ship on the web, itch.io, Steam or Discord. Lobby is the backend, not the store.
Build with us
We're building Lobby in public.
Follow along on GitHub, tell us what your game needs, and help shape the defaults.
github.com/lobby-labsLobby opens soon.
Drop your email and we'll let you know when your spot's ready.