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

    READY

    Player 2 has entered the game.

    Rooms fill, split when they're crowded and sleep when they're empty. Matchmaking is built in.

  • Saves

    READY

    Every player's progress, on real Postgres.

    Profiles, levels and inventory that survive crashes and updates. Export it whenever you want.

  • Accounts

    READY

    Play first, sign up later.

    Players start as guests and keep everything when they make an account.

  • Shop

    WAITING

    Sell 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.

  1. Paste one prompt into whatever you build with. Lobby's docs and tools are written for agents first.

  2. Your whole backend lives in one TypeScript file: what gets saved, how rooms work, what's for sale.

  3. 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 docs
Choose an engine
Preview API, subject to change
Add 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 });
WAITING

Coming after launch. Want it sooner?

Ready up
WAITING

Coming after launch. Want it sooner?

Ready up

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-labs

Lobby opens soon.

Drop your email and we'll let you know when your spot's ready.