case study
Yapword
A daily word game where the character remembers how you played.

01 the problem
A funny system prompt can produce a good line once. A consumer character has to remain recognizable across guesses, hints, difficulty modes, wins, losses, fallbacks, model changes, and thousands of repeated interactions — without being allowed to rewrite game truth.
02 the solution
Built a React and TypeScript game in which deterministic code owns the puzzle, score, and limits while Gemini produces bounded character behavior from structured game context. Capacitor ships the public iOS app from the same product core used on the web.
03decisions & tradeoffs
Deterministic game state, generative commentary
A model can make the experience feel alive without being granted authority over the answer, score, or limits.
Mechanism-level voice rules over word bans
Positive behavioral guidance preserved comedic range better than expanding lists of forbidden phrases.
Web plus a public iOS app
The web keeps sharing friction low; Capacitor delivers an App Store surface without maintaining a second product implementation.
04 tech stack
React + TypeScript
Shared product core for the public web game and iOS application.
Google Gemini
Bounded contextual reactions and hints; never the source of score or puzzle truth.
Capacitor
iOS packaging and native integrations including haptics, sharing, and purchases.
Supabase + Vercel
Persistence, server-side model access, analytics hooks, dynamic share assets, and deployment.
05 results
- Live on the web and in the Apple App Store
- Three daily difficulty modes, themed games, contextual hints, and shareable challenges
- Automated regression checks gate releases and character-behavior changes
- Server-owned rules prevent the generative layer from touching game truth