Gamemood has had a host since last week and a schema since the day after. It had nowhere to say how you feel. You could open it, read three sections admitting they were empty, and close it again.
Now you can use it. Say how you are on two scales, say what you are playing, play it, say how you are now — and it tells you what moved.
Two scales, then a game
Mood and energy, one to five each, both ends named in words. No emoji: this design system does not have any, and a five-face scale is a worse instrument anyway, because everyone reads the middle face differently.
Underneath, the app says back what it thinks you told it — "reads as: agitated" — before you commit to anything. Low mood and high energy is agitated; high mood and low energy is calm. If the app has misread you, you find out at the point where it is still one tap to fix, not on a result card twenty minutes later.
That mapping is generated in the database, on a column the client cannot set, and restated in about ten lines of TypeScript so the check-in screens can name a state before any row exists. Two copies of one rule is a bug waiting to happen, so a test states all twenty-five combinations out loud. Including the one nobody guesses: three counts as high on both axes.
Nothing is written until you have finished
The check-in carries your answers in the URL and writes exactly one row, at the end, when you either add context or skip it.
That last bit matters more than it looks. Skipping the context step runs the same code path as filling it in — same action, same row, same validity. A "skip" that quietly produces a lesser record is a dark pattern with good manners, and the whole point of that screen is that it is the tap you are allowed to skip.
It also means an abandoned check-in leaves nothing behind. If you wander off at the game picker, there is no half-session sitting in your history, and no banner telling you that you are playing something you never started.
The banner, and only one of them
Once a session is running, every screen carries it: what you are playing, how long it has been, and check-out one tap away. Wander into Settings mid-session and it is still there.
There is no "current session" field anywhere. An open session is simply one with no completion time — asking the question is cheaper than maintaining an answer, and a stored pointer is a thing that can disagree with reality. Start a second check-in and the app takes you to close the first one instead. Say you switched games and it closes this session and opens a new one, rather than letting one row claim to have measured two different games.
The reading
Check-out asks the same two scales, showing what each one was when you started, plus whether it was worth it and who you played with. One screen, four questions.
Then the result card — the only screen in the app that goes full ink. It leads with the movement: you went from agitated to calm. The numbers are underneath supporting that sentence, not standing in for it. And when nothing moved, it says so plainly. "You started calm and you finished calm" is a finding. A product that reports that as an absence of a result is teaching you to distrust it.
The card also states that you have twenty-four hours to edit, and offers a switch to keep the session out of the community numbers entirely. Both of those are enforced in the database rather than in the interface: the edit window is a row-level security predicate, and a trigger owns the completion timestamp, so the deadline cannot be reset by the thing it is checking. A promise the client enforces is a promise the client can withdraw.
What it deliberately does not say
The design set has the card comparing your session against the game's own history — "83% of 12 sessions moved the same way". It does not say that yet.
Session rows are private, so that percentage can only come from an aggregate function, and none of the existing ones return it. What they do return is average movement, and an average cannot be turned into a rate. I could have shown something — the mean, dressed up, with a sample size next to it to make it look rigorous. That is precisely the unearned percentage this whole design exists to avoid. So the comparison waits for the game page, which is where that aggregate belongs.
Your own history is on the You tab, newest first. Sessions past their edit window are greyed and marked frozen rather than hidden, and still deletable. Hiding them would make the page disagree with the numbers those sessions are still feeding.
Next: the recommendations. Five intents, five honest rungs, and a launch day with almost no data to stand on.