Habit Tracker

Habits down the side, days across the top, one click to mark a day done. Set a target of three times a week rather than every day and the streak survives a missed Tuesday — the counter knows the difference.

How to use it

Two views sit behind the same squares: a month grid showing the shape of the last few weeks, and a year heatmap showing the shape of the whole thing at once.

  1. Add your habits Press Add a habit, give it a name and a colour, then choose its target: every day, a number of times a week, or certain weekdays.
  2. Tick the squares Click any square in the grid to mark that day done, and click again to undo. Arrow keys move around the grid if you would rather not use the mouse.
  3. Move between months The arrows either side of Today step back and forward a month, so you can fill in a day you forgot last week.
Full instructions

This month

done due today or that day counts towards a weekly target not a target day — never breaks a streak

Habits

Click any square to mark a day done · arrow keys move around the grid
In depth

Tracking habits in a grid, and counting streaks that tell the truth

This guide covers every part of the habit tracker: the three kinds of target, how a streak is counted for each of them, why the day you are standing in is treated differently from the days behind it, what the rolling-year heatmap adds that a month cannot show, and how to get your history out as a spreadsheet, a backup file or a sheet of paper.

Why a grid, and not a list

A checklist tells you about today. A grid tells you about the month. Those are different questions, and the second one is the one that changes behaviour.

Here the habits run down the left side and the days run across the top, so each habit gets its own long row of small squares. Click a square and that day is marked done. Click it again and the mark comes off.

Once a week or two is filled in, the row starts to speak for itself. A solid band means the habit has taken hold. A row with holes every Thursday is telling you something specific about Thursdays. You cannot see that in a list of tasks, because a list throws yesterday away as soon as it is ticked.

The grid also makes gaps cheap to admit. A missing square is one square, not a failure that ends the whole project. People who track this way tend to keep going after a bad week, because the bad week is visibly small next to the rest of the row.

Three kinds of target, and why the choice matters

When you add a habit you pick one of three targets, and that choice changes everything the tool says about it afterwards.

Every day is the simplest. Each of the thirty or thirty-one squares in the month is a day you meant to do the thing, so each one either counts or is missing.

A number of times a week suits anything you do often but not on fixed days. Running three times a week is the classic case. You are not committing to Tuesday. You are committing to three, whenever they land.

Certain weekdays is for things pinned to the calendar. Piano on Monday, Wednesday and Friday. A long walk on Sunday. Bins out on Tuesday night. Days you did not pick are drawn faintly with a small dash through them, so the row does not look like a wall of misses.

The mistake worth avoiding is setting a habit to every day when you only ever meant three times a week. Do that and the grid shows four gaps a week for something you are doing exactly as planned, and the percentage under it drops to a number that discourages you for no reason.

The rule that keeps a streak honest

A day that was never a target cannot break a streak. That single rule is the reason the weekday option is worth having at all.

Take a piano habit set to Monday, Wednesday and Friday. When the streak is worked out, the walk back through the calendar skips Tuesday, Thursday, Saturday and Sunday entirely. They are neither successes nor misses. They are simply not part of the deal. So four Mondays, Wednesdays and Fridays in a row is a streak of twelve, not a streak that keeps snapping every time a Tuesday goes by.

You can still tick a non-target day if you did the thing anyway. That extra practice is counted and shown as a bonus beside the other figures, but it never becomes an expectation. Tick a Saturday once and Saturday does not join the plan.

This is the part most trackers get wrong, and getting it wrong has a cost. A streak counter that resets for reasons the user does not accept stops being read. Once it stops being read, the whole grid is just decoration.

Counting a weekly target in weeks

Three times a week pins no particular day, so it cannot be measured a day at a time. There is no such thing as missing Wednesday when Wednesday was never required.

So a weekly habit has its streak counted in weeks. Every week that reached the number adds one. Four good weeks in a row is a streak of four weeks, whatever pattern of days made them up. The unit is always printed next to the figure, so a streak of four weeks is never mistaken for a streak of four days.

The percentage for a weekly habit works proportionally. Three a week across twenty-eight elapsed days expects twelve. If you have done ten, that reads as eighty-three per cent. Over a full month this settles into a fair picture, and it does not punish you for doing all three runs at the weekend.

There is also a small chip showing where you stand in the week you are in right now: this week, two of three. That is the number you actually act on, because it tells you whether Sunday needs to include a run.

Today is not a failure yet

The day you are standing in is treated differently from every day behind it. It only enters the expected total once you have ticked it.

The alternative is worse than it sounds. If today counted from midnight, every percentage on the page would drop at breakfast, sag all through the working day, and climb back at bedtime. The number would be measuring the clock rather than the habit.

The same thinking applies to streaks. If today is a target day and you have not done it yet, the count simply starts at yesterday. Your streak of eleven still reads eleven at nine in the morning. It only breaks once today has become yesterday with the square still empty.

Weekly habits get the same courtesy. The week in progress never breaks a weekly streak, because a week with three days left in it has not failed to reach three.

The figures under each habit

Each habit carries a short row of small chips, and each one answers a different question.

The first is the streak running right now, with its unit: days for a daily or weekday habit, weeks for a weekly one. The second is the best run you have ever managed for that habit, worked out over your whole history rather than just the month on screen.

The third compares what you did against what was due in the period you are looking at, as a count and a percentage. In the month view that means this month. Switch to the year view and the same chip covers the last twelve months.

Weekly habits add the this-week chip. Any habit you ticked on a day that was not a target adds a bonus chip. Nothing here is hidden behind a hover or a menu; the whole picture for one habit fits on one line.

The last chip is the day the habit started counting, and it quietly fixes a problem the year view would otherwise have. Nothing before that date is treated as due. Add a habit in June and the twelve-month figure covers June onwards, not the five months when the habit did not exist. Without that rule, somebody who had been perfect since June would open the year view and be told they had managed forty per cent.

Moving around, and filling in the days you forgot

The arrows either side of the Today button step back and forward a month. Nobody remembers to tick every day, so going back and filling in last Thursday is a normal thing to do rather than a repair job.

Days that have not happened yet are locked. You cannot tick tomorrow, because a habit you have not done is not data, and a tracker that lets you tick ahead stops being a record of anything.

The whole grid works from the keyboard. Tab into it and the arrow keys move between squares in any direction, with space or Enter to mark one. Thirty-one squares in a row is a lot of tabbing, so the arrow keys matter more here than on a normal form.

Under the grid sits a row counting how many ticks landed on each day. That row is often the most interesting part: it shows the days when everything came together and the days when nothing did, which is usually a story about how the day itself was arranged.

The rolling year, and what it shows that a month cannot

Switch to the year heatmap and each habit is drawn as a block of small squares covering the last twelve months. Weeks run left to right, weekdays run top to bottom, and month labels sit above the columns where each month begins.

A month grid can look perfectly healthy while a habit is quietly dying. You see August, August looks fine, and you never put August next to the four months before it. The heatmap does exactly that in one picture.

What it shows best is the shape of a lapse. Most habits do not stop; they thin out. The squares get sparser over a few weeks, then there is a gap, then a burst of enthusiasm, then a longer gap. Seeing that pattern once tends to change how you read the next thin fortnight.

The heatmap squares are clickable too, so you can fix an old day without going back through the months one at a time. The rolling year always ends today and begins on the same weekday a year ago, so the grid stays rectangular and the weekday rows stay aligned.

Week starts and date formats

Weeks can start on Monday, Sunday or Saturday. This is not a cosmetic setting. It decides where the boundary falls for every weekly target, so a run on Sunday night belongs to one week under a Monday start and a different week under a Sunday start.

The same setting orders the weekday boxes in the habit editor and the rows of the year heatmap, so everything on the page agrees about where a week begins.

Dates can be shown as 31/12/2026, 12/31/2026, 2026-12-31 or 31 Dec 2026. This affects the tooltips on the grid, the printed header and the first column of the CSV export, which also carries a plain ISO date beside it so a spreadsheet can sort the rows properly whichever format you chose to read.

Both settings are saved with everything else, so they are still set the way you like them next time the page opens.

Getting the history out

There are three ways off this page, and they serve different purposes.

The CSV holds one row per day of whatever period you are viewing, with a column for each habit. A done day is 1, a missed one is 0, and a day that was never a target for that habit is left empty. Days in the future are empty too, so nothing in the column reads as a miss that has not happened. There is a date in your chosen format, the same date in ISO form, the weekday, and a count of ticks for that day. It opens cleanly in any spreadsheet and is the right choice if you want to chart something the tool does not chart.

The JSON export is the backup. It carries every habit, every target, every note and every tick you have ever made, not just the period on screen. Import reads it back, and it replaces what is on the device rather than merging, so you are asked to confirm first. If the file has been edited by hand and something in it is odd, the importer repairs it instead of refusing the whole file.

The third way out is paper, and it is worth its own section.

Printing, filled in or blank

The print option offers two versions. The grid as it stands prints what is on screen, ticks and figures included, which suits a record for a coach, a doctor or a training log.

An empty grid prints the same month with the squares left blank. Habit names, targets, dates and weekday letters all come out; the ticks and the totals do not. Days that were never a target are shaded with a fine hatch, so nobody fills in a Tuesday on a Monday, Wednesday and Friday row.

That blank sheet is a genuinely useful thing. A grid on the fridge door or inside a notebook gets ticked in situations where a phone does not come out: last thing at night, in a kitchen with wet hands, in a room where you are trying not to look at a screen. Some people run both, filling in the paper daily and copying it into the browser once a week.

The layout shrinks for paper so a full month fits across one portrait sheet. Ask for a blank sheet while the year heatmap is showing and the view switches back to the month grid first, because a year of nine-pixel squares is not something anyone can fill in with a pen.

Where your history lives

Habits and ticks are kept in this browser's own storage, under a single key, saved the moment you click a square. There is no account, no sign-in and nothing sent anywhere. Turning off the internet after the page loads changes nothing about how it works.

The trade is the obvious one. The grid is on this computer in this browser, and it will not appear on your phone. Clearing site data or browsing history removes it, and a private window forgets it when the window closes. That is what the JSON export is for, and it takes a second.

Start over wipes everything on the device and brings back the example habits, after a confirmation. The example is deliberately pre-filled with a couple of months of plausible history, so the streak figures and the heatmap are showing something real before you have ticked a single square yourself.

Twenty habits is the ceiling. Past that a month no longer fits on a screen or a sheet of paper, and in practice a list that long stops being ticked well before it stops fitting.

Making a tracker that you keep using

Start with one or two habits, not ten. A grid with ten rows takes real effort to fill in every day, and the effort is spent on the tracker rather than the habits. Add a third only when the first two are automatic.

Pick habits you can tick or not tick without arguing with yourself. Twenty minutes of piano is checkable. Practise more is not. If you keep hesitating over a square, the habit is worded badly, so open it and reword it.

Use the note field for the rule you will forget. Any distance counts. Twenty minutes, scales first. Before the kettle boils. Six weeks later, that one line is what stops a habit quietly drifting into something harder than you agreed to.

Look at the year heatmap once a month rather than every day. The daily grid is for ticking; the heatmap is for deciding. If a row has gone thin, the useful question is what changed in your week, and that answer is usually visible in the shape of the gap rather than in any percentage.

Help

A grid, a tick, and an honest streak

Two views sit behind the same squares: a month grid showing the shape of the last few weeks, and a year heatmap showing the shape of the whole thing at once. Current streak, longest run and completion rate are counted for each habit, so a run you have kept going is visible without counting back through the grid.

Add your habits

Press Add a habit, give it a name and a colour, then choose its target: every day, a number of times a week, or certain weekdays.

Tick the squares

Click any square in the grid to mark that day done, and click again to undo. Arrow keys move around the grid if you would rather not use the mouse.

Move between months

The arrows either side of Today step back and forward a month, so you can fill in a day you forgot last week.

Switch to the year heatmap

Year heatmap draws the last twelve months for each habit as a block of small squares — the view that shows whether a habit really stuck.

Keep or print a copy

Export JSON for a full backup you can import again, CSV for a spreadsheet, or print the grid — filled in, or blank for the fridge door.

Stored on this device only

Habits and ticks are saved in this browser and go nowhere else. That means no account and nothing uploaded, and it also means the grid does not appear on your phone. Export the JSON if you want a copy that travels.

Good to know

Set the target you actually mean

If you plan to run three times a week, do not set it to every day and then feel bad four days out of seven. A weekly target counts weeks, not days, so the number under the grid stays true to the plan.

Today is not a failure yet

The day you are standing in is left out of the percentage until you tick it, and it never breaks a streak on its own. The figures do not sag at breakfast and recover by bedtime.

Two habits beats ten

A grid with ten rows is a grid nobody fills in. Start with the one or two things that would change the week, and add more only once ticking them is automatic.

The heatmap tells the real story

A month grid can look fine while a habit quietly dies. Twelve months of squares shows the gap in August that the month view never puts in one place.

Export before you clear your browser

The history lives in this browser's storage, so clearing site data removes it. A JSON export takes a second and imports straight back.

Common questions

Does missing a Tuesday break a Monday, Wednesday, Friday habit?
No. Days that were never a target are skipped entirely when the streak is counted, so an untouched Tuesday changes nothing. You can still tick one if you did it anyway, and it is counted as a bonus.
How is the streak counted for a habit set to three times a week?
In weeks, not days. Every week that reached three adds one to the streak, counting back from this week. The number always has its unit printed beside it so the two kinds are never mixed up.
Why is the percentage not falling when I have not done today's habit?
Today only enters the sum once it is ticked. If it counted from midnight, every figure would drop each morning and climb back each evening, which tells you nothing about the habit. For the same reason, nothing is counted from before the day you added the habit — the chip beside the figures says which day that was.
Can I go back and fill in days I forgot?
Yes. Step back with the month arrows and tick any past square. Future days are locked, because a habit you have not done yet is not data.
Will my history survive closing the browser?
Yes, on this device and in this browser. It is saved after every click. Clearing browsing data or using private mode will lose it, which is what the JSON export is for.
What is in the CSV?
One row per day of the period you are looking at, with a column per habit holding 1 for done, 0 for missed and an empty cell for a day that was never a target. There is a date in your chosen format, the same date in ISO form for sorting, the weekday, and a count of ticks per day.
Can I print a blank grid to fill in by hand?
Yes. Set Print to an empty grid and press Print. The habit names, targets and dates come out; the ticks do not, and non-target days are shaded so nobody fills in the wrong box.
Does the week start on Monday or Sunday?
Whichever you choose. The setting changes the weekly target boundaries, the order of the weekday boxes in the editor, and the rows of the year heatmap. Saturday is there too.
How many habits can I track?
Twenty. Past that the grid stops fitting on a screen or a sheet of paper, and in practice a list that long stops being ticked long before it stops fitting.
What happens if I import a file?
It replaces everything on this device, after a confirmation. Export what you have first if you want to keep it. Anything odd in the file is repaired rather than rejected, so an edited export still opens.