{"id":69984,"date":"2026-11-08T23:36:29","date_gmt":"2026-11-08T18:06:29","guid":{"rendered":"https:\/\/www.quickonlinetips.com\/archives\/tools\/habit-tracker\/"},"modified":"2026-11-08T23:36:29","modified_gmt":"2026-11-08T18:06:29","slug":"habit-tracker","status":"publish","type":"page","link":"https:\/\/www.quickonlinetips.com\/archives\/tools\/habit-tracker\/","title":{"rendered":"Printable Habit Tracker: Free PDF Maker With Circles or Boxes"},"content":{"rendered":"<p>Make your own <strong>free printable habit tracker<\/strong> in a minute. Type the habits you want to build (or leave the rows blank to write in by hand), choose circles or boxes, pick 7 to 31 days or the real dates of any month, and download a clean PDF that prints on A4 or US Letter paper.<\/p>\n<div class=\"qtx-trk-tabs\"><p class=\"qtx-trk-h\">Free printable trackers<\/p><nav aria-label=\"Printable trackers\"><a href=\"https:\/\/www.quickonlinetips.com\/archives\/tools\/habit-tracker\/\" aria-current=\"page\">Habit tracker<\/a><a href=\"https:\/\/www.quickonlinetips.com\/archives\/tools\/75-day-challenge-tracker\/\">75-day challenge<\/a><a href=\"https:\/\/www.quickonlinetips.com\/archives\/tools\/100-day-challenge-tracker\/\">100-day challenge<\/a><a href=\"https:\/\/www.quickonlinetips.com\/archives\/tools\/yearly-habit-tracker\/\">Yearly tracker<\/a><a href=\"https:\/\/www.quickonlinetips.com\/archives\/tools\/mood-tracker\/\">Mood tracker<\/a><a href=\"https:\/\/www.quickonlinetips.com\/archives\/tools\/water-tracker\/\">Water tracker<\/a><a href=\"https:\/\/www.quickonlinetips.com\/archives\/tools\/reading-log\/\">Reading log<\/a><a href=\"https:\/\/www.quickonlinetips.com\/archives\/tools\/savings-tracker\/\">Savings tracker<\/a><a href=\"https:\/\/www.quickonlinetips.com\/archives\/tools\/workout-log\/\">Workout log<\/a><a href=\"https:\/\/www.quickonlinetips.com\/archives\/tools\/weekly-planner\/\">Weekly planner<\/a><\/nav><\/div>\n<div class=\"qt-tool\" id=\"qt-ht\"><p class=\"qt-label\" style=\"font-size:1.15em;margin:0 0 10px\"><strong>Step 1:<\/strong> Name your tracker and your habits<\/p><div class=\"qt-grid\"><div class=\"qt-field\"><label for=\"qt-ht-title\">Tracker title<\/label><input type=\"text\" id=\"qt-ht-title\" maxlength=\"60\" value=\"My Habit Tracker\"><\/div><div class=\"qt-field\"><label for=\"qt-ht-rows\">How many habit rows<\/label><select id=\"qt-ht-rows\"><\/select><\/div><\/div><div class=\"qt-field\" style=\"margin:12px 0 0\"><label for=\"qt-ht-names\">Your habits, one per line (optional: leave it empty to print blank rows you fill in by hand)<\/label><textarea id=\"qt-ht-names\" class=\"qt-prose\" rows=\"5\" style=\"min-height:130px\" placeholder=\"Drink 8 glasses of water&#10;Read 20 minutes&#10;Walk 8,000 steps&#10;No phone after 10 pm\"><\/textarea><\/div><div class=\"qt-row\"><button type=\"button\" class=\"qt-btn qt-btn-ghost qt-btn-sm\" id=\"qt-ht-ex\">Add example habits<\/button><button type=\"button\" class=\"qt-btn qt-btn-ghost qt-btn-sm qtx-nomark\" id=\"qt-ht-clr\">&#8634; Clear habits<\/button><\/div><p class=\"qt-label\" style=\"font-size:1.15em;margin:18px 0 10px\"><strong>Step 2:<\/strong> Choose the layout and colours<\/p><div class=\"qt-grid\"><div class=\"qt-field\"><label for=\"qt-ht-head\">Top row shows<\/label><select id=\"qt-ht-head\"><option value=\"num\">Day numbers 1, 2, 3 ...<\/option><option value=\"numwk\">Day numbers + weekday letters<\/option><option value=\"wk\">Weekday letters only (M T W ...)<\/option><option value=\"date\">Real dates for a month I pick<\/option><option value=\"blank\">Blank boxes (write your own dates)<\/option><\/select><\/div><div class=\"qt-field\" id=\"qt-ht-f-days\"><label for=\"qt-ht-days\">Number of days<\/label><select id=\"qt-ht-days\"><option value=\"7\">7 days (one week)<\/option><option value=\"14\">14 days<\/option><option value=\"21\">21 days<\/option><option value=\"28\">28 days<\/option><option value=\"30\">30 days<\/option><option value=\"31\">31 days (any month)<\/option><\/select><\/div><div class=\"qt-field\" id=\"qt-ht-f-first\"><label for=\"qt-ht-first\">Week starts on<\/label><select id=\"qt-ht-first\"><option value=\"mon\">Monday<\/option><option value=\"sun\">Sunday<\/option><\/select><\/div><div class=\"qt-field\" id=\"qt-ht-f-mon\"><label for=\"qt-ht-mon\">Month<\/label><select id=\"qt-ht-mon\"><\/select><\/div><div class=\"qt-field\" id=\"qt-ht-f-yr\"><label for=\"qt-ht-yr\">Year<\/label><input type=\"number\" id=\"qt-ht-yr\" min=\"1900\" max=\"2200\"><\/div><div class=\"qt-field\" id=\"qt-ht-f-pages\"><label for=\"qt-ht-pages\">How many months (pages)<\/label><select id=\"qt-ht-pages\"><option value=\"1\">1 month<\/option><option value=\"3\">3 months<\/option><option value=\"6\">6 months<\/option><option value=\"12\">12 months (a full year)<\/option><\/select><\/div><\/div><div class=\"qt-grid\"><div class=\"qt-field\"><label>Shape to fill in<\/label><div class=\"qt-seg\" role=\"group\" aria-label=\"Shape to fill in\"><button type=\"button\" data-g=\"sh\" data-v=\"circle\" aria-pressed=\"true\">Circles<\/button><button type=\"button\" data-g=\"sh\" data-v=\"box\" aria-pressed=\"false\">Boxes<\/button><\/div><\/div><div class=\"qt-field\"><label>Paper size<\/label><div class=\"qt-seg\" role=\"group\" aria-label=\"Paper size\"><button type=\"button\" data-g=\"pa\" data-v=\"a4\" aria-pressed=\"true\">A4<\/button><button type=\"button\" data-g=\"pa\" data-v=\"letter\" aria-pressed=\"false\">US Letter<\/button><\/div><\/div><div class=\"qt-field\"><label>Print direction<\/label><div class=\"qt-seg\" role=\"group\" aria-label=\"Print direction\"><button type=\"button\" data-g=\"or\" data-v=\"land\" aria-pressed=\"true\">Landscape<\/button><button type=\"button\" data-g=\"or\" data-v=\"port\" aria-pressed=\"false\">Portrait<\/button><\/div><\/div><\/div><div class=\"qt-field\" style=\"margin:12px 0 0\"><label>Colour<\/label><div class=\"qt-seg\" role=\"group\" aria-label=\"Colour\" style=\"flex-wrap:wrap\"><button type=\"button\" data-g=\"th\" data-v=\"blue\" aria-pressed=\"true\"><span style=\"display:inline-block;width:12px;height:12px;border-radius:50%;background:#2B6CB0;margin-right:6px;vertical-align:-1px;border:1px solid #fff\"><\/span>Blue<\/button><button type=\"button\" data-g=\"th\" data-v=\"green\" aria-pressed=\"false\"><span style=\"display:inline-block;width:12px;height:12px;border-radius:50%;background:#2F855A;margin-right:6px;vertical-align:-1px;border:1px solid #fff\"><\/span>Green<\/button><button type=\"button\" data-g=\"th\" data-v=\"pink\" aria-pressed=\"false\"><span style=\"display:inline-block;width:12px;height:12px;border-radius:50%;background:#D53F8C;margin-right:6px;vertical-align:-1px;border:1px solid #fff\"><\/span>Pink<\/button><button type=\"button\" data-g=\"th\" data-v=\"purple\" aria-pressed=\"false\"><span style=\"display:inline-block;width:12px;height:12px;border-radius:50%;background:#6B46C1;margin-right:6px;vertical-align:-1px;border:1px solid #fff\"><\/span>Purple<\/button><button type=\"button\" data-g=\"th\" data-v=\"teal\" aria-pressed=\"false\"><span style=\"display:inline-block;width:12px;height:12px;border-radius:50%;background:#2C7A7B;margin-right:6px;vertical-align:-1px;border:1px solid #fff\"><\/span>Teal<\/button><button type=\"button\" data-g=\"th\" data-v=\"rainbow\" aria-pressed=\"false\"><span style=\"display:inline-block;width:12px;height:12px;border-radius:50%;background:conic-gradient(#E53E3E,#D69E2E,#38A169,#3182CE,#805AD5,#E53E3E);margin-right:6px;vertical-align:-1px;border:1px solid #fff\"><\/span>Rainbow rows<\/button><button type=\"button\" data-g=\"th\" data-v=\"mono\" aria-pressed=\"false\"><span style=\"display:inline-block;width:12px;height:12px;border-radius:50%;background:#1A202C;margin-right:6px;vertical-align:-1px;border:1px solid #fff\"><\/span>Black and white<\/button><\/div><\/div><div class=\"qt-grid\"><label class=\"qt-check\"><input type=\"checkbox\" id=\"qt-ht-tot\"> Total column to count your days<\/label><span id=\"qt-ht-f-shade\"><label class=\"qt-check\"><input type=\"checkbox\" id=\"qt-ht-shade\"> Shade weekends<\/label><\/span><label class=\"qt-check\"><input type=\"checkbox\" id=\"qt-ht-inner\"> Day number inside each circle or box<\/label><label class=\"qt-check\"><input type=\"checkbox\" id=\"qt-ht-notes\"> Notes box at the bottom<\/label><span id=\"qt-ht-f-wi\"><label class=\"qt-check\"><input type=\"checkbox\" id=\"qt-ht-wi\"> Month and Year lines to write in<\/label><\/span><\/div><p class=\"qt-label\" style=\"font-size:1.15em;margin:18px 0 10px\"><strong>Step 3:<\/strong> Download your PDF and print it<\/p><div class=\"qt-row\"><button type=\"button\" class=\"qt-btn qt-btn-big\" id=\"qt-ht-dl\">Download PDF<\/button><button type=\"button\" class=\"qt-btn qt-btn-ghost\" id=\"qt-ht-open\">Open PDF to print<\/button><button type=\"button\" class=\"qt-btn qt-btn-ghost qtx-nomark\" id=\"qt-ht-reset\">&#8634; Start over<\/button><\/div><p style=\"font-size:1rem;font-weight:600;margin:8px 0 0\">Open PDF to print opens in a new tab.<\/p><div class=\"qt-status\" id=\"qt-ht-status\" aria-live=\"polite\"><\/div><p class=\"qt-sub\" style=\"margin:18px 0 6px\">Live preview<\/p><p class=\"qt-small\" id=\"qt-ht-fit\" style=\"text-align:left;margin:0 0 8px\" aria-live=\"polite\"><\/p><div id=\"qt-ht-prev\" style=\"background:#E2E8F0;border-radius:10px;padding:14px\"><\/div><p class=\"qt-note\"><strong>Private by design:<\/strong> your tracker and the PDF are made in your browser. Nothing you type is sent to or stored on our server.<\/p><\/div>\n<script>(function () { function $(id) { return document.getElementById(id); } function ready(fn) { if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', fn); } else { fn(); } } var LT = String.fromCharCode(60); var D1 = LT + LT; var D2 = '>>'; var MM = 72 \/ 25.4; var MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; var WR = '278 278 355 556 556 889 667 191 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 278 278 584 584 584 556 1015 667 667 722 722 667 611 778 722 278 500 667 556 833 722 778 667 778 722 667 611 722 667 944 667 667 611 278 278 278 469 556 333 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 334 260 334 584'.split(' '); var WB = '278 333 474 556 556 889 722 238 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 333 333 584 584 584 611 975 722 722 722 722 667 611 778 722 278 556 722 611 833 722 778 667 778 722 667 611 722 667 944 667 667 611 333 278 333 584 556 333 556 611 556 611 556 333 611 611 278 278 556 278 889 611 611 611 611 389 556 333 611 556 778 556 556 500 389 280 389 584'.split(' '); var THEMES = { blue: { m: '#2B6CB0', t: '#EBF4FF', k: '#2B6CB0' }, green: { m: '#2F855A', t: '#F0FFF4', k: '#2F855A' }, pink: { m: '#D53F8C', t: '#FFF5F7', k: '#D53F8C' }, purple: { m: '#6B46C1', t: '#FAF5FF', k: '#6B46C1' }, teal: { m: '#2C7A7B', t: '#E6FFFA', k: '#2C7A7B' }, rainbow: { m: '#4A5568', t: '#F7FAFC', k: 'rainbow' }, mono: { m: '#1A202C', t: '#F2F2F2', k: '#1A202C' } }; var RAIN = ['#E53E3E', '#DD6B20', '#D69E2E', '#38A169', '#319795', '#3182CE', '#5A67D8', '#805AD5', '#D53F8C']; var EXAMPLES = ['Drink 8 glasses of water', 'Read 20 minutes', 'Walk 8,000 steps', 'Stretch or yoga', 'No phone after 10 pm', 'Sleep by 11 pm', 'Write 3 lines in a journal', 'Practise a skill for 15 minutes']; function clean(s) { s = String(s || '').replace(\/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]\/g, '').replace(\/[\u2190-\u2bff\ufe0f\u200d]\/g, '').replace(\/[\u2018\u2019]\/g, \"'\").replace(\/[\u201c\u201d]\/g, '\"').replace(\/[\u2013\u2014]\/g, '-').replace(\/\u2026\/g, '...').replace(\/\\s+\/g, ' ').trim(); var o = ''; for (var i = 0; s.length > i; i++) { var c = s.charCodeAt(i); var ok = false; if (c >= 32) { if (126 >= c) { ok = true; } } if (c >= 160) { if (255 >= c) { ok = true; } } o += ok ? s.charAt(i) : '?'; } return o.slice(0, 80); } function tw(s, pt, bold) { var t = bold ? WB : WR; var w = 0; for (var i = 0; s.length > i; i++) { var c = s.charCodeAt(i); var v = 556; if (c >= 32) { if (126 >= c) { v = +t[c - 32]; } } w += v; } return w \/ 1000 * pt \/ MM; } function fit(s, mm, pt, bold) { if (mm >= tw(s, pt, bold)) { return s; } while (s.length > 1) { s = s.slice(0, -1); if (mm >= tw(s + '...', pt, bold)) { return s.replace(\/\\s+$\/, '') + '...'; } } return s; } function dims(o) { var w = 210; var h = 297; if (o.paper === 'letter') { w = 215.9; h = 279.4; } if (o.orient === 'land') { var t = w; w = h; h = t; } return [w, h]; } function layout(o, mOff) { var dm = dims(o); var W = dm[0]; var H = dm[1]; var th = THEMES[o.theme] || THEMES.blue; var it = []; function R(x, y, w, h, f, s, lw, r) { it.push({ t: 'R', x: x, y: y, w: w, h: h, f: f, s: s, lw: lw, r: r }); } function C(x, y, r, f, s, lw) { it.push({ t: 'C', x: x, y: y, r: r, f: f, s: s, lw: lw }); } function L(x1, y1, x2, y2, s, lw) { it.push({ t: 'L', x1: x1, y1: y1, x2: x2, y2: y2, s: s, lw: lw }); } function T(x, y, str, pt, b, c, a) { it.push({ t: 'T', x: x, y: y, str: str, pt: pt, b: b, c: c, a: a }); } var m = 12; var days = o.days; var sd = null; var month = null; if (o.head === 'date') { var mo = o.mon + mOff; var yr = o.yr + Math.floor(mo \/ 12); mo = mo % 12; month = { y: yr, mo: mo }; days = new Date(yr, mo + 1, 0).getDate(); sd = new Date(yr, mo, 1).getDay(); } if (o.head === 'wk' || o.head === 'numwk') { sd = o.first === 'sun' ? 0 : 1; } var dark = '#1A202C'; var grey = '#4A5568'; var faint = '#A0AEC0'; var rightW = 0; if (month) { var mt = MONTHS[month.mo] + ' ' + month.y; rightW = tw(mt, 14, true); T(W - m, m + 7, mt, 14, true, dark, 'r'); } else if (o.writein) { var ml = W > H ? 50 : 32; var yx = W - m - 24; T(yx - 2, m + 7, 'Year:', 10, false, grey, 'r'); L(yx, m + 7.8, W - m, m + 7.8, faint, 0.3); var mx = yx - 2 - tw('Year:', 10, false) - 6 - ml; T(mx - 2, m + 7, 'Month:', 10, false, grey, 'r'); L(mx, m + 7.8, mx + ml, m + 7.8, faint, 0.3); rightW = W - m - mx + 2 + tw('Month:', 10, false); } T(m, m + 7, fit(o.title, W - 2 * m - rightW - 8, 20, true), 20, true, th.m, 'l'); var top = m + 13; var two = (o.head === 'numwk' || o.head === 'date'); var hh = two ? 10 : 8; var nw = Math.round(W * 0.21); var twd = o.total ? 12 : 0; var foot = 7; var nb = o.notes ? (H > W ? 34 : 24) : 0; var ng = o.notes ? 4 : 0; var rows = o.rows; var avail = H - m - foot - nb - ng - top - hh; var rh = Math.min(avail \/ rows, 14); var x0 = m; var x1 = W - m; var gx = x0 + nw; var cw = (x1 - twd - gx) \/ days; var d = Math.min(rh, cw) * 0.74; var by = top + hh + rows * rh; var blank = o.head === 'blank'; var hc = blank ? th.m : '#FFFFFF'; R(x0, top, x1 - x0, hh, blank ? th.t : th.m, null, 0, 0); T(x0 + 2.5, top + hh \/ 2 + 1.2, 'My habits', 9, true, hc, 'l'); var fs = Math.min(8, cw * 2); var fs2 = Math.min(6.5, cw * 1.7); var dows = []; var i; for (i = 0; days > i; i++) { var cx = gx + cw * (i + 0.5); var dw = sd === null ? -1 : (sd + i) % 7; dows.push(dw); var l1 = dw === -1 ? '' : 'SMTWTFS'.charAt(dw); if (o.head === 'num') { T(cx, top + hh \/ 2 + fs * 0.125, String(i + 1), fs, true, hc, 'c'); } if (o.head === 'wk') { T(cx, top + hh \/ 2 + fs * 0.125, l1, fs, true, hc, 'c'); } if (two) { T(cx, top + 3.7, l1, fs2, false, hc, 'c'); T(cx, top + hh - 2, String(i + 1), fs, true, hc, 'c'); } if (blank) { if (i > 0) { L(gx + cw * i, top + 1.5, gx + cw * i, top + hh - 1.5, faint, 0.15); } } } if (twd) { T(x1 - twd \/ 2, top + hh \/ 2 + 1, 'Total', 7.5, true, hc, 'c'); } for (var r = 0; rows > r; r++) { var ry = top + hh + r * rh; var cy = ry + rh \/ 2; if (r % 2 === 1) { R(x0, ry, x1 - x0, rh, th.t, null, 0, 0); } if (o.shade) { for (i = 0; days > i; i++) { if (dows[i] === 0 || dows[i] === 6) { R(gx + cw * i, ry, cw, rh, r % 2 === 1 ? '#E2E8F0' : '#EDF2F7', null, 0, 0); } } } var fn = Math.min(10, rh * MM * 0.42); if (o.names[r]) { T(x0 + 2.5, cy + fn * 0.125, fit(o.names[r], nw - 4.5, fn, false), fn, false, dark, 'l'); } var k = th.k === 'rainbow' ? RAIN[r % RAIN.length] : th.k; for (i = 0; days > i; i++) { var mx2 = gx + cw * (i + 0.5); if (o.shape === 'box') { R(mx2 - d \/ 2, cy - d \/ 2, d, d, '#FFFFFF', k, 0.3, d * 0.18); } else { C(mx2, cy, d \/ 2, '#FFFFFF', k, 0.3); } if (o.inner) { var ip = d * MM * 0.42; T(mx2, cy + ip * 0.125, String(i + 1), ip, false, faint, 'c'); } } if (twd) { T(x1 - 2, cy + 0.8, '\/' + days, 6.5, false, faint, 'r'); } if (rows - 1 > r) { L(x0, ry + rh, x1, ry + rh, '#CBD5E0', 0.2); } } for (i = 1; days > i; i++) { if (dows[i] === 1) { L(gx + cw * i, top + hh, gx + cw * i, by, '#CBD5E0', 0.25); } } L(gx, top + hh, gx, by, th.m, 0.3); if (twd) { L(x1 - twd, top + hh, x1 - twd, by, '#CBD5E0', 0.3); } R(x0, top, x1 - x0, by - top, null, th.m, 0.4, 0); if (o.notes) { var ny = by + ng; R(x0, ny, x1 - x0, nb, null, '#CBD5E0', 0.3, 2); T(x0 + 3, ny + 5.5, 'Notes', 9, true, th.m, 'l'); for (var ly = ny + 13; ny + nb - 3 > ly; ly += 7) { L(x0 + 3, ly, x1 - 3, ly, '#E2E8F0', 0.2); } } T(W \/ 2, H - 7, 'Free printable habit tracker maker: quickonlinetips.com\/archives\/tools\/habit-tracker\/', 7, false, faint, 'c'); return { W: W, H: H, it: it, d: d, days: days, month: month }; } var NS = 'http:' + '\/' + '\/www.w3.org\/2000\/svg'; function svgEl(tag, at) { var e = document.createElementNS(NS, tag); for (var a in at) { if (at[a] !== null) { e.setAttribute(a, String(at[a])); } } return e; } function toSvg(p) { var s = svgEl('svg', { viewBox: '0 0 ' + p.W + ' ' + p.H, role: 'img', 'aria-label': 'Preview of your printable habit tracker' }); s.style.width = '100%'; s.style.maxWidth = p.W > p.H ? '860px' : '560px'; s.style.height = 'auto'; s.style.display = 'block'; s.style.margin = '0 auto'; s.style.background = '#FFFFFF'; s.style.boxShadow = '0 2px 10px rgba(26,32,44,.18)'; p.it.forEach(function (d) { if (d.t === 'R') { var ra = { x: d.x, y: d.y, width: d.w, height: d.h, fill: d.f || 'none', stroke: d.s || 'none', 'stroke-width': d.lw || 0 }; if (d.r) { ra.rx = d.r; } s.appendChild(svgEl('rect', ra)); } if (d.t === 'C') { s.appendChild(svgEl('circle', { cx: d.x, cy: d.y, r: d.r, fill: d.f || 'none', stroke: d.s || 'none', 'stroke-width': d.lw || 0 })); } if (d.t === 'L') { s.appendChild(svgEl('line', { x1: d.x1, y1: d.y1, x2: d.x2, y2: d.y2, stroke: d.s, 'stroke-width': d.lw })); } if (d.t === 'T') { var te = svgEl('text', { x: d.x, y: d.y, 'font-size': d.pt \/ MM, 'font-family': 'Helvetica, Arial, sans-serif', 'font-weight': d.b ? 'bold' : 'normal', fill: d.c, 'text-anchor': d.a === 'c' ? 'middle' : (d.a === 'r' ? 'end' : 'start') }); te.textContent = d.str; s.appendChild(te); } }); return s; } function n(v) { var r = Math.round(v * 100) \/ 100; return r === 0 ? '0' : String(r); } function hex(c) { var v = parseInt(c.slice(1), 16); return n(Math.floor(v \/ 65536) \/ 255) + ' ' + n(Math.floor(v \/ 256) % 256 \/ 255) + ' ' + n(v % 256 \/ 255); } function pstr(s) { var o = '('; for (var i = 0; s.length > i; i++) { var c = s.charCodeAt(i); var ch = s.charAt(i); if (c === 40 || c === 41 || c === 92) { o += '\\\\' + ch; } else if (c > 126) { o += '\\\\' + ('00' + c.toString(8)).slice(-3); }  else { o += ch; } } return o + ')'; } function circ(x, y, r) { var k = 0.5523 * r; return n(x + r) + ' ' + n(y) + ' m ' + [x + r, y + k, x + k, y + r, x, y + r].map(n).join(' ') + ' c ' + [x - k, y + r, x - r, y + k, x - r, y].map(n).join(' ') + ' c ' + [x - r, y - k, x - k, y - r, x, y - r].map(n).join(' ') + ' c ' + [x + k, y - r, x + r, y - k, x + r, y].map(n).join(' ') + ' c h'; } function rrect(x, y, w, h, r) { var k = 0.5523 * r; return [n(x + r), n(y), 'm', n(x + w - r), n(y), 'l', n(x + w - r + k), n(y), n(x + w), n(y + r - k), n(x + w), n(y + r), 'c', n(x + w), n(y + h - r), 'l', n(x + w), n(y + h - r + k), n(x + w - r + k), n(y + h), n(x + w - r), n(y + h), 'c', n(x + r), n(y + h), 'l', n(x + r - k), n(y + h), n(x), n(y + h - r + k), n(x), n(y + h - r), 'c', n(x), n(y + r), 'l', n(x), n(y + r - k), n(x + r - k), n(y), n(x + r), n(y), 'c', 'h'].join(' '); } function paintOp(d) { if (d.f) { return d.s ? 'B' : 'f'; } return 'S'; } function pageStream(p) { var H = p.H; var out = []; p.it.forEach(function (d) { var g = ['q']; if (d.t !== 'T') { if (d.f) { g.push(hex(d.f) + ' rg'); } if (d.s) { g.push(hex(d.s) + ' RG'); g.push(n((d.lw || 0.2) * MM) + ' w'); } } if (d.t === 'R') { var x = d.x * MM; var y = (H - d.y - d.h) * MM; var w = d.w * MM; var h = d.h * MM; g.push(d.r ? rrect(x, y, w, h, d.r * MM) : n(x) + ' ' + n(y) + ' ' + n(w) + ' ' + n(h) + ' re'); g.push(paintOp(d)); } if (d.t === 'C') { g.push(circ(d.x * MM, (H - d.y) * MM, d.r * MM)); g.push(paintOp(d)); } if (d.t === 'L') { g.push(n(d.x1 * MM) + ' ' + n((H - d.y1) * MM) + ' m ' + n(d.x2 * MM) + ' ' + n((H - d.y2) * MM) + ' l S'); } if (d.t === 'T') { var tx = d.x; var wm = tw(d.str, d.pt, d.b); if (d.a === 'c') { tx -= wm \/ 2; } if (d.a === 'r') { tx -= wm; } g.push(hex(d.c) + ' rg'); g.push('BT \/' + (d.b ? 'F2' : 'F1') + ' ' + n(d.pt) + ' Tf ' + n(tx * MM) + ' ' + n((H - d.y) * MM) + ' Td ' + pstr(d.str) + ' Tj ET'); } g.push('Q'); out.push(g.join(' ')); }); return out.join('\\n'); } function makePdf(pages, title) { var objs = []; objs[0] = D1 + ' \/Type \/Catalog \/Pages 2 0 R ' + D2; objs[2] = D1 + ' \/Type \/Font \/Subtype \/Type1 \/BaseFont \/Helvetica \/Encoding \/WinAnsiEncoding ' + D2; objs[3] = D1 + ' \/Type \/Font \/Subtype \/Type1 \/BaseFont \/Helvetica-Bold \/Encoding \/WinAnsiEncoding ' + D2; objs[4] = D1 + ' \/Title ' + pstr(title) + ' \/Producer (QuickOnlineTips Habit Tracker Maker) \/Creator (quickonlinetips.com) ' + D2; var kids = []; pages.forEach(function (p, i) { var num = 6 + 2 * i; kids.push(num + ' 0 R'); objs[num - 1] = D1 + ' \/Type \/Page \/Parent 2 0 R \/MediaBox [0 0 ' + n(p.W * MM) + ' ' + n(p.H * MM) + '] \/Resources ' + D1 + ' \/Font ' + D1 + ' \/F1 3 0 R \/F2 4 0 R ' + D2 + ' ' + D2 + ' \/Contents ' + (num + 1) + ' 0 R ' + D2; var st = pageStream(p); objs[num] = D1 + ' \/Length ' + st.length + ' ' + D2 + '\\nstream\\n' + st + '\\nendstream'; }); objs[1] = D1 + ' \/Type \/Pages \/Kids [' + kids.join(' ') + '] \/Count ' + pages.length + ' ' + D2; var out = '%PDF-1.4\\n'; var offs = []; for (var i = 0; objs.length > i; i++) { offs.push(out.length); out += (i + 1) + ' 0 obj\\n' + objs[i] + '\\nendobj\\n'; } var xref = out.length; out += 'xref\\n0 ' + (objs.length + 1) + '\\n0000000000 65535 f \\n'; offs.forEach(function (v) { out += ('0000000000' + v).slice(-10) + ' 00000 n \\n'; }); out += 'trailer\\n' + D1 + ' \/Size ' + (objs.length + 1) + ' \/Root 1 0 R \/Info 5 0 R ' + D2 + '\\nstartxref\\n' + xref + '\\n%%EOF\\n'; return out; } ready(function () { var root = $('qt-ht'); if (!root) { return; } var now = new Date(); var rowsEl = $('qt-ht-rows'); var monEl = $('qt-ht-mon'); var j; for (j = 1; 30 >= j; j++) { var op = document.createElement('option'); op.value = String(j); op.textContent = j === 1 ? '1 habit' : j + ' habits'; rowsEl.appendChild(op); } for (j = 0; 12 > j; j++) { var om = document.createElement('option'); om.value = String(j); om.textContent = MONTHS[j]; monEl.appendChild(om); } function seg(g) { var b = root.querySelector('button[data-g=\"' + g + '\"][aria-pressed=\"true\"]'); return b ? b.getAttribute('data-v') : ''; } function setSeg(g, v) { Array.prototype.forEach.call(root.querySelectorAll('button[data-g=\"' + g + '\"]'), function (b) { b.setAttribute('aria-pressed', b.getAttribute('data-v') === v ? 'true' : 'false'); }); } function defaults() { $('qt-ht-title').value = 'My Habit Tracker'; $('qt-ht-names').value = ''; rowsEl.value = '10'; $('qt-ht-head').value = 'num'; monEl.value = String(now.getMonth()); $('qt-ht-yr').value = String(now.getFullYear()); $('qt-ht-pages').value = '1'; $('qt-ht-first').value = 'mon'; $('qt-ht-days').value = '31'; setSeg('sh', 'circle'); setSeg('pa', 'a4'); setSeg('or', 'land'); setSeg('th', 'blue'); $('qt-ht-tot').checked = true; $('qt-ht-shade').checked = true; $('qt-ht-inner').checked = false; $('qt-ht-notes').checked = false; $('qt-ht-wi').checked = true; } function opts() { var y = parseInt($('qt-ht-yr').value, 10); if (!(y >= 1900)) { y = now.getFullYear(); } if (y > 2200) { y = 2200; } var o = { title: clean($('qt-ht-title').value) || 'Habit Tracker', names: $('qt-ht-names').value.split(\/\\r?\\n\/).map(clean).filter(function (x) { return x.length > 0; }), rows: parseInt(rowsEl.value, 10) || 10, head: $('qt-ht-head').value, mon: parseInt(monEl.value, 10) || 0, yr: y, months: parseInt($('qt-ht-pages').value, 10) || 1, first: $('qt-ht-first').value, days: parseInt($('qt-ht-days').value, 10) || 31, shape: seg('sh'), paper: seg('pa'), orient: seg('or'), theme: seg('th'), total: $('qt-ht-tot').checked, shade: $('qt-ht-shade').checked, inner: $('qt-ht-inner').checked, notes: $('qt-ht-notes').checked, writein: $('qt-ht-wi').checked, cut: false }; if (o.names.length > 30) { o.cut = true; o.names = o.names.slice(0, 30); } if (o.names.length > o.rows) { o.rows = o.names.length; } return o; } function show(id, on) { $(id).style.display = on ? '' : 'none'; } function pad(v) { return (v > 9 ? '' : '0') + v; } function update() { var o = opts(); var isDate = o.head === 'date'; show('qt-ht-f-mon', isDate); show('qt-ht-f-yr', isDate); show('qt-ht-f-pages', isDate); show('qt-ht-f-days', !isDate); show('qt-ht-f-first', o.head === 'wk' || o.head === 'numwk'); show('qt-ht-f-wi', !isDate); show('qt-ht-f-shade', o.head !== 'num' ? o.head !== 'blank' : false); var p = layout(o, 0); var box = $('qt-ht-prev'); while (box.firstChild) { box.removeChild(box.firstChild); } box.appendChild(toSvg(p)); var pages = isDate ? o.months : 1; var dmm = Math.round(p.d * 10) \/ 10; var msg = 'Preview of ' + (pages > 1 ? 'page 1 of ' + pages + ' (one page per month)' : 'your page') + ': ' + o.rows + (o.rows === 1 ? ' habit' : ' habits') + ' x ' + p.days + ' days. Each ' + (o.shape === 'box' ? 'box' : 'circle') + ' prints about ' + dmm + ' mm wide: '; if (dmm >= 4.2) { msg += 'comfortable to fill in.'; } else if (dmm >= 3.2) { msg += 'small but fine with a fine-tip pen. Landscape, fewer rows or fewer days give bigger marks.'; } else { msg += 'very small. Try Landscape, fewer rows or fewer days.'; } if (o.cut) { msg += ' Only the first 30 habits fit on a page.'; } $('qt-ht-fit').textContent = msg; } function build() { var o = opts(); var pages = []; var count = o.head === 'date' ? o.months : 1; for (var i = 0; count > i; i++) { pages.push(layout(o, i)); } var name = 'habit-tracker'; if (o.head === 'date') { name += '-' + pages[0].month.y + '-' + pad(pages[0].month.mo + 1); } var blob = new Blob([makePdf(pages, o.title)], { type: 'application\/pdf' }); return { url: URL.createObjectURL(blob), name: name + '.pdf', count: count }; } var st = $('qt-ht-status'); $('qt-ht-dl').addEventListener('click', function () { var r = build(); var a = document.createElement('a'); a.href = r.url; a.download = r.name; document.body.appendChild(a); a.click(); document.body.removeChild(a); setTimeout(function () { URL.revokeObjectURL(r.url); }, 60000); st.textContent = 'Done: ' + r.name + ' (' + r.count + (r.count === 1 ? ' page' : ' pages') + ') is in your downloads. Print it at 100% or Actual size.'; }); $('qt-ht-open').addEventListener('click', function () { var r = build(); var w = window.open(r.url, '_blank'); if (!w) { st.textContent = 'Your browser blocked the new tab. Use Download PDF instead.'; } else { st.textContent = 'Opened in a new tab: use the print button there.'; } setTimeout(function () { URL.revokeObjectURL(r.url); }, 120000); }); $('qt-ht-ex').addEventListener('click', function () { var n2 = parseInt(rowsEl.value, 10) || 8; $('qt-ht-names').value = EXAMPLES.slice(0, Math.min(EXAMPLES.length, Math.max(n2, 4))).join('\\n'); update(); }); $('qt-ht-clr').addEventListener('click', function () { $('qt-ht-names').value = ''; update(); }); $('qt-ht-reset').addEventListener('click', function () { defaults(); st.textContent = ''; update(); }); root.addEventListener('click', function (e) { var b = e.target.closest ? e.target.closest('button[data-g]') : null; if (b) { setSeg(b.getAttribute('data-g'), b.getAttribute('data-v')); update(); } }); root.addEventListener('input', update); root.addEventListener('change', update); defaults(); update(); }); })();<\/script>\n<div class=\"qt-next\"><p class=\"qt-next-h\">Try another free tool<\/p><div class=\"qt-next-g\"><a href=\"https:\/\/www.quickonlinetips.com\/archives\/tools\/pomodoro-timer\/\">Pomodoro Timer<\/a><a href=\"https:\/\/www.quickonlinetips.com\/archives\/tools\/countdown-to-date\/\">Countdown to a Date<\/a><a href=\"https:\/\/www.quickonlinetips.com\/archives\/tools\/tally-counter\/\">Tally Counter<\/a><a href=\"https:\/\/www.quickonlinetips.com\/archives\/tools\/water-intake-calculator\/\">Water Intake Calculator<\/a><a href=\"https:\/\/www.quickonlinetips.com\/archives\/tools\/sleep-calculator\/\">Sleep Calculator<\/a><a href=\"https:\/\/www.quickonlinetips.com\/archives\/tools\/online-notepad\/\">Online Notepad<\/a><\/div><\/div>\n<p><strong>Quick answer:<\/strong> Enter up to 30 habits, choose what the top row shows (day numbers, weekday letters, real dates or blank boxes), pick circles or boxes, paper size, print direction and colour, then press <strong>Download PDF<\/strong>. Each day you complete a habit, fill in that day&#8217;s circle or box.<\/p>\n<h2>How to use the printable habit tracker maker<\/h2>\n<ol>\n<li><strong>Name your tracker<\/strong> and type one habit per line. Choose how many rows you want; extra rows print blank so you can add habits later.<\/li>\n<li><strong>Choose the top row.<\/strong> Day numbers work for any month. Real dates print the month name and the weekday above every date, and can make up to 12 pages, one for each month of the year. Blank boxes let you write your own dates.<\/li>\n<li><strong>Pick the look:<\/strong> circles or boxes, A4 or US Letter, landscape or portrait, and one of seven colours, including rainbow rows and an ink-saving black and white version.<\/li>\n<li><strong>Add extras<\/strong> if you want them: a Total column to count your days, shaded weekends, the day number printed inside each circle, a notes box, and Month and Year lines to fill in.<\/li>\n<li>Check the <strong>live preview<\/strong>, then press <strong>Download PDF<\/strong> and print at 100% (Actual size).<\/li>\n<\/ol>\n<h2>How many habits fit on one page?<\/h2>\n<p>The tool sizes everything to fit the page and tells you how big each circle will print. As a guide:<\/p>\n<table class=\"qt-ref\">\n<thead>\n<tr>\n<th>Paper and direction<\/th>\n<th>Days<\/th>\n<th>Habits per page<\/th>\n<th>Circle size<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Landscape (A4 or Letter)<\/td>\n<td>31<\/td>\n<td>Up to 20<\/td>\n<td>About 4.8 mm<\/td>\n<\/tr>\n<tr>\n<td>Landscape (A4 or Letter)<\/td>\n<td>31<\/td>\n<td>30<\/td>\n<td>About 3.9 mm<\/td>\n<\/tr>\n<tr>\n<td>Portrait (A4 or Letter)<\/td>\n<td>21<\/td>\n<td>Up to 30<\/td>\n<td>About 4.6 mm<\/td>\n<\/tr>\n<tr>\n<td>Portrait (A4 or Letter)<\/td>\n<td>31<\/td>\n<td>Up to 30<\/td>\n<td>About 3 mm (small)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Landscape gives the widest columns, so it is the best choice for a full month. Portrait works well for a 7, 14 or 21 day tracker, or when you want to keep the page in a ring binder.<\/p>\n<h2>Tips to make your habit tracker work<\/h2>\n<ul>\n<li><strong>Start small.<\/strong> Three to five habits are easier to keep than fifteen. You can always add more next month.<\/li>\n<li><strong>Make each habit specific<\/strong>, such as &#8220;Read 20 minutes&#8221; instead of &#8220;Read more&#8221;, so it is clear when to fill in the circle.<\/li>\n<li><strong>Keep the page where you will see it<\/strong>: on the fridge, next to your bed or inside your planner.<\/li>\n<li><strong>Do not break the chain twice.<\/strong> Missing one day is normal; try not to miss two in a row.<\/li>\n<li><strong>Use the Total column<\/strong> at the end of the month to see which habits stuck.<\/li>\n<\/ul>\n<p>How long does a habit take to form? There is no magic number. A 2009 study at University College London followed people building new daily habits and found it took an average of 66 days for a habit to feel automatic, with a wide range from person to person. That is why the tool can print 3, 6 or 12 months at once.<\/p>\n<p>Pair your tracker with the <a href=\"https:\/\/www.quickonlinetips.com\/archives\/tools\/pomodoro-timer\/\">Pomodoro timer<\/a> for focused work sessions, the <a href=\"https:\/\/www.quickonlinetips.com\/archives\/tools\/water-intake-calculator\/\">water intake calculator<\/a> to set a drinking goal, or the <a href=\"https:\/\/www.quickonlinetips.com\/archives\/tools\/sleep-calculator\/\">sleep calculator<\/a> to pick a bedtime habit.<\/p>\n<h2>FAQ<\/h2>\n<h3>Is this habit tracker really free?<\/h3>\n<p>Yes. You can make and print as many habit trackers as you like, with no sign-up and no watermark on your habits. A small footer line shows where the tracker was made.<\/p>\n<h3>Can I make a 30 day habit tracker or a monthly habit tracker?<\/h3>\n<p>Yes. Choose 30 or 31 days for a monthly tracker that works in any month, or choose Real dates to print the exact days and weekdays of a month you pick.<\/p>\n<h3>Can I print a habit tracker for the whole year?<\/h3>\n<p>Choose Real dates, pick the starting month and choose 12 months. You get one PDF with a page for each month.<\/p>\n<h3>Can I use it on my tablet instead of paper?<\/h3>\n<p>Yes. The PDF opens in any note-taking app that lets you write on PDFs, so you can fill in the circles with a stylus.<\/p>\n<h3>Why are some symbols missing from my habit names?<\/h3>\n<p>The PDF uses a standard print font that covers English and Western European letters, including accents. Emoji are left out, and letters from other alphabets print as a question mark, so keep habit names in plain letters.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Make your own free printable habit tracker in a minute. Type the habits you want to build (or leave the rows blank to write in by hand), choose circles or boxes, pick 7 to 31 days or the real dates of any month, and download a clean PDF that prints on A4 or US Letter&#8230;<\/p>\n","protected":false},"author":7,"featured_media":0,"parent":65595,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"class_list":["post-69984","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.quickonlinetips.com\/archives\/wp-json\/wp\/v2\/pages\/69984","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.quickonlinetips.com\/archives\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.quickonlinetips.com\/archives\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.quickonlinetips.com\/archives\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/www.quickonlinetips.com\/archives\/wp-json\/wp\/v2\/comments?post=69984"}],"version-history":[{"count":0,"href":"https:\/\/www.quickonlinetips.com\/archives\/wp-json\/wp\/v2\/pages\/69984\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.quickonlinetips.com\/archives\/wp-json\/wp\/v2\/pages\/65595"}],"wp:attachment":[{"href":"https:\/\/www.quickonlinetips.com\/archives\/wp-json\/wp\/v2\/media?parent=69984"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}