§ 01 Open-source game backend on the BEAM
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.
02 / Runtime
The same virtual machine that powers WhatsApp, Discord, and RabbitMQ. Designed for millions of concurrent connections with predictable latency.
■ 58 processes up · ■ 2 supervised restart · zero impact to neighbours
Each match runs in its own process with isolated garbage collection. No stop-the-world pauses affecting other players.
The BEAM scheduler ensures fair CPU time for every match. One expensive operation cannot starve others.
If a match process crashes, it restarts automatically. Players reconnect to a fresh state. The server is unaffected.
Graceful shutdown, health endpoints, and rolling deploys out of the box. Built for Kubernetes, Fly.io, and any container orchestrator.
Lightweight processes and efficient I/O multiplexing. Handle half a million concurrent WebSocket connections per node.
OpenTelemetry integration, structured logging, and Telemetry events. Monitor every match, queue, and connection.
03 / Kit
A complete backend for multiplayer games. One release, no external dependencies.
Player registration, login, sessions, and OAuth. Built on nova_auth.
Automatic player pairing with configurable rules. Lobby and queue support.
WebSocket-based state synchronization at configurable tick rates.
Ranked scoring with ETS-backed storage. Per-game, per-season, global.
Wallets, transactions, inventory, and in-game store.
Friends, groups, chat, and notifications.
Persistent player data storage with versioning.
Web-based management UI for players, matches, and economy.
04 / Clients
Official client libraries with full API coverage. Pick your engine and start building.
Unity 2021.3+. Install via UPM git URL.
View guideGodot 4.x addon. Enable in Project Settings.
View guideAdd as dependency in game.project.
View guideWorks with Flutter, Flame, and standalone Dart.
View guideAll SDKs cover auth, matchmaking, real-time, leaderboards, economy, social, storage, and more.
05 / Contract
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}.06 / Position
Honest accounting against the engines you’d otherwise pick.
| Asobi | Nakama | Colyseus | |
|---|---|---|---|
| Runtime | BEAM (Erlang/OTP) | Go | Node.js |
| Garbage Collection | Per-process, isolated | Stop-the-world | Stop-the-world |
| Fault Tolerance | OTP supervision trees | Manual recovery | Manual recovery |
| Cloud/K8s | Graceful shutdown, health checks | Basic support | Manual setup |
| Pub/Sub | Built-in (pg module) | Requires Redis | Built-in |
| Connections/Node | 100K+ | ~50K | ~10K |
| Observability | OpenTelemetry + Telemetry | Prometheus | Custom metrics |
| License | Apache 2.0 | Apache 2.0 | MIT |
07 / Start
Four commands between you and a running multiplayer game.
rebar3 nova new my_game fullstack
{asobi, "~> 0.1"}
Define a module with the asobi_match behaviour
rebar3 nova serve
08 / People
Ask questions, share what you're building, and help shape Asobi.
Join us on Discord