I Shipped This Quietly and Didn't Tell Anyone
Hey. Sorry.
Last blog was March 29. Today is April 18. That's three weeks of silence from me — not because I was off doing something interesting, but because I shipped a small update, caught a bug on my own phone a day later, and decided I didn't want to write a "new feature!!" post for something that was half broken for half of you.
So the change has been live for a while. You might have already seen it. I just never said the words. Before we get to the fix, let's actually talk about the feature it was fixing — because I don't think most of you know what Ghost Race does yet.
Ghost Race: race the version of you from yesterday
I shipped Ghost Race a few weeks back and barely explained it. My fault. Here's the actual pitch.
Every time you finish a Words or Sentences run, TypeVelocity quietly records the entire run as a ghost — your correct-character pace, second by second. Your next run then spawns that ghost next to you on a little horizontal track at the top of the typing area. You see "You" vs "Ghost" in real time. Pull ahead and the status line says +14 chars ahead of your last run. Fall behind and it tells you 8 chars behind your personal best. Tie? Dead even. Yes it's a little bit mean.
Two ghosts get stored per mode and difficulty: your last run and your best run. There's a toggle above the track so you can pick which one you're chasing. Last is good for "am I having an off day?" Best is good for "am I actually getting better?" Very different questions. Very different pressure.
It's per mode+difficulty, too. Your Baby Words ghost is separate from your Hard Sentences ghost. Because comparing a warmup to a real run would be a lie, and the whole point of a ghost is that the comparison is fair.
Nothing about this touches a server. Everything's in localStorage under ghostRuns. You own your ghosts. You can also delete them by clearing site data, which, if you've ever tied your personal best against yourself on Hard, is a legitimately fun reset.
The part I like most: watching yourself fall behind is unreasonably motivating. There's a small marker that slides down the track as the ghost progresses, and when it starts creeping ahead of your "You" fill, you feel it. That nudge alone was worth shipping the whole thing.
Now the fix: the chip that makes Ghost Race actually usable on Android
Here's what was broken. Mobile keyboards eat half the screen. You knew this. The idle drain ring — the little countdown that warns you before you lose a life on Standard and Hard — was sitting right above the typing area. Keyboard opens, ring disappears. You'd only ever see it between runs, which is the one moment it doesn't matter.
Fix was simple once I stopped trying to keep the ring where it was. I added an Idle: 5s chip into the Ghost Race header, right next to the Diff and Gamemode chips. Same info. Same countdown. Different spot. Somewhere the keyboard doesn't swallow.
It counts down in real time. Flips red under two seconds. Hides on Baby and Song because neither of those have idle drain. Standard and Hard get it automatically.
The original ring still shows on desktop. Nothing was ripped out. I just added a second readout where phones actually have room for it.
Why I sat on it
First version left the chip visible after switching into Song mode. Fixed. Second version happily counted down "5s" forever in Baby because I forgot to hide it when difficulty changed mid-session. Fixed. Third, I realised the Ghost Race panel itself only appears once you've finished at least one run of that mode+difficulty — so first-time players wouldn't see the chip at all. That one I left alone. First runs rarely last long enough for idle drain to matter, and the original ring still shows up top anyway.
Not dramatic bugs. Just the kind of small, annoying stuff that made me not want to write "here is my shiny new feature" until they were dead.
Small things I cleaned up while I was in there
Danger state on the chip matches the ring — both go red under 2s, together, no lag. Tabular numerals so the count doesn't jitter as digits change. Chip sits in the existing flex row, so the compact Ghost Race layout on desktop didn't need a single extra responsive rule.
Boring polish. The kind of thing three weeks of not shipping a blog should produce.
Oh
There's an easter egg in Song mode.
There has been for a while. I don't think many of you have found it. I'm not going to tell you where. :)
Go look.
What's next
Back to my actual schedule. I'll try not to ghost again.