Product6 min read
The ten seconds before the board: making a game review feel like something
Tap a game in the app and, until recently, you landed straight on a board, an evaluation timeline that was still filling in, and a coach analysis that would arrive about ninety seconds later. That is a very analytical way to meet a game you just lived through. You lost on time while a piece up, or you won in nineteen moves, or you drew something that should have been a win, and the first thing the screen did was show you a graph.
Chess is played for how it feels, and the coaches in the app already have different voices. The way into a review should have one too. So I built a single screen that plays while the first engine pass runs.
What the screen is
One screen, shown while the first sweep of your game runs, which takes five to ten seconds on a modern phone. It shows who played, the result in big type (green for a win, red for a loss), how it ended, the rating change, the opening, a GIF that matches the mood, and one line from your coach.
The line from your coach depends on what happened. A few from the app, for the two coaches that exist today:
- Mated, EloCoach: “Mated. Go on, have a groan. Then let’s find the move that let it in.”
- Mated, Apollo: “Checkmate is never sudden. It is announced several moves early.”
- A very short loss, EloCoach: “{n} moves and done. That’s not a game, that’s a mugging. Let’s see who did it.”
- A quick win, EloCoach: “{n} moves. {opp} barely got their coat off.”
- A draw while ahead, Apollo: “An advantage is not a result until it is converted.”
There are thirteen moods, such as “lost on time while ahead”, “won a comeback” or “short loss”, and each coach has a couple of lines for each. The game picks the mood from facts that need no engine and no language model: the result, how it ended, how long it was, and whether you were ahead in material.
Things I decided, and why
- One screen, not a story of cards. I prototyped a multi-card recap. Without the engine there was too little about this particular game to fill it, so it padded itself out with player-level stats that read the same on every review. Those went.
- Nothing from the engine on the screen. Anything that waits on the sweep saves no time, because the board is already usable when the sweep lands. I also left out hand-made position evaluations like hanging-piece or pin detectors. Without a search they are confidently wrong in exactly the positions that matter.
- GIPHY instead of an animation I draw myself. I compared both on real games. GIPHY has the emotional punch.
- A live search each time, not a hand-picked list. A fixed list would give me tone control. A search gives me variety, and a lot of the fun is not knowing what you will get. That was a deliberate trade, and some days it will be a poor choice.
How it works under the hood
The app asks GIPHY for a handful of results for a search such as “victory dance” for a win or “facepalm” for a loss, restricted to a PG rating. Each mood has a few possible searches, and the game ID decides which one, so the same game gets the same mood every time you open it. It plays GIPHY’s video version of the GIF, which means no GIF decoder and no new library, and it picks the small rendition first so it loads quickly. The GIF is shown at its own aspect ratio and never cropped. If GIPHY is slow (the limit is two and a half seconds) or fails, the slot stays a plain surface and nothing else notices.
It uses GIPHY’s web API, not their SDK. The SDK has no search that returns media you can play yourself; results only come out of its own picker.
It never adds waiting
The screen covers the board while the board loads and the engine warms up, so it costs nothing. My first version closed itself when the sweep finished. On short games that was before anyone could read it, so now nothing dismisses it. The only exit is a button at the bottom: “Skip to the board” while the sweep runs, and “See your game” once it is done. After the first tests I also made it play when you reopen an old review, though never when you merely open the app, so it does not replay a result you have already seen.
The kind of GIF you get
These come from the same kinds of searches the app makes. In the app it picks live, so you get variety. Here I fixed one for each, so everyone sees the same eight.
After a win
After a win
After a win
After a loss
After a loss
After a loss
After a draw
After a draw