In a Daily Product, the Most Important Field Is the Date
The server built new questions daily, yet the screen showed yesterday's result the next morning. The state had no date, and that kind of death leaves no log.
A product people open every day makes its promise in units of a day: come today and there is something for today, come tomorrow and there is something for tomorrow. Keeping that promise takes less than you would think. You only need to know which day each thing belongs to. It is so basic that it is easy to assume something, somewhere, already knows.
DUGOUT 9, an independent fan project for KBO, the Korean professional baseball league, has three daily games built fresh each day from official career records. The server was keeping that promise. The screen had not kept it once since day one, and I found out much later than I should have.
The server was fine
Finish all three games and a results screen appears: today's score, the season total, the streak. The problem was that the progress state behind it had no date. It remembered "finished". It did not remember when.
So when you came back the next day, yesterday's results screen was still there. Going straight into a game showed a card saying it was already complete. Nothing was wrong on the server. New questions were being built every day, and scores were ready to be accepted by date. The screen simply never sent the request. A product built to be opened daily had become an app you use for one day.
And nobody knew, including me, because there was not a single error.
From a fan's side, coming back on the second day looked like a game that had not changed. There was nothing to report as a bug, only a reason not to come back. A daily product that fails this way does not crash. It just stops being daily, and the people it fails do not tell you; they simply stop opening it.
A request never sent leaves no trace
Thinking about why this stayed hidden so long, the answer is that I had been checking the product from the server's side. Are questions built every day? Is grading right? Do scores accumulate? Every one of those came back yes, and every one was true.
But a client that does not send a request leaves nothing in the logs or on a dashboard. A failed request becomes a record; a request never sent is nothing at all. Watch only whether the server behaves correctly, and this kind of death is invisible by construction. During development I was constantly clearing state and starting over, so I almost never lived through a second day either.
Stamp the date, clear only the day
The fix is simple. The progress state now carries a date, and when the date changes only the day's portion is cleared. The season total stays. What you did today and what you have built up so far have different lifetimes. Clearing everything at midnight would have been easier to write, and it would have traded one bug for another: a fan who came back every day would have watched their season reset every day.
One more piece was needed. Installed like an app, the page can stay open for days, so checking the date once on open is not enough. While the screen is open, it also checks whether midnight has passed.
With a date in place, the streak became honest too. Before, if you skipped a day and came back, it still went up by one, as if unbroken; a streak that does not know dates can hardly do otherwise. Now skipping a day breaks it. The number is a little less generous, and it finally deserves to be called a streak.
Open day two yourself
One habit came out of this. For any product people come back to daily, I keep a separate check that actually opens day two and looks at what is there:
- Finish today, move the date forward by one, and open it again.
- Leave the screen open across midnight.
- Skip a day, then open it.
None of these is caught by server tests, because the server behaves correctly in all of them. What needs checking is whether the screen recognises today as today. It is the kind of check that feels too obvious to write down, which is exactly why it had never been done.
Building a daily product, I spent nearly all my attention on what gets made fresh each day: the quality of the questions and the accuracy of the scores. What actually turned all of that into a daily thing was a single date field. Leave it out, and however well everything else runs, the product stops on day one. From now on I mean to write that field down first.