Preview

Open Source Game Backend

Your game never goes down.

Asobi is a multiplayer game backend built on Erlang/OTP. Fault-tolerant by design. Zero-downtime deploys. 100K+ concurrent connections per node.

Asobi is early but fully open-source and ready to play with. Spin it up, prototype your next game, and help shape the future of game backends on the BEAM.

Built on the BEAM

The same virtual machine that powers WhatsApp, Discord, and RabbitMQ. Designed for millions of concurrent connections with predictable latency.

Per-Process GC

Each match runs in its own process with isolated garbage collection. No stop-the-world pauses affecting other players.

Preemptive Scheduling

The BEAM scheduler ensures fair CPU time for every match. One expensive operation cannot starve others.

🛡

OTP Supervision

If a match process crashes, it restarts automatically. Players reconnect to a fresh state. The server is unaffected.

Cloud Native

Graceful shutdown, health endpoints, and rolling deploys out of the box. Built for Kubernetes, Fly.io, and any container orchestrator.

📈

100K+ Connections

Lightweight processes and efficient I/O multiplexing. Handle half a million concurrent WebSocket connections per node.

📊

Built-in Observability

OpenTelemetry integration, structured logging, and Telemetry events. Monitor every match, queue, and connection.

Everything you need

A complete backend for multiplayer games. One release, no external dependencies.

Authentication

Player registration, login, sessions, and OAuth. Built on nova_auth.

Matchmaking

Automatic player pairing with configurable rules. Lobby and queue support.

Real-Time Sync

WebSocket-based state synchronization at configurable tick rates.

Leaderboards

Ranked scoring with ETS-backed storage. Per-game, per-season, global.

Virtual Economy

Wallets, transactions, inventory, and in-game store.

Social

Friends, groups, chat, and notifications.

Cloud Saves

Persistent player data storage with versioning.

Admin Dashboard

Web-based management UI for players, matches, and economy.

SDKs for every engine

Official client libraries with full API coverage. Pick your engine and start building.

All SDKs cover auth, matchmaking, real-time, leaderboards, economy, social, storage, and more.

Define your game logic

Implement the asobi_match behaviour. Asobi handles the rest.

-module(arena_match).
-behaviour(asobi_match).

-export([init/1, handle_join/3, handle_input/3,
         handle_tick/2, handle_leave/3]).

init(Opts) ->
    #{max_players => maps:get(max_players, Opts, 8),
      tick_rate   => 10,
      players     => #{},
      projectiles => []}.

handle_join(PlayerId, _Metadata, State) ->
    Spawn = random_spawn_point(),
    Player = #{pos => Spawn, hp => 100, score => 0},
    {ok, State#{players := maps:put(PlayerId, Player,
                           maps:get(players, State))}}.

handle_input(PlayerId, #{<<"action">> := <<"fire">>} = Input, State) ->
    Projectile = spawn_projectile(PlayerId, Input),
    {ok, State#{projectiles := [Projectile |
                    maps:get(projectiles, State)]}}.

handle_tick(_DeltaMs, State) ->
    S1 = move_projectiles(State),
    S2 = detect_collisions(S1),
    {broadcast, S2}.

How Asobi compares

AsobiNakamaColyseus
RuntimeBEAM (Erlang/OTP)GoNode.js
Garbage CollectionPer-process, isolatedStop-the-worldStop-the-world
Fault ToleranceOTP supervision treesManual recoveryManual recovery
Cloud/K8sGraceful shutdown, health checksBasic supportManual setup
Pub/SubBuilt-in (pg module)Requires RedisBuilt-in
Connections/Node100K+~50K~10K
ObservabilityOpenTelemetry + TelemetryPrometheusCustom metrics
LicenseApache 2.0Apache 2.0MIT

Get started in minutes

1

Create a new project

rebar3 nova new my_game fullstack

2

Add asobi as a dependency

{asobi, {git, "https://github.com/widgrensit/asobi.git", {branch, "main"}}}

3

Implement your match logic

Define a module with the asobi_match behaviour

4

Run it

rebar3 nova serve

Join the community

Ask questions, share what you're building, and help shape Asobi.

Join us on Discord