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.
Accounts
READYPlay first, sign up later.
Players start as guests and keep everything when they make an account.
Shop
WAITINGSell items without becoming a payments company.
Coins, items and a web store, with payouts straight to your account. Coming after launch.
How it works
Add Lobby with one prompt or one command.
Paste one prompt into whatever you build with. Lobby's docs and tools are written for agents first.
Your whole backend lives in one TypeScript file: what gets saved, how rooms work, what's for sale.
Deploy. Rooms spin up when players arrive and shut down when they leave.
Use Lobby with AI promptPhaserThree.jsGodotUnity
Same backend, whatever you build with.
Read the docsAdd Lobby to my game. Make it multiplayer with 4-player rooms, save each player's progress, and let players start as guests.import Phaser from 'phaser';
import { Lobby } from '@lobby/client';
const lobby = new Lobby({ project: 'my-game' });
export class PlayScene extends Phaser.Scene {
async create() {
this.player = this.physics.add.sprite(400, 300, 'hero');
this.others = new Map();
await lobby.connect(); // starts as a guest, upgrade later
this.room = await lobby.rooms.join('arena', { maxPlayers: 4 });
this.room.on('player:update', ({ id, x, y }) => {
this.others.get(id)?.setPosition(x, y);
});
}
update() {
// Synced at the room's tick rate, not every frame
this.room.me.set({ x: this.player.x, y: this.player.y });
}
async levelComplete(level) {
await lobby.saves.set('progress', { level, coins: this.coins });
}
}import * as THREE from 'three';
import { Lobby } from '@lobby/client';
const lobby = new Lobby({ project: 'my-game' });
await lobby.connect(); // starts as a guest, upgrade later
const room = await lobby.rooms.join('arena', { maxPlayers: 4 });
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(70, innerWidth / innerHeight);
const renderer = new THREE.WebGLRenderer();
const player = new THREE.Mesh(new THREE.BoxGeometry(), new THREE.MeshNormalMaterial());
const others = new Map();
scene.add(player);
room.on('player:update', ({ id, x, y, z }) => {
others.get(id)?.position.set(x, y, z);
});
renderer.setAnimationLoop(() => {
const { x, y, z } = player.position;
room.me.set({ x, y, z }); // synced at the room's tick rate
renderer.render(scene, camera);
});
export const saveProgress = (level) => lobby.saves.set('progress', { level });Built for breakout
Room's full? Pip opens another.
When a clip blows up and ten thousand people show up at once, Lobby adds rooms instead of crashing. Spend caps and a live cost meter are on from day one, so your big weekend doesn't come with a big bill.
One way to do each thing
Fewer choices. Fewer bugs.
Lobby picks the defaults so you and your AI don't have to. One way to store data, one way to run rooms, one way to sell. That's why agents get it right the first time.
You own it
Leave whenever you want. (We'd rather you didn't.)
Lobby is open source. Your players, data and revenue stay yours, and you can export all of it at any time.
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.