Tamart Nola

var d=document,w="https://tally.so/widgets/embed.js",v=function(){"undefined"!=typeof Tally?Tally.loadEmbeds():d.querySelectorAll("iframe[data-tally-src]:not([src])").forEach((function(e){e.src=e.dataset.tallySrc}))};if("undefined"!=typeof Tally)v();else if(d.querySelector('script[src="'+w+'"]')==null){var s=d.createElement("script");s.src=w,s.onload=v,s.onerror=v,d.body.appendChild(s);}

Pour tracker

Loading…

– / 83 rounds

    Thin line on each bar = where you need to be by the end of this week.

    (function(){ /* Paste your published Google Sheet CSV link between the quotes below */ var CSV_URL = "https://docs.google.com/spreadsheets/d/e/2PACX-1vTa0hfG7dPSBHH4OKtR5WEc6GMaV9S5uB2tCunJgKAO27BfyHV8KKPzOeA7Z6MG1AxfiVQ9vfnFP-Kk/pub?output=csv"; /* Rounds per week: Sep 21, Sep 28, Oct 5, Oct 12 */ var PLAN = [ ["Small single",[2,2,2,2]], ["Small double",[2,2,2,1]], ["Medium",[3,2,2,2]], ["Two-story",[2,1,1,1]], ["Small streetcar",[1,1,1,0]], ["Small cathedral",[2,1,1,1]], ["Large shotgun",[2,2,2,1]], ["XL shotgun",[2,2,2,1]], ["Center hall",[1,1,1,1]], ["Large streetcar",[2,2,2,1]], ["Large cathedral",[2,1,1,1]], ["XL cathedral",[2,2,1,1]], ["French Quarter",[3,3,2,2]] ]; var WEEK_STARTS = ["2026-09-21","2026-09-28","2026-10-05","2026-10-12"]; var CUTOFF = new Date("2026-10-17T23:59:59"); function sum(a){ var t=0; a.forEach(function(x){t+=x;}); return t; } function weekIndex(){ var now = new Date(), idx = 0; WEEK_STARTS.forEach(function(d,i){ if (now >= new Date(d+"T00:00:00")) idx = i; }); return idx; } function parseCSV(t){ var QT=String.fromCharCode(34),NL=String.fromCharCode(10),CR=String.fromCharCode(13); var rows=[],row=[],f="",q=false,i=0; while (t.length > i){ var c=t.charAt(i); if(q){ if(c==QT){ if(t.charAt(i+1)==QT){f+=QT;i++;} else q=false; } else f+=c; } else if(c==QT) q=true; else if(c==","){ row.push(f); f=""; } else if(c==NL||c==CR){ if(c==CR&&t.charAt(i+1)==NL) i++; row.push(f); rows.push(row); row=[]; f=""; } else f+=c; i++; } if(f!==""||row.length){ row.push(f); rows.push(row); } return rows; } function norm(s){ return String(s||"").trim().toLowerCase(); } var truthy = {"true":1,"yes":1,"1":1,"x":1,"checked":1}; function count(rows){ var names = PLAN.map(function(p){return norm(p[0]);}); var counts = {}; names.forEach(function(n){counts[n]=0;}); var head = (rows[0]||[]).map(norm); rows.slice(1).forEach(function(r){ var seen = {}; r.forEach(function(cell,j){ cell.split(",").forEach(function(tok){ tok=norm(tok); if(counts.hasOwnProperty(tok)) seen[tok]=1; }); var h = head[j]||""; if (truthy[norm(cell)]) names.forEach(function(n){ if(h==n || h.indexOf("("+n+")")!=-1 || h.slice(-n.length)==n) seen[n]=1; }); }); Object.keys(seen).forEach(function(n){counts[n]++;}); }); return counts; } function el(tag, cls, text){ var e=document.createElement(tag); if(cls) e.className=cls; if(text!=null) e.textContent=text; return e; } function render(counts){ var wk = weekIndex(), list = document.getElementById("tmt-list"), all=0; list.textContent = ""; PLAN.forEach(function(p){ var name=p[0], w=p[1], total=sum(w), target=sum(w.slice(0,wk+1)); var done=Math.min(counts[norm(name)]||0,total); all+=done; var left=Math.max(0,target-done), finished = done>=total; var li=el("li", finished?"done":""); var row=el("div","tmt-row"); row.appendChild(el("span","tmt-name",name)); row.appendChild(el("span","tmt-count",done+" / "+total)); var bar=el("div","tmt-bar"), fill=el("div","tmt-fill"); fill.style.width=(done/total*100)+"%"; bar.appendChild(fill); if(!finished){ var tick=el("div","tmt-tick"); tick.style.left="calc("+(target/total*100)+"% - 1px)"; bar.appendChild(tick); } var status = finished ? "All rounds poured" : left ? left+" left this week" : "Done for this week"; li.appendChild(row); li.appendChild(bar); li.appendChild(el("div","tmt-status"+(left&&!finished?" left":""),status)); list.appendChild(li); }); document.getElementById("tmt-done").textContent = all; document.getElementById("tmt-all").style.width = (all/83*100)+"%"; var days = Math.max(0, Math.ceil((CUTOFF - new Date())/864e5)); var sub=document.getElementById("tmt-sub"); sub.className="tmt-sub"; sub.textContent = "Week "+(wk+1)+" of 4, "+days+" day"+(days==1?"":"s")+" until pouring wraps Oct 17"; } function load(){ fetch(CSV_URL+(CSV_URL.indexOf("?")!=-1?"&":"?")+"t="+Date.now()) .then(function(r){ if(!r.ok) throw 0; return r.text(); }) .then(function(t){ render(count(parseCSV(t))); }) .catch(function(){ render({}); var s=document.getElementById("tmt-sub"); s.textContent="Could not read the sheet. Check that it is published to the web as CSV and the link is pasted in."; s.className="tmt-sub tmt-err"; }); } load(); setInterval(load, 60000); })();