ReIN Bot
Guess the anime from its opening — multiplayer party game with server-side fuzzy answer matching, curated 20s clips, and an all-free-tier stack.
- Services
- Product DesignEngineering
- Industries
- Realtime
- Tools
- PostgreSQLSupabaseFFmpegGitHub Actions
- Highlight
- A free tier can host realtime multiplayer.
- Live
- sayandeep1013.github.io
Realtime multiplayer, on nothing
Eight people, twenty-second clips, and a race to type the right answer first. The interesting constraint was not the game — it was the bill. The whole thing had to fit inside free tiers, which rules out a game server, a queue, a worker pool, and most of the shapes this problem usually takes.
What it leaves is a database that can broadcast, and the discovery that this is enough.
The grader is the game, and it runs in Postgres
Anime titles are a naming disaster: romanisations differ, seasons are written four ways, and half the audience knows a show by an abbreviation. A strict comparison makes the game unplayable and a loose one makes it cheatable.
So grading runs server-side in PL/pgSQL, in tiers — exact, near (bounded Levenshtein), season-lenient, prefix — with normalisation for case, punctuation, long vowels and variant phrasing like season 2 against 2nd season. It is in the database because that is the only place a client cannot see it.
The clip is named by a random UUID, so nobody can read the answer out of a network request.
- Realtime
- Supabase Realtime broadcastRound start and revealNo polling
- Grading
- PL/pgSQL RPCsFour match tiersServer-side, always
- Content
- GitHub Actions + ffmpeg480p VP9 + OpusMetadata stripped
- Client
- Static HTMLVanilla JavaScriptNo framework, no build
What it cost
Curation moved to CI, and that is what made it free. Compressing clips on demand needs a worker; compressing them once in a GitHub Action needs nothing. The clips are pre-cut, re-encoded to 480p VP9 with Opus audio, stripped of metadata, and stored under a UUID — so the runtime does no media work at all.
The client is deliberately dumb: static HTML and vanilla JavaScript, no framework and no build step, served from GitHub Pages. Not for purity — because a build pipeline is another thing to host, and the game did not need one.
Where it does not work yet
The deploy is live and two dashboard steps stand between it and a playable game: anonymous sign-in has to be enabled on Supabase, and the publishable key added to app/config.js. Until then it loads and does not start, which is exactly what the live link will show you.
There are also no persistent profiles and no lifetime stats, on purpose. It is a party game for a room of people who are already together, and a leaderboard would make it a different one.