There is a design set for Gamemood — thirteen screens asking what a game does to the person playing it. Check in before you play, check out after. None of it existed anywhere except as a design document, and a design document is not a website.
So this change built the least interesting part first: the host.
gamemood.actuallyfrank.io now answers over TLS with its own HTML. Open it and
you get a paper background, a bottom bar with three sections, and three screens
that tell you honestly that they are empty.
Why the empty version shipped first
The blog taught me this one. apps/blog was built, tested, merged to main
and served nothing for weeks — green tests, a merged pull request, and no
Vercel project or DNS behind any of it. Merging is not shipping, and the gap
between the two is invisible until someone tries the URL.
An app is done when its domain answers. So the domain answered first, and the screens can land in a frame that already exists.
What is actually there
Three sections — Discover, You, Settings — as real routes rather than tabs in a
widget. That distinction matters more than it sounds: /settings is a URL you
can share, bookmark and land on directly, which a client-side tab strip cannot
give you. The bottom bar is three links, and the current one says so to a
screen reader rather than only to your eyes.
Signed out is the normal state. The app reads the session that every host on
this domain shares and links to account.actuallyfrank.io when you want to
sign in — it holds no login form, no callback route, no sign-out action. That
rule has survived four apps now, and this is the first one where I was tempted,
because a personal log feels like it should own its own door. It should not.
It also installs. There is a manifest and an icon, so you can put it on a home screen and it launches without browser chrome. There is deliberately no offline mode: with no network it fails like any online app rather than showing you yesterday's data pretending to be today's. For an app whose entire premise is recording how you felt at a particular moment, stale-but-confident is the worst possible failure.
The part that isn't code
Setting up a fourth Vercel project is nine steps, and the two that bite are the ones that look done when they are not — connecting the repository after the push you expect it to build, and adding DNS without adding the domain to the project. The second one is spectacular: the TLS handshake dies in a way that reads as a broken server, when really the edge just does not know which app that hostname belongs to.
Both are written down now. The next app gets a runbook instead of an afternoon.
Nothing in Gamemood knows what a game is yet. That is the next change.