Roger Chang3 downloadsA habit heatmap and streak tracker for your daily notes.
Turn the habit properties already in your daily notes, like exercise: 30 min or reading: true, into a GitHub-style yearly heatmap with your current and longest streak, with no new note format to learn.
For anyone who tracks habits in daily notes and wants a visual check without adding a separate app. Free, offline, no account.


Planned for Streakwise Pro: month, week, quarter and year-to-date views; several habits in one block; PNG export.

Add exercise: true, reading: 30 min, meditate: yes (any property name) to daily notes, then:
```streakwise
habits: exercise
view: year
```
| Option | Values | Default |
|---|---|---|
habits |
one frontmatter property (case-insensitive); several, comma-separated: Pro, planned | default habit from settings |
view |
year (ytd, quarter, month, week: Pro, planned) |
year |
date / year |
YYYY-MM-DD / YYYY, which year to show |
today |
colors |
accent, green, blue, purple, orange |
from settings (accent) |
max |
value shown in the darkest colour | largest value in range |
title |
any text | none |
weekstart |
monday, sunday |
from settings |
Values:
true/yes/done/x/✅ = done; false/no/skip or empty = not done.30 min, 1.5h). Zero or negative numbers (-5) count as not done.1,000 = 1000, 12,500 steps = 12500); any other comma is a decimal comma (1,5 = 1.5, 1,50 = 1.5, 1,0000 = 1). To avoid ambiguity, write decimals with a dot (1.50).Where daily notes are found: Streakwise follows the folder and date format of the Periodic Notes plugin (daily notes) if enabled, otherwise the core Daily notes plugin, otherwise the folder/format in Streakwise settings. You can force the custom location in settings.
Only notes inside the daily-notes folder or its subfolders are counted. A note matches if its path relative to that folder (for formats like YYYY/MM/YYYY-MM-DD) or its file name (for notes archived in subfolders, e.g. Daily/2026/2026-10-17.md) matches the date format. Notes outside the folder (e.g. Archive/2026-10-17.md when the folder is Daily) are ignored. If no daily notes are found, the note shows one hint card with the folder and format it looked for and a button that opens Streakwise settings. If two notes still map to the same day (e.g. format YYYY-M-D with both 2026-10-7.md and 2026-10-07.md), the one with the shortest path is used (ties: alphabetical), and blocks whose date range includes that day show which note was ignored.
The command Insert heatmap block adds a starter block.
.obsidian/plugins/streakwise/data.json in your vault.The free build makes no network requests: the license code for the planned Pro version is removed from main.js at build time (FREE_BUILD=true), and npm test checks the bundle for it.
npm install
npm run build # type-check + bundle to main.js
npm test # unit tests (dates, values, streaks, settings validation, colour contrast) + a check that the
# shipped free bundle (FREE_BUILD=true) contains no license or network code
npm run lint
Bugs and questions: open an issue at https://github.com/smallbench-labs/streakwise/issues. Other questions: [email protected].
Written from scratch; see REVIEW_NOTES.md.
MIT © 2026 Smallbench Labs (Roger Chang) (see LICENSE).