Heatmap Tracker

by Maksim Rubanau
5
4
3
2
1
Score: 71/100

Description

Category: Data Visualization

The Heatmap Tracker plugin is a powerful tool for visualizing data over a calendar year in Obsidian. With this plugin, you can create customizable heatmaps to track habits, project progress, and other important data points. The plugin offers a range of features, including yearly heatmap visualization, interactive navigation, and flexible data entries with tooltips. You can also define your own color schemes and intensity ranges to match your data's theme. Additionally, the plugin allows for monthly separation options and highlights the current day for easy identification.

Reviews

  • Maxim Rubanov
    Reviewed on Dec 10th, 2025
    No review text provided.

Stats

234
stars
52,409
downloads
21
forks
677
days
2
days
12
days
52
total PRs
1
open PRs
11
closed PRs
40
merged PRs
63
total issues
3
open issues
60
closed issues
259
commits

Latest Version

13 days ago

Changelog

Added

  • All eight non-English locales are now complete: 540 missing strings translated across German, Spanish, French, Hindi, Polish, Portuguese, Russian and Chinese. The export/report panel, the in-app documentation view and every validation error message previously rendered in English regardless of the selected language, because i18n.t silently falls back to English for a missing key — a locale drifting behind en.json was only visible to someone who reads that language. A test now fails when any locale lacks a key English has.
  • The ui object is documented in the README's configuration reference. ui.hideTabs, hideYear, hideTitle, hideSubtitle, showWeekNums and defaultView all worked but appeared nowhere outside the schema, so they were undiscoverable unless you read the source or the create dialog.

README file from

Github

Turn any dated note into a beautiful, interactive heatmap — habits, workouts, mood, finances, work logs, anything.

Obsidian downloads Latest release CI License Stars Issues PRs welcome

Website · Install · Quick start · Configuration · Export · FAQ · Example vault


What it does

You already write things down in Obsidian. Heatmap Tracker reads those notes and turns them into a year-at-a-glance grid — the kind you know from GitHub's contribution graph, but for your data, in your vault, with no account and no cloud.

Add steps: 8420 to a daily note and you get a heatmap. Add mood: 4 and you get another. Every filled square is clickable and opens the note behind it; every empty square offers to create it.

  • Zero-config for frontmatter. Run Insert Heatmap Tracker, fill in a form with a live preview, done — no YAML, no JavaScript. Every heatmap stays editable from the same form.
  • Fully scriptable when you need it. A dataviewjs escape hatch gives you complete control over the dataset.
  • Everything stays local. Your notes are the database.

📋 Table of contents


📥 Install

  1. Open Settings → Community plugins and make sure Restricted mode is off.
  2. Click Browse, search for “Heatmap Tracker”.
  3. Click Install, then Enable.

Or open this link from inside Obsidian: Install Heatmap Tracker.

Install Dataview (required)

Heatmap Tracker uses Dataview to read data out of your notes. Install and enable it the same way. For the dataviewjs examples below, also enable Dataview → Settings → Enable JavaScript Queries.

Manual install

  1. Download main.js, styles.css and manifest.json from the latest release.
  2. Put them in <your-vault>/.obsidian/plugins/heatmap-tracker/.
  3. Reload Obsidian and enable the plugin in Community plugins.

Beta versions via BRAT

Install BRAT, then run BRAT: Add a beta plugin for testing and enter mokkiebear/heatmap-tracker.

Requirements: Obsidian 1.4.0+, desktop and mobile, Dataview plugin.


🚀 Quick start

1. Put a value in a daily note. In 2026-08-04.md:

---
steps: 8420
---

Numbers work (steps: 8420), and so do booleans — meditated: true simply counts as 1.

2. Add the heatmap — use the modal. Run Insert Heatmap Tracker from the command palette, or click the Heatmap Tracker icon in the left ribbon. This is the recommended way to use the plugin: the form has a live preview, tells you how many notes currently match, and writes the codeblock for you. Everything beyond the essentials is tucked into collapsed sections, so you only see what you need.

Changed your mind later? Hover any rendered heatmap and click the pencil in its corner — the same form reopens with that heatmap's settings and rewrites its codeblock on save. No hand-editing YAML.

If you'd rather write it by hand, the codeblock is plain YAML:

```heatmap-tracker
property: steps
```

3. That's it. Switch years with the arrows, hover a square for details, click one to open the note.

[!TIP] The Example Vault is a full working vault you can open in Obsidian — copy-pasteable examples for every parameter, plus ready-made trackers for habits, mood, sleep, water intake and projects. It's updated often.


💡 Use cases

Track Frontmatter Why a heatmap helps
🏃 Fitness exercise: 45 Spot the weeks you skipped, not just the total
🧘 Habits meditated: true Streaks become visible — and hard to break
😴 Sleep hours-slept: 7.5 See the slow drift before it becomes a problem
🙂 Mood mood: 4 Correlate bad stretches with what else was happening
💰 Finance spent: 120 A year of spending on one screen
📚 Reading pages-read: 30 Small daily numbers add up visibly
💧 Water intake water: 6 Zero-effort adherence check
💼 Work log hours: 8 Export it as a report for your manager
🤕 Symptoms headache: 3 Bring a real timeline to your doctor
✅ Projects tasks-done: 5 Momentum, not just a burn-down

Every one of these has a working example in the Example Vault.


🧩 Codeblock usage

The heatmap-tracker codeblock handles frontmatter tracking out of the box. The Insert Heatmap Tracker modal writes and edits it for you — the reference below is for anyone who prefers typing YAML, or wants to know what the modal produces.

Single property

```heatmap-tracker
property: exercise
```

This looks for exercise in your notes and lights up a square wherever it's set.

Multiple properties

```heatmap-tracker
property: [running, cycling, swimming]
```

Values from all listed properties are aggregated into one heatmap.

Narrowing down which notes count

path, tags and filters are all optional and can be combined:

```heatmap-tracker
property: exercise
path: "daily notes"
tags: [journal]
filters:
  - property: status
    operator: equals
    value: done
```
Parameter Description
property Frontmatter key (or array of keys) to read. Required.
path Folder to search in. Unset → falls back to your Daily Notes folder, then the whole vault.
tags Only include notes with at least one of these tags (leading # optional).
filters Extra frontmatter conditions. All must match.

Each filters entry takes:

  • property — the frontmatter key to check.
  • operator — equals, contains, or notEmpty.
  • value — compared against the property's value (not needed for notEmpty).

⚙️ Advanced usage (dataviewjs)

When you need full control over the dataset — computed values, external sources, custom colors per entry — use a dataviewjs codeblock:

```dataviewjs
// Update this object
const trackerData = {
    entries: [],
    separateMonths: true,
    heatmapTitle: "This is the title for your heatmap",
    heatmapSubtitle: "This is the subtitle for your heatmap. You can use it as a description.",
}

// Path to the folder with notes
const PATH_TO_YOUR_FOLDER = "daily notes preview/notes";
// Name of the parameter you want to see on this heatmap
const PARAMETER_NAME = 'steps';

// You need dataviewjs plugin to get information from your pages
for (let page of dv.pages(`"${PATH_TO_YOUR_FOLDER}"`).where((p) => p[PARAMETER_NAME])) {
    trackerData.entries.push({
        date: page.file.name,
        // Use absolute file path so clicks open the exact note
        // (matters when several notes share a name)
        filePath: page.file.path,
        intensity: page[PARAMETER_NAME],
    });
}

// Optional: set base path so new files are created here if missing
trackerData.basePath = PATH_TO_YOUR_FOLDER;

renderHeatmapTracker(this.container, trackerData);
```

How clicking a square resolves a file

  1. If the entry has filePath (page.file.path), that exact file opens. Missing? The plugin offers to create it at the same path.
  2. Otherwise, if trackerData.basePath is set, it proposes creating/opening basePath/YYYY-MM-DD.md.
  3. Otherwise it falls back to your Daily Notes settings (folder + format) via the Daily Notes API.

The note opens in the active tab; Cmd/Ctrl + click opens it in a new one, as elsewhere in Obsidian.

[!NOTE] dataviewjs requires Dataview → Settings → Enable JavaScript Queries. The plugin also works standalone with any JavaScript that can build an entries array — Dataview is just the most convenient source.


🔁 Migrating from Heatmap Calendar

Coming from the unmaintained heatmap-calendar plugin? There is nothing to migrate:

  1. Install Heatmap Tracker.
  2. Disable Heatmap Calendar.

Your existing renderHeatmapCalendar(...) blocks keep working — Heatmap Tracker provides that function too and maps calendarData onto its own options. Named palettes from the old plugin's settings are read as well, so colors: "blue" still resolves.

Two differences worth knowing:

  • Per-entry color is ignored. It named a whole color ramp, and which shade a day got was only decided after intensity mapping; those days now use the main palette. Use customColor: "#ff0000" for a fixed per-day color.
  • defaultEntryIntensity, intensityScaleStart and intensityScaleEnd still work, but the current names are intensityConfig.defaultIntensity, .scaleStart and .scaleEnd.

Rewriting a block as renderHeatmapTracker(this.container, trackerData) gets you the rest: statistics, legend, month/week layouts, clickable squares.


📖 Configuration reference

The authoritative reference for every trackerData parameter. Each one links to a copy-pasteable example in the Example Vault.

At a glance

Parameter Type Default
year number current year
heatmapTitle string | number undefined
heatmapSubtitle string | number undefined
colorScheme object { paletteName: "default", customColors: [] }
entries array []
showCurrentDayBorder boolean true
intensityConfig object see below
basePath string undefined
separateMonths boolean true
disableFileCreation boolean false
insights array []
ui object see below
layout "default" | "monthly" | "month" | "week" "default"
monthsToShow / daysToShow / startDate + endDate number / string undefined

year

  • Type: number
  • Default: Current year (new Date().getFullYear())
  • Description: The year the heatmap displays by default.
  • Example: year

heatmapTitle

  • Type: string | number
  • Default: undefined
  • Description: Title displayed above the heatmap. Supports HTML for custom styling.
  • Example: heatmapTitle

heatmapSubtitle

  • Type: string | number
  • Default: undefined
  • Description: Subtitle/description displayed under the title. Supports HTML for custom styling.
  • Example: heatmapSubtitle

colorScheme

  • Type: object
  • Default:
{
  paletteName: "default",
  customColors: []
}
  • Description: The color scale used to represent intensity levels. Each color maps to a range of data intensity. Use paletteName to reference a palette defined in plugin settings, or customColors to pass your own array of colors inline.
  • Example: colorScheme

customColor

  • Type: string
  • Default: undefined
  • Description: An entry property (set on an item inside entries, not on trackerData itself). Sets the color for that specific entry, overriding colorScheme.

entries

  • Type: array
  • Default:
[
  { date: "1900-01-01", customColor: "#7bc96f", intensity: 5, content: "" }
]
  • Description: The list of data points. Each entry supports:
Field Description
date Date of the entry (ISO string, YYYY-MM-DD — see Accepted date formats)
intensity Data intensity for that date
content Optional tooltip / note text
customColor Overrides the color for this entry
emoji A short glyph drawn inside the box, e.g. "✅" (max 8 chars) — see Emoji habit tracking
filePath Absolute path to the file opened on click
customHref Custom URL to open on click (takes precedence over filePath)
Accepted date formats

date is parsed by the plugin itself, so a note renders identically on desktop, iOS and Android. Accepted:

Format Example
YYYY-MM-DD / YYYY/M/D (recommended) 2025-01-31
ISO timestamp — the calendar date wins, any time or offset is ignored 2025-01-31T23:59:59-05:00
Month-first numeric, year last 01-31-2025, 1/31/2025, 01.31.2025
Day-first numeric, when the first number can't be a month 31-01-2025
English month names Jan 31, 2025, 31 January 2025

Anything else (March 2025, 31.01.25, a raw Date object) is rejected and the entry is dropped. Prefer YYYY-MM-DD: 01-02-2025 is read as January 2nd, which is not what a European reader means by it.

Emoji habit tracking

Set emoji on an entry to draw a glyph inside that day's box. The box keeps its palette color, so "which habit" and "how much" are readable at the same time — useful for yes/no habits where a color gradient says little.

const trackerData = {
  entries: [],
  heatmapTitle: "Habits",
  colorScheme: { customColors: ["#c6e48b", "#7bc96f", "#239a3b"] },
};

for (const page of dv.pages('"Daily"').where(p => p.workout || p.reading)) {
  trackerData.entries.push({
    date: page.file.name,
    intensity: 1,
    emoji: page.workout ? "🏃" : "📖",
    filePath: page.file.path,
  });
}

renderHeatmapTracker(this.container, trackerData);

Notes:

  • Keep it to one glyph. The box is 12px by default, so the value is capped at 8 characters and validation rejects longer strings rather than drawing unreadable pixels. Use content for text.

  • emoji and content are different fields, and complement each other. emoji is the marker; content is what happened that day. Only content reaches the exported report and screen readers, so a glyph put in content becomes a lone "✅" in your report, while an emoji leaves the report free for the real note text:

    { date: "2025-01-01", emoji: "🏃", content: "5km, felt good" }
    // box shows 🏃 · report says "5km, felt good"
    
  • Two entries on one day: only one glyph fits, so the first emoji set for that day is the one drawn.

  • Any text works, not just emoji — "✓", "x" and "1" are all valid, and monochrome glyphs get a subtle outline so they stay legible on dark palette colors.

  • The glyph is decorative: screen readers announce the date and value from the box's own label and skip it.


showCurrentDayBorder

  • Type: boolean
  • Default: true
  • Description: Highlights today's square with a border.
  • Example: showCurrentDayBorder

intensityConfig

  • Type: object
  • Default:
{
  scaleStart: undefined,
  scaleEnd: undefined,
  defaultIntensity: 4,
  showOutOfRange: true,
  excludeFalsy: undefined,
  aggregation: "sum"
}
  • Description: Configures how entry values map to colors.
Field Description
scaleStart / scaleEnd Min/max of the intensity scale. Useful for a custom range — e.g. tracking reading time only between 30 minutes and 2 hours.
defaultIntensity Intensity assigned to entries that don't specify one.
showOutOfRange Whether entries outside the scale are still shown (clamped) or hidden.
excludeFalsy When true, entries with falsy intensity (0, undefined, null, false) are excluded and don't break streaks.
aggregation How a day is scored when several values feed into it — several tracked properties, or several entries on the same date. "sum" (default) adds them; "average" divides by how many values were actually present.

aggregation: "average" is for days scored on a rating rather than a total. Tracking hunger-morning and hunger-evening, each 1–10, a day with only a morning entry of 6 sums to 6 out of a possible 20 and renders almost empty; averaged, it scores 6 — the same shade as a day where both readings were 6. Only the values that exist count towards the divisor, so a missing entry doesn't drag the day down:

```heatmap-tracker
property:
  - hunger-morning
  - hunger-evening
intensityConfig:
  aggregation: average
  scaleStart: 1
  scaleEnd: 10
```

Keep the default "sum" for anything cumulative (minutes practised, pages read, steps) — there, two entries on one day genuinely are more than one.

[!IMPORTANT] Migrating from defaultEntryIntensity / intensityScaleStart / intensityScaleEnd: these top-level parameters are removed from the API described here. Old codeblocks keep working (they're folded into intensityConfig automatically), but new heatmaps should use intensityConfig directly.


basePath

  • Type: string
  • Default: undefined
  • Description: Base folder used to collect entries. When set, the plugin proposes creating new files here when you click an empty square.
  • Example: basePath

separateMonths

  • Type: boolean
  • Default: true
  • Description: Whether months are visually separated within the heatmap layout.
  • Example: separateMonths

disableFileCreation

  • Type: boolean
  • Default: false
  • Description: When true, clicking an empty square will not offer to create a new file.
  • Example: disableFileCreation

insights

  • Type: array
  • Default: []
  • Description: Define your own calculated metrics, displayed in the Statistics tab — most productive day, longest streak, total pages read, average sleep, and anything else you can compute.
  • Example: insights · 8 ready-made insights

ui

  • Type: object
  • Default: { defaultView: "heatmap-tracker", hideTabs: false, hideYear: false, hideTitle: false, hideSubtitle: false }
  • Description: Per-heatmap chrome. Each key hides a part of the header, or picks which tab opens first — useful for embedding a bare grid in a dashboard note.
Key Type Description
defaultView "heatmap-tracker" | "heatmap-tracker-statistics" | "legend" | "documentation" | "export" Which tab is shown when the note opens.
hideTabs boolean Hides the tab strip entirely.
hideYear boolean Hides the year and the arrows that page through years.
hideTitle boolean Hides heatmapTitle.
hideSubtitle boolean Hides heatmapSubtitle.
showWeekNums boolean Shows week numbers under the grid. Overrides the plugin-wide setting for this heatmap only.
ui:
  hideTabs: true
  hideYear: true

layout

  • Type: "default" | "monthly" | "month" | "week"

  • Default: "default"

  • Description: Controls the grid arrangement.

    • "default" — the traditional GitHub-style week-column grid.
    • "monthly" — one row per month with days 1–31 as columns; a compact, calendar-style year.
    • "month" — a single calendar month: weekdays as columns, weeks as rows. Shows the current month by default; the header arrows page through months.
    • "week" — a single calendar week: one row of seven days. Shows the current week by default; the header arrows page through weeks.

    "month" and "week" respect the weekStartDay plugin setting. Setting a date range (startDate/endDate, daysToShow, monthsToShow) pins them to that range and hides the arrows.

  • Example: layout


Date range: monthsToShow, daysToShow, startDate/endDate

These four parameters narrow which dates are displayed instead of the full year. They apply to every layout, including the default week-column grid — which then starts at the range's first day and ends at its last, rather than drawing the whole calendar year. Only one wins when several are set — they resolve in this order (highest priority first):

  1. monthsToShow (number, default undefined) — current month plus the N previous months. monthsToShow: 3 displays 4 rows (current month + 3 prior). Best paired with layout: "monthly".
  2. daysToShow (number, default undefined) — the last N days ending today. daysToShow: 365 with the default layout gives a rolling year ending on the current week, GitHub-style.
  3. startDate + endDate (string, YYYY-MM-DD, default undefined) — an explicit range. Both must be set, and startDate must not be after endDate.

If none are set, the heatmap shows the full year.

This precedence is implemented once, in resolveDateRange — that function's doc comment is the source of truth if this section and the code ever disagree.


📤 Export a report

Every heatmap has an Export tab alongside Heatmap Tracker / Statistics / Legend / Documentation. It turns your tracked data and daily notes into a single shareable report — a status update, a work log for a manager, an end-of-year summary — sitting between a bare calendar (too little context) and a folder of raw notes (too much noise).

Note content, aggregated. Below the calendar and legend, the report walks every week and day in range and pulls in that day's own note content — frontmatter stripped, bullet points kept as written, a day with no note showing - — grouped under "Week of …" and per-day headings. The reader gets everything that actually happened, day by day, in one document instead of clicking through each note.

Layout. "Weeks as columns" or "Weeks as rows", rendered pixel-for-pixel like the heatmap itself — including exact day-level month splitting (with a year label whenever the range crosses a year boundary) and, when a range is too wide or tall for one grid, automatic wrapping into multiple bands, evenly split rather than front-loading one band and leaving a small leftover.

Date range. Pick start/end dates directly, or jump to a range with a preset: Logged (the full span of your tracked data), Last year, Year to date, Last month, or Month to date.

Display options. Which day the week starts on, whether to show each week's start date, splitting the grid by month, month labels, and hiding weekends.

Legend editor. Colors are pre-populated from what's actually used in your data, so you only fill in what each one means. Reorder entries by drag-and-drop and toggle each category's visibility — shown everywhere, summary-only, or hidden entirely. Optionally combine the intensity colors into a single gradient swatch with one shared label and count, instead of a row per color.

Summary line. A compact, customizable breakdown like Workday: 22 · Leave: 1 · Rest day but worked: 1 with a total (e.g. Total hours: 169) — or hide the breakdown, the total, or all values entirely.

Output. Save as a Markdown note or a self-contained HTML file, to whichever folder in your vault you choose.

All of these preferences persist across sessions, so you only set them up once.


📦 Features

Only the essentials are shown up front (properties to track, folder, title); filtering, layout, appearance, intensity and visibility live in collapsed sections.

Every rendered heatmap has a pencil button in its corner: it reopens the same form pre-filled from that codeblock and rewrites it on save.

  1. Create your own palette in plugin settings (or use the default).
  2. Use customColors in colorScheme to set colors for one specific heatmap.
  3. Use customColor on an individual entry.
  • The most productive day
  • The longest streak without breaks
  • The most active month
  • Your average daily intensity

See insights documentation and 8 worked examples.


❓ FAQ & troubleshooting

Work through these in order:

  1. Is Dataview installed and enabled? Heatmap Tracker reads your notes through Dataview. Without it, there's no data to draw.
  2. Does the property actually exist in your notes? Property names are case-sensitive. photo-taking and Photo-Taking are different keys.
  3. Are your notes in the searched folder? Without path, the plugin falls back to your Daily Notes folder. If your notes live elsewhere, set path explicitly.
  4. Is the year right? The heatmap defaults to the current year. If your data is from last year, use the arrows or set year.
  5. Check the console. Ctrl+Shift+I (Windows/Linux) or Cmd+Option+I (Mac) opens devtools — a missing property parameter logs a warning there.

JavaScript queries are off by default. Enable Dataview → Settings → Enable JavaScript Queries, then reload the note.

This is almost always a timezone issue with how dates are parsed. Use plain YYYY-MM-DD strings for date rather than JavaScript Date objects or full ISO timestamps with a time component. If you're pulling from page.file.name on daily notes named YYYY-MM-DD.md, you're already doing the right thing.

The plugin renders from the same data on every platform, so a difference almost always means some entries are being dropped on one of them — check the date format against Accepted date formats, and switch to YYYY-MM-DD if you're using anything else.

Historically this was the cause of #29: dates were handed to the JavaScript engine's own parser, which accepts different formats on desktop (Electron/V8) and on iOS (WebKit/JavaScriptCore), so 01-31-2025 worked on a Mac and silently produced an empty heatmap on an iPhone. Dates are now parsed by the plugin itself and behave the same everywhere.

Still different after fixing the format? Please open an issue with your codeblock and the Obsidian version on both devices.

If several notes share a filename, pass an absolute path so there's no ambiguity:

filePath: page.file.path   // not page.file.name

Set disableFileCreation: true on your trackerData.

true counts as 1, so meditated: true gives you a filled square. false counts as 0; combine with intensityConfig.excludeFalsy: true if you want those days treated as untracked rather than as zero.

Yes — pass an array: property: [running, cycling, swimming]. Values are aggregated.

Your values probably fall into a single bucket of the intensity scale. Set intensityConfig.scaleStart and scaleEnd to bracket the range you actually care about — e.g. scaleStart: 30, scaleEnd: 120 for reading minutes.

Yes. The plugin is not desktop-only and works on Obsidian mobile.

No. Everything is computed locally from your notes. There's no account, no sync, no telemetry.

The heatmap-tracker codeblock needs Dataview. But renderHeatmapTracker(container, trackerData) accepts any entries array, so any JavaScript that can build that array works — Dataview is simply the most convenient source.

Still stuck? Open an issue — include your codeblock, a sample note's frontmatter, and your Obsidian and plugin versions.


🔍 How it compares

Heatmap Tracker began as a rewrite of the excellent heatmap-calendar-obsidian by Richardsl, and grew from there.

Heatmap Tracker heatmap-calendar-obsidian
Codeblock without JavaScript ✅ heatmap-tracker block ❌ dataviewjs required
Interactive insert command ✅ Modal builder ❌
Statistics & custom insights ✅ ❌
Monthly (calendar) layout ✅ ❌
Single month / week view ✅ ❌
Flexible date ranges ✅ Days, months, explicit range ❌ Full year
Export to Markdown / HTML ✅ ❌
Localization ✅ 9 languages ❌
Click to open and create notes ✅ Partial
Actively maintained ✅ Limited

If all you need is a one-year contribution grid from a dataviewjs script, the original is lighter. If you want tracking, statistics, reports and a no-code path, this is the one.


🗺️ What's planned

Have an idea? Open an issue — feature requests genuinely shape this project.


🛠️ Development

New to the codebase? ARCHITECTURE.md maps how data flows from a codeblock or dataviewjs script through to the rendered heatmap.

git clone https://github.com/mokkiebear/heatmap-tracker.git
cd heatmap-tracker
npm install
npm run dev

npm run dev starts the TS→JS transpiler and copies the generated JS/CSS/manifest into the example vault whenever they change. The hot-reload plugin — already installed in EXAMPLE_VAULT — then reloads Obsidian automatically, so you don't restart after every change.

If hot-reload isn't picking up changes, add an empty .hotreload file to EXAMPLE_VAULT/.obsidian/plugins/heatmap-tracker/.

Useful scripts

Command What it does
npm run dev Watch mode + copy into the example vault
npm run build Production build, ready for distribution
npm test Run the Jest test suite
npm run test:coverage Tests with a coverage report
npm run test:utc / test:usa Run tests under specific timezones
npm run lint / lint:fix ESLint
npm run type-check TypeScript, no emit
npm run format / format:check Prettier

Stack: TypeScript · Preact · esbuild · Jest · Zod

Tip: Ctrl+Shift+I opens devtools inside Obsidian.

Further reading: style guide · adding a language · releasing


🤝 Contributing

Contributions are welcome and appreciated — code, docs, translations, bug reports, or just telling me how you use it.

Read CONTRIBUTING.md before you start, and note that this project ships a Code of Conduct. Security issues go through SECURITY.md.


❤️ Support the project

Heatmap Tracker is free and open source, built and maintained in my own time. If it's useful to you, the cheapest way to help is a ⭐ on the repo — it's how other people find the plugin.

 


📄 License & credits

Licensed under the Apache License 2.0.

Built by Maksim Rubanau and contributors.

Inspired by heatmap-calendar-obsidian by Richardsl. Powered by Obsidian Dataview.

⬆ Back to top

If Heatmap Tracker helps you keep a streak alive, consider starring the repo.

Similar Plugins

info
• Similar plugins are suggested based on the common tags between the plugins.
Calendar
6 years ago by Liam Cain
Simple calendar widget for Obsidian.
Notebook Navigator
2 months ago by Johan Sanneblad
A better file browser and calendar inspired by Apple Notes, Bear, Evernote and Day One.
Day Planner
2 months ago by ivan-lednev
An Obsidian plugin for day planning with a clean UI and a simple task format
Advanced Canvas
3 years ago by Developer-Mike
⚡ Supercharge your canvas experience! Graph view integration and unlimited styling options empower flowcharts, dynamic presentations, and interconnected knowledge.
Markmind
5 years ago by Mark
A mind map, outline for obsidian,It support mobile and desktop
Sheet Plus
3 months ago by ljcoder
obsidian spreadsheets solutions
Google Calendar
4 years ago by YukiGasai
Add Google Calendar inside Obsidian
Calendarium
3 years ago by Jeremy Valentine
The ultimate Obsidian plugin for crafting mind-bending fantasy and sci-fi calendars
Heatmap Calendar
5 years ago by Richard Slettevoll
An Obsidian plugin for displaying data in a calendar similar to the github activity calendar
Map View
5 years ago by esm
Interactive map view for Obsidian.md
Calendar Bases
6 months ago by Edrick Leong
Operon
2 months ago by Hasan Yılmaz
Task management system for humans and agents in Obsidian.
Tasks Calendar Wrapper
4 years ago by zhuwenq
This plugin currently provides a timeline view to display your tasks from your obsidian valut, with customizable filters and renderring options.
Extended Graph
2 years ago by Kapirklaa
Community plugin to add features to the graph view.
Big Calendar
5 years ago by Boninall
Big Calendar in Obsidian, for manage your events in a day/week/month and see agenda too!
Maps
a year ago by Obsidian
Map layout for Obsidian Bases. Display your notes as an interactive map view.
Contribution Graph
3 years ago by vran
generate interactive gitxxx style contribution graph for obsidian, use it to track your goals, habits, or anything else you want to track.
Time Ruler
3 years ago by Joshua Tazman Reinier
A drag-and-drop time ruler combining the best of a task list and a calendar view (integrates with Tasks, Full Calendar, and Dataview).
Full Calendar Remastered
4 months ago by obsidian-full-calendar-remastered
Keep events and manage your calendar alongside all your other notes in your Obsidian Vault.
Apex Dashboard
3 months ago by PandoraReads
Stop switching between Obsidian notes. One page. Everything you need. Memo your thoughts, crush your todos, track your projects — and make it look incredible doing it.
Diagrams.Net
4 years ago by Jens M Gleditsch
This repository contains a plugin for Obsidian for inserting and editing diagrams.net (previously draw.io) diagrams.
Life Tracker
4 months ago by Sébastien Dubois
Capture and visualize the data that matters in your life
Mehrmaid
3 years ago by huterguier
Rendering Obsidian Markdown inside Mermaid diagrams.
Note Gallery
3 years ago by Pash Shocky
A masonry note gallery for obsidian.
Smart Connections Visualizer
2 years ago by Evan Moscoso
Visualize your notes and see links to related content with AI embeddings. Use local models or 100+ via APIs like Claude, Gemini, ChatGPT & Llama 3
Link Exploder
4 years ago by Ben Hughes
Keep the Rhythm
2 years ago by Ezben
An Obsidian plugin to visualize how much you write with a heatmap.
ICS
3 years ago by muness
Generate Daily Planner from one or more ical feeds
InfraNodus AI Graph View
2 years ago by Nodus Labs
Advanced graph view for Obsidian: text analysis, topic modeling, and AI with InfraNodus AI text analysis tool: https://infranodus.com
Desmos
5 years ago by Nigecat
Embed graphs directly into your obsidian notes
Prisma Calendar
2 months ago by Matej Vavro Productivity
Prisma is not just a calendar plugin. It turns any note with a date into a flexible planning system inside Obsidian. There are no rigid schemas or predefined structures — just your data, your rules, fully under your control. It lets you see your entire vault through time.
Optimize Canvas Connections
4 years ago by Félix Chénier
An Obsidian plugin that declutters a canvas by reconnecting notes using their nearest edges
Enhanced Canvas
2 years ago by RobertttBS
When editing on Canvas, properties and Markdown links to notes are automatically updated, enabling backlinks in Canvas.
Graph Banner
2 years ago by ras0q
An Obsidian plugin to display a relation graph view on the note header.
Notion Bases
3 months ago by bgarciamoura
Turn any folder into a Notion-style database — 7 views, 17 column types, formulas, relations, rollups, and subtasks. All stored in plain Markdown frontmatter.
New 3D Graph
a year ago by Aryan Gupta
Visualize your vault in 3D with a powerful, highly customizable, and filterable graph.
OZ Calendar
3 years ago by Ozan Tellioglu
Obsidian plugin to display notes on a calendar based on YAML frontmatter or file names
Jump-to-Date
5 years ago by TfTHacker
Jump to a date via a convenient popup form. This plugin is a part of the Obsidian42 family of Obsidian plugins.
Show Whitespace
3 years ago by Erin Schnabel
Show leading/trailing whitespace
Mindmap
2 years ago by YunXiaoYi
An Obsidian plugin for creating Mindmaps.
D2
4 years ago by Terrastruct
The official D2 plugin for Obsidian. D2 is a modern diagram scripting language thats turns text to diagrams.
Date Inserter
3 years ago by namikaze-40p
An Obsidian plugin that lets you insert a date at the cursor position using a calendar.
Daily notes calendar
2 years ago by bartkessels
Quickly navigate your vault using a calendar view, this plugin allows you to create and navigate to periodic notes and notes that are created on a specific date.
Habit Tracker
5 years ago by duo
This plguin for Obsidian creates a simple month view for visualizing your punch records.
iCal
3 years ago by Andrew Brereton
This is a plugin for Obsidian that searches your vault for tasks that contain dates, and generates a calendar in iCal format that can be imported into your preferred calendar application.
Gantt Calendar
3 months ago by Sugar
obsidian-gantt-calendar
Canvas Links
3 years ago by aqav
Show the links between "Canvas" and "File"
Chinese Calendar
2 years ago by DevilRoshan
在obsidian中使用的更符合中国习惯的日历插件。
Canvas Filter
4 years ago by Ivan Koshelev
Obsidian Canvas plugin that let's you show only pages / arrows with specific tags / colors / connections.
Outlook Meeting Notes
2 years ago by David Ingerslev
An Obsidian plugin to create meeting notes from Microsoft Outlook .msg files
Dust Calendar
2 years ago by 纳米级尘埃
obsidian 日历插件
Advanced Progress Bars
2 years ago by cactuzhead
Obsidian plugin to create custom progress bars
CardNote
3 years ago by cycsd
Help you extract your thoughts more quickly in canvas
Morgen Tasks
2 years ago by Morgen AG
Tasks Map
a year ago by NicoKNL
A graph view of your tasks.
Graph Link Types
3 years ago by natefrisch01
Link types for Obsidian graph view.
Diarian
2 years ago by Erika Gozar
All-in-one journaling toolkit.
Chessboard Viewer
6 years ago by Davide Aversa
Plugin to render chessboards in Obsidian using chessboardjs
Neo4j Graph View
6 years ago by Emile van Krieken
Galaxy View
2 months ago by Rick
Habit Calendar
4 years ago by Hedonihilist
Monthly Habit Calendar for DataviewJS. This plugin helps you render a calendar inside DataviewJS code block, showing your habit status within a month.
Canvas Mindmap Helper
3 years ago by Tim Smart
Datepicker
2 years ago by Mostafa Mohamed
Datepicker widget for Obsidian.
Itinerary
5 years ago by Adam Coddington
Make planning your trip or event easier by rendering a calendar from event information found in your notes.
Release Timeline
4 years ago by cakechaser
Habit Tracker
4 years ago by David Moeller
A Plugin to display a Habit Tracker in Obsidian.
Nifty Links
3 years ago by x-Ai
Generating elegant, Notion-styled rich link cards to enhance your note-taking experience.
Export Graph View
2 years ago by Sean McGhee
Plugin to export your vault's graph view.
Banyan
a year ago by ratiger
A card-based homepage for Obsidian —— browse, organize, and navigate notes effortlessly with multi-tag filtering.
Arrows
3 years ago by artisticat
Draw arrows across different parts of your notes, similar to on paper
MagicCalendar
3 years ago by Vaccarini Lorenzo
An obsidian plugin that exploit a natural language processing engine to find potential events and sync them with iCalendar
Argument Map with Argdown
5 years ago by amdecker
Dirtreeist
4 years ago by kasahala
Render a directory Structure Diagram from a markdown lists in codeblock.
Single File Daily Notes
3 years ago by Pranav Mangal
An Obsidian plugin to create and manage daily notes in a single file
Content Cards
2 years ago by leo
Insert content cards in Markdown, such as timeline, highlightblock, target card, book information card, music information card, movie information card, photoes ablum, business card, content subfield, countdown, SWOT,BCG.
Chemical Structure Renderer
3 years ago by xaya1001
Render chemical structures from SMILES strings into PNG or SVG format using Ketcher and Indigo Service.
Easy Tracker
9 months ago by Hunter Ji
An Obsidian plugin for ultra-simple goal and habit tracking in any note.
Node Factor
2 years ago by CalfMoon
Customize factors effecting node size in obsidian graph.
Adamantine Pick
4 years ago by Urist McMiner
Embeddable Pikchr(https://pikchr.org) diagrams renderer plugin for Obsidian(https://obsidian.md)
WaveDrom
5 years ago by Alex Stewart
Daily Statistics
2 years ago by yefengr
obsidian daily statistics
YourPulse - Your Writing Activity Visualised
2 years ago by Jiri Sifalda
YourPulse.cc - Obsidian.md plugin that turns your vault into a reflection of your creativity, and put your writing on steroids 💪
Daily Routine
2 years ago by sechan100
new version of daily-routine obsidian plugin
Mermaid Icons
8 months ago by toshs
Obsidian plugin enabling the use of icons in Mermaid diagrams.
Lilypond
3 years ago by DOT-ASTERISK
Lilypond for Obsidian
Flowcharts
2 years ago by land0r
Flowchart Plugin for Obsidian – Create and customize flowcharts seamlessly within your Obsidian vault. Powered by Flowchart.js and designed for productivity
MemoChron
a year ago by Michalis Efstratiadis
Calendar integration and note creation with support for public iCalendar URLs.
Desk
3 years ago by David Landry
A desk for obsidian
BeautyTasks
2 months ago by Avni Bilgin
Todoist-style task & project manager for Obsidian — one markdown note per task, native UI, no plugin dependencies.
Generate Timeline
2 years ago by Shanshuimei
An obsidian plugin to generate timelines from tags, folders, files or metadata automatically. 根据标签,文件夹,文件或者属性自动生成时间轴的插件。
Weather Widget
8 months ago by mr-asa
Weather widget for display in notes, Canvas, and a separate tab.
Lineup Builder
5 years ago by James Fallon
An Obsidian plugin that lets you build football lineups
Tier List
2 years ago by Mox Alehin
Obsidian plugin for visual ranking and organizing content into customizable Tier Lists.
Laws of Form
3 years ago by Kevin German
Easy Timeline
2 years ago by Romeliun
The Easy Timeline plugin for Obsidian allows you to create timelines easily.
ASCII Tree Generator
2 years ago by Matěj Michálek
Activity Heatmap
2 years ago by Zak Hijaouy
Mapbox Location Image
2 years ago by Aaron Czichon
Render a mapbox location image based on provided coordinates
Storyclock Viewer
3 years ago by Jonathan Fisher
Obsidian plugin for creating a storyclock
Folder Canvas
2 years ago by Nancy Lee
Generate a canvas view of your folder structure
Mathematica Plot
3 years ago by Marcos Nicolau
Insert functions on Obsidian using Wolfram Mathematica!
Markline
3 years ago by 闲耘
Markline: Markdown timeline view in Obsidian.
BattleSnake Board Viewer
3 years ago by EnderInvader
Plugin to render battlesnake boards in Obsidian
Extended File Support
2 years ago by Nick de Bruin
Adds opening and embedding support for various filetypes to Obsidian
Inline Local Graph
8 months ago by TKOxff
Inline Local Graph of Obsidian
Journal View
2 months ago by RUverse
A Journal View for Obsidian
Simple Reminder
25 days ago by Dmitry
Напоминалка
Habitify
2 months ago by justrelaxdc
Tiny Habits
a year ago by Diego Nazoa
Obsidian Plugin for habit tracking with Svelte
Alfonso Money Manager
3 years ago by SmartLifeGPT Innovation
This is the repository for the obsidian plugin of the Alfonso Money Manager mobile application
Calendar Event Sync
2 years ago by Stephen Dolan
Set the title of your note to the current event
Gantt this
2 months ago by Altarok
Obsidian plugin showing multiple TTRPG calendars at once in one gantt chart.
Canvas Explorer
2 years ago by Henri Jamet
A plugin that enables users to explore their vault by iteratively adding or ignoring linked notes, ultimately generating a customizable canvas that visually represents the preserved notes and their connections.
Life in Weeks Calendar
a year ago by Jeff Szuc
Plugin for the Obsidian markdown editor. Displays a calendar of your life in weeks with weekly Periodic Notes plugin integration. Includes options for the traditional Memento Mori/Stoic style calendar, as well as a Gregorian calendar accurate version.
NodeFlow
2 years ago by LincZero
Render node streams like `ComfyUi`, `UE`, `Houdini`, `Blender`, etc., to make it easy to write relevant notes. json describes the chart, compared to screenshots, making it easier to modify later. The plugin is also compatible with blogs.",
Lunar Calendar
3 years ago by OSmile
obsidian插件,一个支持农历的日历插件。
Magic Move
2 years ago by imfenghuang
Animating Code Blocks in Obsidian
Timelive
a year ago by aNNiMON
Turn a list of dates into a timeline
Waveform Player
2 years ago by Zhou Hua
Codeless Heatmap Calendar
a year ago by Behnam Aghajani
An Obsidian plugin for customizable heatmap calendars using Toggl API or fake data. Perfect for time tracking and productivity visualization.
Power Bases
2 months ago by Power Plugins
Add board, calendar, timeline, chart, gallery, and table views to Bases, with inline editing, colors, rollups, field types, formulas, and CSV import.
WorkLife Calendar
2 months ago by RavenLife
All-in-one: a smart calendar, task and habit tracker, time tracker, and financial planner, all connected into a single ecosystem within Obsidian.
Markdown Calendar Generator
a year ago by Zach Russell
An intentionally simple obsidian markdown table calendar generator
Kale Graph
2 years ago by Oli
Render mathematical graphs in Obsidian
Synaptic View
6 months ago by Yongmini
Obsidian Plugin : Synaptic View that unifies your dashboards, hub notes, quick-entry notes, periodic notes, web shortcuts, and calendar navigation—enable it as the default new-tab experience or summon it with a command.
Every Day Calendar
2 years ago by QuBe
Obsidian plugin to create calendars inspired by Simone Giertz's Every Day Calendar
Visited Countries
a year ago by Ivan Peshykov
Obsidian plugin to mark and visualize the countries you've visited on an interactive world map.
Boardgame Search
2 years ago by Marlon May
A plugin to create notes for boardgames based on the BGG API
NyanBar
2 years ago by xhyabunny
Give life to your Obsidian notes with NyanBar !
GLSL Viewer
8 months ago by iY0Yi
Preview GLSL shaders on Obsidian.
Mapa neuronal
22 days ago by Felipe Córdova
A graph that explains itself: your Obsidian vault as a layered neural map, with the reason each note links to the next.
Mahgen Renderer
2 years ago by Michael Francis Williams
Obsidian plugin to render mahgen automatically
Poker Range
2 years ago by marplek
Easily create, view, and interact with poker hand ranges in your obsidian.
ShaahMaat-md
2 years ago by Mihail Kovachev
Class Relation Visualization
2 years ago by Yong
GoBoard
9 months ago by Dmitry I. Sokolov
Obsidian plugin for rendering Go game diagrams from markdown code blocks
Mahjong Renderer
2 years ago by hypersphere
Wiki Companion
a month ago by Mo A
A minimalist, read-only calendar for Obsidian, built on the frontmatter you already have.
Weekday Commands
a month ago by Wren