luongpd33 downloadsA calm, Markdown-first habit tracker for Obsidian: flexible schedules, streaks, a month calendar and focused insights.
A calm, Markdown-first habit tracker for Obsidian.
Every habit is a plain note; every check-in is one line of frontmatter. Nothing is locked inside the plugin, and the whole thing works offline.

Version 1.0.1 · Obsidian 1.5.0+ · desktop and mobile · English / Tiếng Việt
<folder>/Drink water.md with frontmatter — no
database, no sync service.Capture
Check in
0 of 3 ly hint;
binary habits get a Done / Not done switch instead of a meaningless amount.Review
Find & tidy
Shortcuts & language

main.js, manifest.json and styles.css from the
latest release.<vault>/.obsidian/plugins/pdl-habit/.git clone https://github.com/LuongPham16/pdl-habit.git
cd pdl-habit
npm ci
npm run build
npm run build writes the release artifact: main.js (minified, no sourcemap),
styles.css and manifest.json at the repo root. Copy those three files into
<vault>/.obsidian/plugins/pdl-habit/.
Notes live in 03 - Area/Habits by default; change the folder in settings.
---
type: habit
title: Drink water
period: morning # morning | afternoon | evening | anytime
time: "07:30" # optional exact time
frequency: daily # daily | weekdays | weekly | monthly | interval
days: [1, 3, 5] # weekdays, when frequency is weekdays
target: 8
unit: ly
direction: build # build | quit
icon: glass-water
color: "#0891b2"
start_date: 2026-01-01
history:
2026-11-07: { value: 4, note: "hot day" }
2026-11-06: { value: 0, status: skip } # planned rest
---
| Habit form | Month calendar | Check-in |
|---|---|---|
![]() |
![]() |
![]() |
npm ci
npm run dev # watch src/ into dist/main.js (dev build, inline sourcemap)
npm run build # production build: the release artifact main.js at the repo root
npm test # unit tests (scheduling, completion, streaks, aggregates, i18n)
npm run verify # audit + reproducibility + load the shipped main.js against a stub
npm run preview # render every tab offline into preview/*.png
npm run deploy # build + copy into the vault listed in .deploy.json
Copy .deploy.example.json to .deploy.json and point it at your vault to use
npm run deploy.
npm version <x.y.z> — bumps package.json, manifest.json and versions.json.CHANGELOG.md.npm run release — builds main.js, runs the tests, then audits styles.css,
proves the build is reproducible and loads the shipped bundle.main.js, styles.css and the metadata together, then push the tag.GITHUB_TOKEN=… npm run publish — attaches the root main.js, styles.css and
manifest.json to the GitHub release.main.js must be committed and must be produced by npm run build: the community
store rebuilds the tagged source and compares it byte-for-byte with the release asset,
so a hand-edited or dev-built bundle fails verification. styles.css follows the
review rules too — no !important, no partially supported features — and npm run audit fails if either comes back.
src/
index.js bundle entry
plugin.js lifecycle, note scanning, persistence, reminders, undo, commands
view.js the four tabs — Today, Habits, Calendar, Insights
ui.js page header, segmented control, cards, empty states, toast
habits.js scheduling, completion, streaks, aggregates, search/sort, insights
habit-form.js draft model behind the habit form
starters.js five starter habits for a new vault
i18n.js English/Vietnamese dictionary, t()/tp(), locale helpers
reminders.js reminder window + message (pure, testable)
dates.js date and string helpers
constants.js ids, palette, icon catalogue
dom.js small DOM helpers
modals/ habit form, icon picker, check-in, detail, confirm, quick add, day picker
settings.js settings tab (folder, week start, default view, language, reminders)
styles.css base sheets, page frame, tabs, toolbar, toast and modals
main.js release bundle — committed, and always regenerated by `npm run build`
scripts/ build, review audit, reproducibility check, release publisher
preview/ offline renderer used for design review
tests/ node:test suites
MIT © 2026 Luong Pham