Case study
Family Games
Two games, one shared idea: make it easier to get together and play in person. Impostor and Tutti Frutti bring the group into a game; each player uses their phone while the conversation happens face to face.
Two games published
Two games to share
Impostor
Words, clues, and secret voting to discover who has a different role. Each player receives private information on their phone; clues and conversation are shared in person.
Tutti Frutti
One letter, several categories, and answers to compare as a group. Each player completes the round on their phone, then everyone reviews the answers before seeing the results.
The technical challenge: keeping the game in sync
Real-time updates
Supabase Realtime notifies connected devices of changes to the game, so each player can follow what is happening.
Rules validated in PostgreSQL
In Impostor, protected actions validate identity, permissions, and game state in the backend or database. Roles, votes, and results do not depend on what the browser claims.
Session recovery
After a disconnection, the Impostor client queries persisted, authorized state to rebuild the session. Real-time notifications support that state rather than replace it.
Built and tested through use
I designed the flows, rules, and states for each game and implemented the platform with Next.js, TypeScript, Supabase, and PostgreSQL. Each game keeps its own logic while sharing access to groups and rooms.
Impostor includes unit and database tests, permission and protected-operation validation (RLS/RPCs), and basic synchronization checks.
Designed for small groups gathering in person. Games require an internet connection.

