mokkiebear34k downloadsVisualize your activity and track goals, progress, habits, tasks, exercise, finances, and more—all in a single, interactive heatmap!
The Heatmap Tracker plugin for Obsidian is a powerful and customizable tool designed to help you track, visualize, and analyze data over a calendar year. Perfect for habit tracking, project management, personal development, or any kind of data visualization, this plugin enables you to create beautiful, interactive heatmaps directly within Obsidian. Whether you’re monitoring progress, visualizing trends, or staying on top of daily goals, the Heatmap Tracker enhances your productivity and organization. Discover its intuitive features, flexible customization options, and seamless integration with Obsidian in the detailed guide below.
Tip: Check Example Vault. There're lots of good examples (and I update it often).
This plugin requires the Obsidian Dataview plugin to be installed and enabled to automatically fetch data from your notes.
YYYY-MM-DD.md) that you want to track.photo-taking: 10photo-taking: true (counts as 1)Insert Heatmap Tracker to generate a heatmap through the interactive modal.This plugin comes with frontmatter tracking out of the box. You can use the heatmap-tracker codeblock with the following parameters:
```heatmap-tracker
property: <frontmatter_property_key>
```
This will look for frontmatter_property_key in your daily notes and activate a spot on the heatmap wherever that property is set.
You can also use an array of property names as such:
```heatmap-tracker
property: [<frontmatter_property_key_1>, <frontmatter_property_key_2>, ...]
```
This will aggregate the values of all specified properties on the heatmap.
You can add a heatmap tracker using command: Insert Heatmap Tracker. This is the easiest way to get started.
If you want something more involved, you may use a dataviewjs codeblock as such (update trackerData with your own dataset to visualize custom data points):
// 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 (for cases when you have multiple notes with the same 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);
Notes
filePath for each entry (page.file.path), clicking a heatmap box opens that exact file. If the file is missing, the plugin offers to create it at the same path.filePath is not set on a box but trackerData.basePath is provided, the plugin proposes creating/opening trackerData.basePath/YYYY-MM-DD.md.You can also read about parameters in EXAMPLE_VAULT (there're examples).
yearnumbernew Date().getFullYear())colorSchemeobject{
"paletteName": "default",
"customColors": []
}
customColorstringundefinedentriesarray[
{ "date": "1900-01-01", "customColor": "#7bc96f", "intensity": 5, "content": "" }
]
date: The date of the entry (ISO string format).customColor: The color for that entry.intensity: The data intensity for that date.content: Optional tooltip or note associated with the date.showCurrentDayBorderbooleantruedefaultEntryIntensitynumber4intensityScaleStartnumber1intensityScaleEndnumber5excludeFalsybooleanundefined (falsy values are included)true, entries with falsy intensity values (0, undefined, null, false) will be excluded from the heatmap.basePathstringundefinedseparateMonthsbooleantrueinsightsarray[]Statistics. Check this example.layout"default" | "monthly""default""default" renders the traditional GitHub-style week-column grid. "monthly" renders one row per month with days 1–31 as columns, providing a compact calendar-style view.monthsToShownumberundefined (shows full year)monthsToShow: 3 displays 4 rows (current month + 3 prior). Takes precedence over daysToShow and startDate/endDate. Best used with layout: "monthly".daysToShownumberundefined (shows full year)startDate/endDate but is overridden by monthsToShow.startDatestring (format: YYYY-MM-DD)undefinedendDate. Overridden by daysToShow or monthsToShow.endDatestring (format: YYYY-MM-DD)undefinedstartDate. Overridden by daysToShow or monthsToShow.To be used with Obsidian Dataview, but could be used standalone or with other plugins as well (if you know some javascript).
Easily switch between years using left and right navigation arrows, allowing you to explore data across multiple years effortlessly.
You have lots of options for defining colors:
Customize insights such as:
Check this file for more information Insights
Additionally, you can use HTML to further customize the plugin's appearance.
Set layout: "monthly" to switch from the default GitHub-style grid to a calendar-style view with days 1–31 as columns. Combine with monthsToShow to display only recent months.
📍 Check out the Roadmap to see what's planned for the future!
npm run dev - will start an automatic TS to JS transpiler and automatically copy the generated JS/CSS/manifest files to the example vault when modified (Remember to run npm install first).
After the files have been transpiled, the hot-reload plugin (https://github.com/pjeby/hot-reload) then reloads Obsidian automatically.
Hot-reload is installed in the example vault by default. its used to avoid restarting obsidian after every change to code.
(remember to add an empty .hotreload file to "EXAMPLE_VAULT/.obsidian/plugins/heatmap-tracker/" if not already present, as this tells hot-reload to watch for changes)
npm run build generates the files ready for distribution.
Tip: ctrl-shift-i opens the devtools inside Obsidian.