A Turn-Based Question Game for Couples
Guess Us is a small two-player game designed for couples.
One player creates a private room and shares it with the other person. During each round, one player writes a personal multiple-choice question and selects the correct answer. The other player tries to guess it, and then their roles switch.
Each correct guess earns a point, and the final screen shows who knows the other person better.
The game works best when the questions are genuinely personal—shared memories, habits, preferences, inside jokes, and small details whose answers cannot simply be found through Google or generated by AI.
Why I Built It
I wanted to create a very small game that couples could start quickly without profiles, complicated rules, or a long setup process.
Sometimes I play it with my girlfriend, and the most interesting rounds are usually built around questions that only the two people in the relationship could answer.
The project is intentionally simple, but it creates an easy reason to talk, remember shared moments, and discover small things about each other.
Connected to Emocia
Guess Us is offered as a playful feature connected to Emocia, although it is developed and deployed as a separate project.
Because the game is a compact interactive experience rather than a content-heavy website, I built the frontend entirely with React and Vite instead of using Next.js.
This keeps the application lightweight while allowing the game state and interface to update immediately as the players move between questions, guesses, and results.
Game Flow
- One player creates a private room
- The second player joins the room
- Players alternate between writing a question and guessing the answer
- Each correct guess adds one point
- The final result shows the winner
Rooms are limited to exactly two players, and the game uses realtime updates so both participants see the current state without manually refreshing the page.
Technical Build
The frontend is a React 19 single-page application written in TypeScript and built with Vite. React Router handles navigation between the room, game, and result screens, while Tailwind CSS is used for the interface.
Supabase provides anonymous authentication, the PostgreSQL database, and realtime synchronization between the two players. Row Level Security policies restrict access to room data and ensure that only the participants can interact with a game.
Cloudflare Turnstile protects anonymous account and room creation from automated abuse. Additional database rules limit active rooms, apply creation rate limits, and automatically expire old games.
Deployment
GitHub Actions runs linting and the production build, creates a Docker image, and publishes it to GitHub Container Registry.
Coolify pulls and deploys the pre-built image, while Nginx serves the React application and supports direct navigation to individual game rooms.
My Role
I designed and developed the complete game, including the interface, turn-based game flow, room system, database structure, realtime synchronization, authentication, security rules, abuse protection, and production deployment.
Tech Stack
- React 19
- TypeScript
- Vite
- React Router
- Tailwind CSS
- Supabase Auth
- PostgreSQL
- Supabase Realtime
- Row Level Security
- Cloudflare Turnstile
- GitHub Actions
- Docker
- GitHub Container Registry
- Nginx
- Coolify