Showing up
Backfilling
A day you owed and did not post is not gone. It stays open for a week, and a proof posted into it counts exactly as much as one posted on the day itself — the ratio, the ranking, the streak. This is how long that week is, how it is measured, and what happens on the day it shuts.
At a glance
- Eight calendar days are open at any moment — today, plus the seven before it.
- It is measured in days, not hours. A proof for yesterday is a backfill one minute after midnight; a proof for today is on time at 23:59.
- A backfilled day counts in full. Nothing that scores a commitment knows when the proof arrived.
- The streak heals. Filling a hole rejoins the run either side of it, rather than restarting at one.
- One thing is withheld — the green “On time” badge on that proof's card. That is the entire consequence.
- When the week is up the day is closed for good, and it stays in your denominator for the rest of the season.
- Quota commitments have no backfill window at all. They run on weeks instead — see the last section.
The window
The lookback is a single number, BACKFILL_LOOKBACK_DAYS, stated once in shared/backfill-policy.ts. The API reads it to decide what to accept and the post flow reads the same binding to decide what to offer, so the days you are shown and the days the server will take cannot drift apart. It is 7 — and because the window is inclusive at both ends, seven is the lookback and eight is the number of days open.
- How long
- Eight calendar days: today and the seven before it. Exactly seven days ago is still in; eight days ago is refused.
- Measured in
- Whole calendar days. The window never counts hours, so a day is open for all of it and then not at all.
- Whose day
- Yours. The server derives it from the timezone stored on your account, so the window rolls over at midnight where you live — not on the server, and not on the device in your hand.
- Where it is enforced
- On the request that posts the proof. The picker greying a day out is a convenience; the refusal is the rule.
- If you ask anyway
- 409 — “That day is outside the 7-day backfill window”.
- Applies to
- Commitments on a fixed set of weekdays. A “N times a week” quota is judged by the week and never reaches this check.

The list shows the last ten due days, which is deliberately longer than the window. The closed days do not vanish — they sit at the bottom, greyed and padlocked, so the edge of the window is a visible line rather than a silence.
What is checked before the window
The window is the last gate, not the only one. In order, a proof is refused if:
- The season is not running. Before it starts, “The season has not started”; after it ends, “The season has ended”. The season's end is a harder wall than the window — see below.
- You have withdrawn from the season. Resume first, then post.
- The day is not one of your due days. This is also what stops backfilling reaching behind your own arrival: if you joined a season mid-run, the days before you joined are not due days for you, so they are refused before the window is ever consulted.
- The day is in the future. There is no banking ahead.
- The day is outside the window — this page's subject.
- The day already has a proof. One per due day.
What a backfilled proof does to your standing
Nothing that scores a commitment reads the moment a proof was posted. Completion and streak are folded over the days proofs are for, so a day filled a week late and a day filled on the day are indistinguishable to every number on the board.
- Completion
- Goes up by one, exactly as a same-day proof would. The count you see is filled due days over due days so far.
- Streak
- Heals. The streak is the unbroken run of filled due days walking back from your most recent one, so closing a hole joins the two runs either side of it into one.
- Ranking
- The board ranks on completion, then streak. Both move, so backfilling can move you up it.
- The card
- No “On time” badge. That badge is the one and only place lateness is recorded.
- Everything else
- Unaffected. There is no penalty, no decay and no separate late count anywhere in the product.

The day the window shuts
Eight days after a missed day, three things are true at once and none of them are announced:
- The row goes grey. In the date step it is no longer tappable — a padlock and the word “Closed”.
- The API stops taking it. A client that asks anyway is refused, which is what makes this a rule rather than a hidden button.
- The day stays in the denominator. It was a due day and it remains one, so it counts against your completion for the rest of the season. It is never removed and never forgiven.
Your streak is capped by it too, permanently. The walk backwards stops at the first unfilled day it meets, so a closed day is a floor: everything after it can still build, and nothing before it can ever be reached again.
Quota commitments do not backfill
A commitment of the “three times a week” kind owes no particular day, so a window measured in days is the wrong shape for it and it does not get one. Its rule is the week:
- Only the current week is open. A past week is read-only — a day that would sit comfortably inside the eight-day window is still refused if it belongs to last week.
- Within the current week, any day will do, several proofs a day if you like, up to that week's quota.
- Its streak heals by the week, not the day — it counts posts back to the last closed week that fell short.
So catching up on a quota is not backfilling. It is posting more this week, and the week ends when it ends.
Why there is no failure state
This page is where the product's central promise stops being a slogan and becomes code. A habit app can punish a missed day in a dozen small ways — reset the counter, deduct a score, hide the history, mark the member. This one does none of them, and the schema is the evidence: there is no penalty to store. A missed day is an unfilled slot, and an unfilled slot inside the window is an ordinary open day, offered in the picker next to today.
What is left is one nudge, and it is narrow on purpose. The only thing the reminder sweep and the dashboard card can see is whether today is a due day you have not filled. Neither of them can see the backlog, so nothing in the product ever counts your missed days back at you — however far behind you are, the most it will ever say is that today is open.
The entire cost of falling behind is a badge you do not get, and a week in which to make it not matter.