back to the projects

Chifoumi

Rock, paper, scissors, for when you're not in the same room

Chifoumi screenshot
Chifoumi
loser does the dishes

Overview

Chifoumi is remote rock-paper-scissors for the small decisions of everyday life, like who does the dishes or who books the restaurant. You create a duel with a stake and a best-of-1, 3 or 5 format, then send the link. Each player picks on their own phone. There's a countdown, both choices appear at once, ties are replayed, and a rematch is one tap away. There are no accounts and no database. Each duel lives in memory and expires after an hour of inactivity.

Why I built this

My friends and I settle every decision, big or small, with a chifoumi. We just had no way to do it when we weren't in the same room. Playing over text doesn't work, because whoever answers second always wins.

Features

  • Duel by link. Create a duel with a written stake, like "loser does the dishes", and a best-of-1, 3 or 5 format, then share the URL. Your opponent joins from their phone with just a name. No account, no app to install, no email.
  • The server holds the choices. A choice never leaves the server until both players have locked theirs in. Until then, the opponent only sees a "has chosen" flag, so there's nothing to peek at. Then both screens reveal at once, and ties replay the round.
  • Survives a refresh. A stable browser token puts you back in your seat after a page refresh or a dropped connection, and your opponent sees over the WebSocket whether you're connected.
  • Rematch in one tap. Same room, same players, same stake. Scores reset and the next duel starts right away, for when best-of-3 didn't settle it.
  • Nothing stored. There's no database. Rooms live in memory and expire after an hour of inactivity. The game engine is a pure module with no I/O, fully covered by node --test.

Tech stack

Frontend

Vanilla JS HTML/CSS Zero framework

Backend

Node 22 Fastify 5 WebSocket node --test

Infrastructure

Docker Compose Caddy GitHub Actions