Wondays · habit tracking · derived from the atom up

Every state

Not a screen list. Four layers sit on top of one another, and almost every state in the product is a consequence of a single fact plus the passage of time.

First principle

The atom

The entire product stores one thing: for a given habit, on a given day, did the person do it. One boolean. Nothing else is recorded — no duration, no quality, no note, no mood.

Every number in the app is derived from that boolean and the calendar: days won, current run, best run, month totals, the string. No state may exist that cannot be rebuilt from the booleans. That single rule kills entire categories of bug and makes the record portable, printable and inheritable.

Consequence

Because the record is derived, it can never disagree with itself. There is no "streak" field to get out of sync, no cached total to go stale. The run is not stored — it is counted, every time.

Layer one · six states, and only six

The day

State
How it is reached
What the instrument does
Future
Any day after today
Cannot be marked, cannot be reached. The pad refuses the swipe. Nothing in this product ever makes a claim about a day that has not happened.
Today, open
The day begins
The only markable sheet. An empty ring, no urgency, no red, no countdown. It costs nothing to leave it this way.
Today, won
Press and hold
Filled. Totals recount. The one moment of ceremony in the whole product.
Past, won
Time passes over a marked day
Permanent. Reachable, readable, never editable after the backfill window closes.
Past, a pause
Time passes over an unmarked day
Blank. Not red, not crossed, not "missed". It subtracts nothing, and it is never counted anywhere.
Backfilled
Marked late, within 7 days
Identical to any won day — no asterisk, no "late" label. Derived below, not assumed.
The backfill ruling, derived

A record that cannot be corrected is a record that punishes forgetting to open an app. But a record that can be edited forever is fiction. Both fail. The resolution comes from the doctrine, not from taste: the instrument's completeness must never depend on the human's perfection — so backfill is allowed. It must remain a record and not a story — so it is bounded to seven days, and the seventh day closes for good.

And it is never celebrated. A day filled late looks exactly like a day filled on time, because the alternative is a product that quietly ranks your days.

Layer two

The habit

Unnamed
Before anything exists
One question, one field. No categories, no icons, no goals, no reminders to configure.
Named
They type it
Active immediately. Today's sheet appears with an empty ring on it.
Renamed
They change their mind
The name changes; every mark survives. Promised in the setup copy, so it must be true.
Retired
They stop tracking it
Never "deleted". The sheets stay in the pad, the totals stay in the record. Retiring is a decision about the future, and the future is the one thing we do not store.
Second habit
The paid line
One habit is free forever. The second is where the Ledger begins.
Layer three

The record

Empty
Named, nothing marked
One sheet, one ring. No charts, no zeroes, no empty-state illustration. Zero is not shown, because a zero is a judgement.
Thin
Under ~14 days
Numbers exist but nothing is zoomed out yet. There is nothing to be proud of at this distance and the product should not pretend otherwise.
Substantial
Enough to see a shape
The pad thickens. Summary sheets have something to summarise.
Spanning
Crosses a month or year
Month and year sheets appear in position. Zooming out becomes something you arrive at rather than a mode you switch to.
Layer four · what the person is, not what the screen is

The person

Stranger
A link, an ad, a friend
Lands on a working instrument, not a marketing page. Nothing to sign up for.
Arrived
First open
One question. The entire assignment is one habit, one dot, tonight.
Started
First mark
The only line the product will ever say twice: day one is on the page, and it cannot come off it.
Running
Marking regularly
Nothing happens. No praise, no escalation, no badge. The numbers grow and that is the reward.
Lapsed
Days pass unmarked
We do not notice out loud. No push, no email, no "we miss you". The product has no opinion about absence.
Returned
They open it again
The single most important screen in the product. Everything intact, nothing counted against them, no explanation asked for.
Keeper
Months in
The record is now worth more than the app. This is where paying makes sense and where it should first be offered.
Paying
The Ledger
The record leaves the browser and becomes ours to keep. More habits, all years, the year-book.
Leaving
They want out
Export in one tap, cancel in one tap, no interview. A product about not punishing people cannot punish them on the way out.
The states nobody designs and everybody hits

The real edges

  1. The long gap. Someone returns after forty blank days. Swiping back would show forty empty sheets — a wall of failure, which is precisely what we removed from the year grid. The pad needs a gap sheet: one sheet standing for the whole absence, then the record resumes. It states the number of days plainly and draws no conclusion from it.
  2. Midnight. A person marking at 1am is finishing yesterday, not starting today. A calendar boundary would silently steal a day from every night owl. The day rolls at 4am, not at midnight — because the product serves humans, and a human's day ends when they sleep.
  3. The cleared browser. On the free tier the record lives in local storage. Clearing it destroys everything. Addressed below — it is the one real contradiction in the design.
  4. The new phone. Free: the record does not follow. Paid: it does. This is the honest difference between the tiers and should be said in exactly those words rather than as a feature list.
  5. Two devices. Two marks for the same day is not a conflict — the boolean is the same either way. Merging is always a union, never a "last write wins" that could unmark a day. Nothing in this system can ever remove a mark.
  6. The wrong clock. Travel, DST, a device set to the wrong date. Marks are stored against the local calendar day at the moment of marking and never recomputed, so a flight cannot rewrite history.
The unresolved one

The contradiction

We promise nothing can be taken away, and then store it somewhere that can vanish.

The free tier keeps the record in the browser. A cleared cache, a reinstalled browser, a lost phone — and the whole thing is gone, from a product whose single promise is that numbers only go up. That is not an edge case to handle politely; it is the premise failing.

Three ways out, and they are not equal. Warn them — cheap, and turns the product into a nag about its own fragility. Auto-export a file at every milestone — honest, silent, costs nothing, but a file in Downloads is not a record. Make it the whole argument for paying — "this is the only thing that can still take it from you" — which is true, is the strongest sentence we have, and is uncomfortably close to selling insurance against a problem we chose.

My reading: do the second unconditionally and say the third plainly, once, at the moment the record becomes worth keeping — never before. But this is a decision about honesty, not about UX, and it should be made deliberately.