The Journal

A GitHub contribution graph, but for your life.

28 July 2026 · Kartik Patel · 7 min read
Fifty-two columns. Seven rows. One year of showing up.

Sometime around 2013, GitHub shipped the most effective habit tracker ever built by accident. It wasn't marketed as one. It has no reminders, no streak freeze, no notifications, and no settings. It's a grid of small squares on your profile page — one per day, greener the more you committed — and for a decade it has quietly driven more daily consistency among programmers than any productivity app ever sold to them.

I know, because I spent years arranging my evenings around it. Not consciously. I'd notice a pale square in an otherwise green week and find a small thing to push. That isn't discipline. That's a well-designed interface doing the work discipline usually has to.

I want to take that mechanism seriously, because I think most habit apps have the shape of it wrong — and then I want to talk about what happens when you point it at the rest of your life.

Why the grid works

There are three things going on, and they're separable.

1. It shows time, not totals

A number tells you how much. A grid tells you when. Those are different questions, and consistency is a question about when.

“You've meditated 47 times” is a fact you can't act on. A grid that shows twelve solid weeks followed by a ragged, gap-toothed fortnight tells you something true and specific: something changed two weeks ago. Maybe you started travelling. Maybe the 6am slot stopped working when the light changed. The grid doesn't diagnose it, but it puts the question in front of you, unavoidably, in a shape your eye reads before your brain does.

Almost every habit app defaults to totals and percentages because they're easy to compute and easy to put on a card. They're also the least useful summary of a practice.

2. It makes the chain visible — which makes breaking it expensive

The folk version of this is the Seinfeld method: get a wall calendar, put a big red X on every day you do the work, and then don't break the chain. (The attribution to Jerry Seinfeld is probably apocryphal — it comes from a single 2007 Lifehacker post — but the technique long predates the story, and it works regardless of who said it.)

What makes it work isn't the X. It's that the chain is a thing you can see and therefore a thing you can lose. Behavioural economists would call this loss aversion: an eleven-day run is now an asset on your books, and skipping today is no longer neutral — it's a write-off. A counter that reads "11" does some of this. A visible, unbroken row of filled squares does far more of it, because the loss is spatial. You can see exactly where the hole would go.

3. It's ambient

This is the part people miss. The contribution graph never asked you to open anything. It sat on a page you visited for other reasons, and it registered in half a second of peripheral attention.

Habit tracking that requires you to open an app to see how you're doing has already lost, because the days you most need to see the grid are exactly the days you won't open the app. The information has to come to you.

Where the graph gets it wrong

I don't want to oversell it. Copied naively, the contribution graph has two real failure modes, and both of them are instructive.

It measures the proxy, not the thing. A commit is not progress. Anyone who has watched a colleague cultivate a perfect green wall out of README typos and whitespace fixes knows what happens when a visual metric becomes the goal. Goodhart's law arrives quickly, and it arrives dressed as virtue.

And it punishes ordinary life. The graph makes no distinction between “I gave up” and “I was at a wedding,” or “I was ill,” or “it was Sunday and I don't work Sundays.” Every one of those reads as a pale square — a small permanent record of a failure that wasn't one. For a lot of people that's the moment the whole system quietly dies: they miss two days for perfectly good reasons, the grid stops looking like an achievement, and they stop looking at the grid.

A tracker that can't tell the difference between quitting and resting will eventually make you quit.

What I changed when I built one

The Rituals is, honestly, the contribution graph pointed at the rest of your life. That was the entire brief. But the two failure modes above are exactly where it had to differ, and it's worth being specific about how.

One grid per habit, in its own colour. GitHub gives you a single aggregate wall, which conflates everything. Reading, running, and practising scales are not the same practice, and they don't fail together. Each habit gets its own grid and its own colour, so you can see at a glance which one is actually slipping instead of watching one blended average.

Schedules the grid respects. If your habit is four times a week, the days you deliberately didn't do it are not gaps. They're off-days, and the grid renders them as off-days. A tracker that marks your rest days as failures is lying to you about your own plan.

A way to spend a missed day instead of losing the run. Streak freezes — three a month, banked, up to six — let you mark a day as paused rather than broken. The streak doesn't grow; it also doesn't reset. This is the single feature I'd most want in a tracker and the one I've most often found missing, because it acknowledges the obvious thing: a two-week holiday is not a relapse.

And no guilt anywhere in the copy. When a streak does end — and it will — the app says every sunrise is a fresh start, and then shows you the grid you already built. Not the run you lost. Sixty green squares are still sixty green squares. That framing isn't decoration; it's the difference between someone who restarts on Tuesday and someone who deletes the app.

If you'd rather build your own

You genuinely don't need an app for this, and I'd be a hypocrite to pretend otherwise. The mechanism is public domain. What you need is:

  • A grid where one cell = one day, laid out so a week is a column and a year fits on one screen.
  • Fill intensity, not binary marks — a faint cell for a light day still counts as showing up, which keeps the wall from becoming pass/fail.
  • Somewhere you'll see it without deciding to. A pinned spreadsheet tab, a paper calendar by the kettle, a shell script that prints it on terminal launch.
  • An explicit, honest rule for what an off-day looks like, decided before you need it. This is the one everybody skips and the one that determines whether the system survives March.

A wall calendar and a marker does all four. If that's what works for you, use that — the grid was never the app's idea in the first place.

The part that surprised me

After about six weeks of using my own grids, the streak number stopped being the thing I looked at. The shape became the thing.

You start reading your own grid the way you'd read a chart at work. A tight band of colour that thins out every second week is a scheduling problem, not a willpower problem. Two habits that go pale in the same fortnight are usually one habit competing with the other. A run that's dense on weekdays and empty on weekends means the practice is attached to your commute, and it will not survive a job change.

None of that is available from a streak counter. It's only available from a picture. Which is, I think, the whole argument for the grid, and the reason a side-effect of a version-control host turned out to be a better behaviour-change tool than most things designed to be one.