[2026]

Clean Days

A shared daily check-in for two people — timezone-honest days, a partner who knows, and not one punishing word.

01 — What it is

Clean Days is a check-in app for exactly two people. Each of you marks the day, each of you sees the other's, and that's the whole surface.

You're trying to stop doing something, or start doing something. Once a day you say how it went. Your partner — a friend, a sibling, someone in the same fight — sees it, and you see theirs. A calendar fills in behind you both. A counter goes up.

There are no streaks that shame you, no leaderboards, no feed, and nobody else in the app. Two people, one day at a time.

The landing — one tap a day, someone who notices

02 — Why it matters

Habit apps are mostly built for optimisers. They assume you want a chart, a streak and a nudge, and they assume a bad day is a failure state worth flashing red about. For someone actually struggling, that's the moment they delete the app — right when it mattered.

Accountability between two people works better than accountability to software, and it works because it's quiet. Somebody knows. Nobody's judging out loud. The app's only job is to make that knowing effortless and never to add pressure to a bad day.

Sign in — quiet, no feed, no noise
Today — one tap, the streak, and your partner's day

03 — Planning

This one came from a PRD, and the product rules mattered more than the architecture.

Four numbered phases. First, the solo experience: sign in, check in, see your own history — useful even with nobody else on the app. Second, the pair: invite, link, see each other. Third, honesty and recovery: how you record a slip and what happens next. Fourth, reminders and notifications.

The rules written down before code: never punitive language anywhere in the interface. Lifetime clean days never decrease, whatever happens. A slip is a fact on a calendar, not an alert. And a partner is never notified of the other's bad day — they'll see it when they look, and they can bring it up as a person rather than as a push notification.

Left out: groups, streak badges, public profiles, anything with a share button. All of them would have made it a different product.

The month, both people, one grid

04 — Building it

The hardest technical problem was what a day is. If your day rolls over at midnight, a 1am check-in belongs to yesterday in your head and today in the database — and people who are struggling are disproportionately awake at 1am. So a day runs 04:00 to 03:59, in each person's own timezone. A pair in Dhaka and Berlin each get their own honest day, and the app lines them up when it shows them together.

That single decision touched everything: check-in windows, the calendar grid, the clean-day count, and the reminder schedule. Getting it right once, in one place, and deriving everything else from it was the only way it stayed manageable.

The pair — exactly one other person
Settings — timezone, day rollover, reminders

Reminders use web push, which is genuinely unreliable across devices — iOS in particular only allows it for an installed web app. Rather than letting a reminder quietly never arrive, the app checks what the device can actually do and says so plainly, with instructions to install it if that's what's needed. Silent failure would have been worse than no feature.

Everything is scoped per user at the database level, with the partner relationship the only thing that opens a narrow window into someone else's rows. Given what people write in here, that wasn't somewhere to be casual.

What shipped: solo check-ins, pairing, the calendar and counters, the recovery flow, and push reminders with honest device support.

What's still open: an export of your own history, and a gentler way to end a pairing than simply unlinking.

This is the project where I learned that a product decision — what the app refuses to say — can be more important than anything in the schema.