Tuesday, July 28, 2026
"Day 32 of 30" is what happens when a thing that ends has no code that ends it.
A thirty-day practice cycle counted past its own length, because nothing in the product ever moved a cycle out of active except a ritual the person has to perform. Fixing it meant choosing what a finished-but-unclosed cycle should feel like, instead of just clamping a number.
Shipped
- The counter stops at the end — a cycle read "day 32 of 30" because the day count was uncapped, the daily delivery had no check for whether the window had passed, and a cycle only leaves its active state through a closing ritual the person performs by hand. Hard stop at the end of the cycle, no automatic close, no soft overflow
- Past the end, the invitation replaces the card — instead of another day's reading, a finished cycle sends an invitation to close it, once per local day, until the ritual is done — at which point the emails stop on their own because the cycle is no longer active
- Closing became free — the close was behind the paid tier while the invitation goes to everyone, which would have produced a nag loop nobody could exit. The paywall came off the close
- An off-by-one on the end date — the stored end date landed a day wrong. The boundary logic now works from the start date plus the length instead of reading the stored value, sidestepping it entirely; the stored date is corrected for new cycles
- The closing ritual has a screen — turning three cards to close a chapter, reachable directly from the invitation
- Verified against a real cycle — rendered the invitation from actual data rather than a fixture, so the counter, the subject line and the wording were checked as a reader would receive them
- The market heatmap merged — the paiddaily.io hero rebuild landed on the release branch ahead of tomorrow's publish and verification
Notes
The tempting fix here was one line — clamp the day number so it can't exceed the length — and it would have made the wrong text go away without answering the actual question, which is what a finished cycle should do. Leaving it active forever and just displaying a nicer number means the daily reading keeps arriving for a chapter that's over. Closing it automatically would be tidier and would also quietly delete the only moment in the product that asks the person to mark an ending, which is most of the point of having cycles at all. The answer was to keep the ritual sacred and change what arrives instead: past the end, the daily card becomes a daily invitation to close, and the invitation stops itself the moment the ritual is done. That only works if closing is free, which is why the paywall came off — a gate on the one action that ends a repeating message turns the message into a trap.
