Open Source Game Backend
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.
The same virtual machine that powers WhatsApp, Discord, and RabbitMQ. Designed for millions of concurrent connections with predictable latency.
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.
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.
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.
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}.| 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 |
rebar3 nova new my_game fullstack
{asobi, {git, "https://github.com/widgrensit/asobi.git", {branch, "main"}}}
Define a module with the asobi_match behaviour
rebar3 nova serve
Ask questions, share what you're building, and help shape Asobi.
Join us on Discord