đŸ•šī¸

Ibis

GoReactWebAssemblyPostgreSQL

Ibis is my self-hosted retro game library and in-browser emulator — a place to keep ROMs I own, catalogued and playable from any device on my network without installing an emulator locally.

It stores the binaries, tracks metadata and save-state instances per game, and streams the ROM straight into a <canvas> running a JavaScript NES emulator. It also plugs into the rest of the homelab: a Kafka listener lets Goblin Shark, my build pipeline, publish freshly built game artifacts and have Ibis register them with no manual upload. Storage and save states go through a small Go API over ConnectRPC, backed by PostgreSQL for metadata and a pluggable blob store for the binaries.

Ibis is my self-hosted retro game library and in-browser emulator — a place to keep ROMs I actually own, cataloged and playable from any device on my network without installing an emulator locally. I wanted a single service that stores the binaries, tracks metadata and save-state instances per game, and streams the ROM straight into a <canvas> running a JavaScript NES emulator.

It also plugs into the rest of my homelab: a Kafka listener lets Goblin Shark, a build pipeline I run separately, publish newly built game artifacts and have Ibis register them automatically — no manual upload step required. Everything else, from ROM storage to save states, goes through a small Go API over ConnectRPC, backed by PostgreSQL for metadata and a pluggable blob store (local disk or S3-compatible) for the binaries themselves.

Documentation