Duolingo Streak Mechanics
Duolingo's streak modeled in Machinations: how loss aversion, the daily lesson, and the freeze pull on each other.
Machinations diagrams a system as flows: sources that produce, pools that hold, gates that route. The streak made a good first subject — simple, but with enough moving parts to be worth it. The point is to stop reading features one at a time and watch the variables push on each other. So I modeled the whole streak economy as a single machine, then let it run.
It starts gently: a flame, a week of checkmarks, and a quiet instruction not to break it.
The daily engine is one roll: each day the user either hits their goal (85%) or misses (15%). A lesson adds one to the streak, pays XP, and rolls a chance at gems and a freeze. On its own the streak only ever climbs — which is the tell that nothing yet accounts for the day you miss.
The whole thing as one machine — the daily roll on the left, the recovery cascade across the bottom, the milestones up the right. Open the live model →
The real work is the failure path — the recovery cascade. A miss isn't instant death; it asks questions in order. Is there a freeze to spend? If so, it's absorbed and the streak holds. If not, can a 200-gem repair cover it? Only when both run out does the streak finally break and reset to zero. That cascade is the retention engine — the thing standing between a missed day and starting over.
And the version users actually feel: the streak gone, with the option to buy it back.
Run it forward and the shape appears: the streak climbs for weeks, each miss quietly eaten by a freeze or a gem repair — until the safety net runs dry and one more miss collapses it to zero. Then a milestone (day 7, 30, 100) hands back gems and freezes, and it rebuilds. Without that buffer one missed day ends everything; with it, the loop survives real life.
The buffer itself: one held breath, so a single missed day doesn't burn the whole thing down.
Streaks run on loss aversion more than motivation. Users aren't pushing the streak forward so much as protecting it from collapse, which makes an unrepairable streak a liability waiting for a bad day. The freeze is less a convenience than the infrastructure that keeps the loop alive through real life.
A thousand days in: by now the number itself is the thing you can't afford to lose.
None of this is news to Duolingo, but building the model changed how I read the mechanic, which was the point. I came away thinking less about individual features and more about how a product's variables pull on each other, something Machinations made easy to follow.