A tracker for a mossaic contribution-art plan. There is no code here: one workflow asks GitHub what has actually been contributed, compares it against the plan, and posts the report to issue #1.
The schedule is currently off. The cron block in
track.yml is commented out, so the tracker
reports only when it is dispatched by hand from the Actions tab.
The plan being tracked:
| picture | heart.art — 7 rows × 11 columns |
| year | 2026 |
| placement | from week 39: Sunday 27 September to 12 December |
| shades | 0 and 2 — empty, and a mid green |
| timezone | Asia/Ho_Chi_Minh |
·████·████·
███████████
███████████
███████████
·█████████·
···█████···
·····█·····
56 days at 36 contributions each — 2,016 in total — and 21 days inside the picture that have to stay dark. The last lit day falls on 25 November, which leaves thirty-six days of slack before the year does: a plan that lands on 31 December has no room for a week of illness.
It does not start in the week this plan was made. That week already had contributions on it, and the picture's top-left corner is dark, so starting there would have opened with a hole that nothing takes away. The first column a picture can have is the first one still entirely in the future.
It started at week 35, moved to 37 on 6 September 2026, and to 39 on 21 September, which is the one edit the rule below is meant to prevent, so it is worth recording why — twice, for the same reason.
Week 35 began on 30 August, and in the days between the plan being made and
that week arriving, five days inside the picture picked up ordinary
contributions — four of them on days the heart needs dark. Nothing takes a
contribution away, so the plan was not behind, it was holed: it could not
be drawn cleanly at that placement however much was contributed afterwards.
Week 37 was the earliest placement that holed nothing on 6 September. It was not merged that day, and by 21 September it was holed too — four days brighter than the picture wants — and so was 38, by one day. That is the failure repeating rather than a new one: a placement is only in the future until it isn't, and the gap between choosing one and landing it is enough. Week 39 is the earliest that holes nothing today. The numbers in reports from before each move describe a different plan and are not comparable.
The plan is those inputs. Changing start-week mid-year compares against a
different plan and reports nonsense confidently, so it stays fixed until the
year is over. The report prints the placement it used in its header — ### Heart · 2026 · week 39, 11 columns — and the action exposes it as the start-week and
columns outputs; if either ever changes, so did the plan.
A letter is five rows on Mon–Fri, two shades, and it has to fit the 5×5 font.
This is seven rows — the weekend included — eleven columns, and any of
GitHub's shades per day. matrix: points the action at the .art file in this
repository, which is why the workflow now checks out the repo before running.
GitHub's five greens are not evenly spaced. Every adjacent pair is 9–20 ΔE apart in the worst palette it ships, which is close enough to read as one colour — so a picture using all five puts near-identical greens side by side however carefully it is drawn. Level 0 against level 2 is ΔE 50: unmistakable.
It is also what makes this affordable. This graph's 2026 peak is 137, so a level-4 day costs 110 contributions and a level-2 day costs 37. The same heart in bright green would owe about 4,400 contributions instead of 1,960 — four times this account's existing daily pace rather than roughly matching it.
Exactly the four steps in mossaic's action guide:
- A public repository — free Actions minutes, nothing else in it.
.github/workflows/track.yml, copied fromtrack.example.ymlwith thewith:block edited.- No secrets. The issue-comment route needs none; the Slack, Discord,
email and auto-commit steps are in the file but gated behind repository
variables (
SLACK_ENABLED,DISCORD_ENABLED,EMAIL_ENABLED,AUTO_COMMIT_ENABLED), so turning one on is a switch rather than an edit. - Run once by hand from the Actions tab (with optional
auto_commitcheckbox), rather than waiting for tomorrow.
The action is pinned to vyncint/mossaic/action@v0.7.0, not @main, so it
changes when I say so. matrix: arrived in 0.6.0.
- A scheduled workflow in a public repository is disabled after 60 days without commits. GitHub emails first. A repository whose only job is a daily cron will hit this; push something occasionally, or re-enable it from the Actions tab. Moot while the cron above is commented out, and waiting for you again the day it is restored.
cronis UTC, always.0 1 * * *is 08:00 in UTC+7. That is whytimezone:is set — otherwise the day the report calls "today" disagrees with the day the graph shades.
drawn means finished. reachable means there is work left but nothing in
the way. holed means days inside the picture are already brighter than it
wants, and nothing takes a contribution away — the heart would read with holes
in it.
For a picture that is two kinds of damage rather than one: a day meant to stay dark that has any contribution at all, and a day meant to be level 2 that has crept past 73 and would render as level 4. Both are permanent. The plan starts today precisely so that neither has had a chance to happen yet — every day it covers is still in the future.