Heatmap TrackerContribution graph

A GitHub-style contribution graph in Obsidian

Same grid, different data. One square per day, colour for how much, and every square links to the note behind it — built from frontmatter in your own vault.

GitHub's contribution graph works because it answers one question instantly: did I show up, and for how long did I keep it up. Heatmap Tracker draws the same grid from your Obsidian notes — 53 columns, seven rows, one square per day — for whatever it is you actually want to keep up.

What carries over from GitHub

  • One square per day, weeks as columns, the year on one screen.
  • Colour intensity standing in for "how much", not just "yes".
  • Streaks and gaps visible at a glance, with no counting.

What is different

  • The data is yours. Any frontmatter key in any note, not commits in a repository.
  • Squares are links. Click one to open the note behind that day, or create it.
  • The scale is configurable. GitHub buckets by commit count; here you set scaleStart and scaleEnd so the colours spread over the range you care about.
  • It is local. Nothing leaves the vault — no account, no sync, no telemetry.
  • It exports. The grid plus each day's note content can be written out as a Markdown or self-contained HTML report.

Building one

Put a number in a dated note:

daily notes/2026-09-19.md
---
words: 1240
---

Then drop the codeblock anywhere:

Writing.md
```heatmap-tracker
property: words
```

That is the whole setup. The grid opens on the current year; the arrows move between years, and year: 2025 pins it.

Tracking actual commits

If what you want really is a code contribution graph inside your vault, log the number somewhere dated — a daily note field written by a script, for instance — and point the codeblock at it. The plugin does not talk to GitHub's API; it reads your notes, which keeps it working offline and on mobile.

Shaping the grid

Option Effect
separateMonths Adds padding between months so boundaries are unmistakable.
layout: "monthly" Swaps the year grid for one row per month, days 1–31 as columns. Use "month" or "week" for a single calendar period instead.
monthsToShow Shows only the last N months — good for a dashboard.
startDate + endDate An explicit window, including ranges that cross a year boundary.
colorScheme.customColors Your own colour ramp for this one heatmap.
showCurrentDayBorder Outlines today's square.

Week numbers, the first day of the week and the font are plugin-wide settings rather than per-heatmap options.

Sharing the year

The Export tab renders the same grid pixel-for-pixel into a report, then walks every week in range and pulls in each day's note content underneath it. You choose the range, the legend labels, whether weeks run as columns or rows, and whether to save Markdown or a self-contained HTML file. It is the difference between showing a manager a calendar and showing them what happened.

Compared with heatmap-calendar

Heatmap Tracker began as a rewrite of heatmap-calendar-obsidian. The original is lighter and needs a dataviewjs script for every heatmap. Heatmap Tracker adds the no-code codeblock, an insert-modal, statistics and custom insights, the monthly layout, flexible date ranges, export, and nine UI languages. If all you need is one scripted year grid, the original still does that.

Get the plugin

Heatmap Tracker is a free, open-source Obsidian community plugin. Install it from Settings → Community plugins → Browse, or open the plugin page directly.

Install Heatmap Tracker Source on GitHub