Lazyweb

Design a streak calendar people can recover from

Download Markdown

Define what counts as a day, show completed and missed days clearly, and decide how a freeze changes the count. Use the historical Duolingo screens for the visible patterns they demonstrate; the recovery rules below are a proposed design, not a claim about Duolingo’s current behavior.

By Ali Abouelatta · Lazyweb Research · Published 2026-10-07 · Reviewed October 2026

streaksretentioncalendarimplementation
Two goal pickers: unselected with disabled Continue, and a selected 14-day goal with enabled Continue.
Control and Experiment goal screens with Continue and Commit to my goal actions.
Seven completed days shown as individual circles in Control and a highlighted connected row in Experiment.
Real in-market screens from Duolingo · selected and unselected goal states, Duolingo · historical goal-copy comparison, Duolingo · historical weekly celebration — tracked by Lazyweb Research

Write the counting rule first

A streak becomes confusing when the calendar and the number disagree. I would settle the rule before designing the flame.

Write down the qualifying action, the timezone used to assign a day, the cutoff, and what happens when an offline action arrives late. Decide whether travel changes the timezone immediately or at the next boundary. These are product decisions; the screenshots cannot answer them for you.

For a proposed learning app, one completed lesson might qualify a day. Opening the app would not. That example is a design choice, not a universal definition or a claim about Duolingo.

What the Duolingo evidence shows

The November 2022 source describes removing a preselected streak goal and asking learners to choose. Ali reported better retention after the interaction, without publishing a numerical effect size or an experiment dataset. The screenshots show the picker’s selected and unselected states; they cannot identify whether a visible selection came from a default or a tap. [1]

The February 2023 source discusses reminder widgets, a streak-themed app icon, commitment wording, and Perfect Streak Week. The images show a goal-copy comparison and a seven-day completion row. Treat them as historical references. They do not establish current behavior, freeze rules, or a retention result for your product. [2]

Map the states before drawing the calendar

StateWhat the user needs to seeEvidence or proposed rule
No goal chosenThe available goals and whether continuing requires a choiceCaptured Duolingo selected/unselected picker [1]
Day completedA completion marker and the date it representsSeven completed days visible in the historical weekly comparison [2]
Today incompleteA distinct today marker and the remaining opportunity to actProposed; this guide has no captured incomplete-day calendar
Week completedThe full week plus a concise celebrationCaptured Perfect week comparison [2]
Protected missed dayA freeze marker distinct from a completed lessonProposed; no freeze screen in this evidence set
Unprotected missed dayThe break, the resulting count, and a clear next actionProposed; no recovery screen in this evidence set
Late offline actionA pending state until the server accepts or rejects the dayProposed implementation behavior

Do not color a protected day exactly like a completed day. A user should be able to tell whether they practiced or used protection. If a freeze preserves the streak, say whether it is consumed automatically, how many remain, and when the result is final.

Make recovery a decision the user can understand

For a proposed recovery rule, start with three branches. A missed day with an eligible freeze consumes one freeze and leaves the count unchanged. The next qualifying day increments that count by one; the protected day remains visually distinct from a practice day. A missed day without protection breaks the streak. A late completion remains pending until the day’s eligibility is resolved. Record those transitions once and render the calendar and count from the same result.

Before adopting that rule, decide what happens after two missed days, when a freeze is bought after the cutoff, or when the learner changes timezone. If the product does not support a repair, do not show a repair button that leads nowhere. These are design questions to resolve with your product team; this guide is not documenting a Duolingo entitlement.

Keep commitment and counting separate

In the captured copy comparison, Continue becomes Commit to my goal while the headline and option labels also change. You cannot attribute an outcome to the button alone. [2]

If you test a required goal choice, keep the rest of the offer stable where possible. Measure completed lessons and return behavior over a declared window, alongside picker abandonment and notification opt-outs. A higher selected goal is an intermediate response. It does not establish that the learner practiced more.

Give your coding agent a complete brief

Use the historical screens as visual references, then supply the decisions your product owns:

Build a weekly streak calendar from a single daily-state model. Use my qualifying action, timezone, cutoff, freeze eligibility, and late-sync rules. Show completed, today-incomplete, protected, missed, and pending days with accessible labels. Keep the streak count consistent with those states. Ask for any missing rule before implementing it. Use the cited Duolingo screens only for the states they actually show.

Use Connect Lazyweb below to research additional captured states in your coding agent. If a recovery reference is unavailable, label the design as proposed instead of manufacturing a product screenshot.

Check cases the happy path misses

  • Complete two qualifying actions on the same day. The day should count once.
  • Cross midnight during a lesson. Apply the declared timestamp rule.
  • Miss a day with one freeze, then miss another with none. Verify both the count and markers.
  • Sync a late lesson after the calendar already showed a break. Verify the stated reconciliation behavior.
  • Change timezone while traveling. Check that the chosen rule does not silently count the same day twice.
  • Read the week with a screen reader and with color removed. The state should remain understandable.

Keep the expected result for each case in the brief. A calendar that looks right on a perfect week has not yet answered the recovery questions.

Methodology. Historical source reading plus direct visual inspection of three existing public image assets. Source-publication dates are not capture timestamps. Recovery, freeze, timezone and late-sync rules are proposed implementation choices; no corresponding captured recovery screen or measured result is claimed.

Sources & citations

  1. [1] Ali Abouelatta: Duolingo streak goals, November 21, 2022 Open source. Historical author account; qualitative outcome, no numerical effect-size dataset. ↩
  2. [2] Ali Abouelatta: Duolingo retention experiments, February 6, 2023 Open source. Historical 2022 experiments described in 2023. Screen contents visually checked October 7, 2026. ↩

Source: Lazyweb Research — proprietary analysis of real, in-market app screens. Cite as Lazyweb Research, 2026-10-07.

Related questions

More in Retention and habit formation →

Use these references in your coding agent. Connect Lazyweb → More research