The Complete Guide to Habit Tracking in Obsidian
If you're already using Obsidian as your second brain, it makes sense to track your habits there too. Your habits are deeply connected to your notes, your goals, and your daily reflections โ why scatter them across a separate app?
This guide covers everything from a basic checkbox system to a full-featured habit tracking setup with heatmaps, streaks, and automated templates. Whether you're just starting out or optimizing an existing system, you'll find something useful here.
Why Track Habits in Obsidian?
Before we get tactical, let's address the obvious question: why not just use a dedicated habit app?
Integration with your existing workflow: If you're already doing daily notes, weekly reviews, and project tracking in Obsidian, habits belong in the same system. You can link habits to goals, reference them in journal entries, and see everything in one place.
Data ownership: Your habits are stored as markdown files in your vault. No cloud account, no subscription required for your data, no risk of an app shutting down and taking your streak data with it.
Flexibility: Obsidian's plugin ecosystem and templating let you build exactly the system you want. No feature requests needed โ if you can imagine it, you can probably build it.
Offline-first: Works without internet. Your files are local. No sync issues, no loading spinners, no "server unavailable."
Level 1: The Basic Checkbox System
Let's start simple. The most straightforward habit tracking system in Obsidian is just checkboxes in your daily note.
Setting Up Daily Notes
First, enable the core Daily Notes plugin:
- Settings โ Core Plugins โ toggle on "Daily notes"
- Set your date format (I recommend
YYYY-MM-DD) - Set your template folder
- Choose where daily notes are stored (e.g.,
journal/daily/)
Creating a Habit Template
Create a template file at templates/daily-note.md:
# {{date}}
## Habits
- [ ] ๐๏ธ Exercise
- [ ] ๐ Read (30 min)
- [ ] ๐ง Meditate (10 min)
- [ ] ๐ง Drink 8 glasses of water
- [ ] ๐ Journal
## Notes
## Reflections
Now every daily note starts with your habit list. Check them off as you complete them throughout the day.
Pros: Dead simple, no plugins needed, works immediately.
Cons: No streaks, no visualization, manual counting if you want to review progress.
Level 2: Adding Structure with Metadata
To make your habits machine-readable (for future analysis), add YAML frontmatter:
---
date: 2026-02-14
habits:
exercise: true
reading: true
meditation: false
water: true
journal: true
completion: 80
---
# Friday, February 14, 2026
## Habits
- [x] ๐๏ธ Exercise โ Running | 30 min
- [x] ๐ Read | 25 pages
- [ ] ๐ง Meditate
- [x] ๐ง Water | 8 glasses
- [x] ๐ Journal
The frontmatter gives you structured data that Dataview (covered below) can query. The checkboxes give you a visual interface for daily use.
Adding Detail to Habits
Don't just track boolean "done/not done." Add context:
- Duration:
Exercise โ Running | 30 min - Quantity:
Read | 25 pages - Variation:
Exercise โ YogavsExercise โ Strength Training - Notes: Add a brief note about how it went
This detail is what makes habit data valuable months later. "I exercised" is less useful than "I did 30 minutes of running and felt great afterward."
Level 3: Dataview for Habit Analytics
The Dataview plugin transforms your habit data from static checkboxes into queryable data.
Installing Dataview
- Settings โ Community Plugins โ Browse
- Search "Dataview" โ Install โ Enable
- Enable "JavaScript Queries" in Dataview settings (for advanced queries)
Basic Queries
Show all days you exercised this month:
TABLE date, habits.exercise as "Exercise"
FROM "journal/daily"
WHERE date >= date("2026-02-01") AND date <= date("2026-02-28")
WHERE habits.exercise = true
SORT date ASC
Calculate your completion rate:
const pages = dv.pages('"journal/daily"')
.where(p => p.date >= dv.date("2026-02-01"))
.where(p => p.completion);
const avg = pages.values.reduce((sum, p) => sum + p.completion, 0) / pages.length;
dv.paragraph(`**February average completion**: ${avg.toFixed(1)}%`);
Find your longest streak:
const pages = dv.pages('"journal/daily"')
.where(p => p.habits?.exercise === true)
.sort(p => p.date, 'asc');
let maxStreak = 0, current = 0, prev = null;
for (const p of pages.values) {
const d = new Date(p.date.toString());
if (prev && (d - prev) / 86400000 === 1) {
current++;
} else {
current = 1;
}
maxStreak = Math.max(maxStreak, current);
prev = d;
}
dv.paragraph(`**Longest exercise streak**: ${maxStreak} days`);
Limitations of Dataview for Habits
Dataview is powerful but has limitations for habit tracking:
- No native heatmap visualization
- Streak calculations require JavaScript queries
- Performance degrades with hundreds of files
- No reminder/notification system
- Queries can be fragile when note format varies
This is where dedicated habit plugins come in.
Level 4: Dedicated Habit Tracking Plugins
Several Obsidian plugins are designed specifically for habit tracking. Here's an honest comparison:
Obsidian Tracker
What it does: Renders charts and graphs from data in your daily notes.
- Supports line charts, bar charts, and summary statistics
- Reads data from frontmatter or inline fields
- Highly configurable
Best for: People who want visual charts and are comfortable with YAML configuration.
Limitations: No heatmaps, no checkbox interaction, steep learning curve for configuration.
Habit Tracker 21
What it does: Adds a simple habit tracking view with a calendar grid.
- Visual monthly calendar view
- Toggle habits directly from the view
- Basic streak tracking
Best for: People who want a simple visual grid.
Limitations: Limited customization, no heatmap view, basic feature set.
Habit Space Plugin
What it does: Full-featured habit tracking that reads/writes standard markdown files.
- GitHub-style heatmaps for each habit
- Automatic streak tracking with fire emoji counters ๐ฅ
- Flex habits (multiple options per habit โ e.g., "Exercise" can be running, yoga, or gym)
- Categories for grouping habits
- Completion statistics and analytics
- Standard markdown format โ files are readable without the plugin
Best for: People who want rich visualization without sacrificing data portability.
How it works: The plugin reads your daily note files, parses the habit checkboxes, and generates visualizations. When you check a habit, it writes a standard markdown checkbox to your file. The data format is human-readable:
- [x] ๐๏ธ Exercise โ Strength Training | 45 min | ๐ฅ 12
That ๐ฅ 12 is your streak count, maintained automatically. The arrow notation tracks which flex habit variant you chose. It's all plain text.
Choosing a Plugin
| Feature | Tracker | Habit Tracker 21 | Habit Space | |---------|---------|-------------------|-------------| | Heatmaps | โ | โ | โ | | Streaks | Manual | Basic | โ Auto | | Flex habits | โ | โ | โ | | Charts | โ | โ | โ | | Data format | Frontmatter | Custom | Standard MD | | Portable data | Partial | No | โ Full |
Building Your Complete System
Here's my recommended setup, combining the best of everything:
File Structure
vault/
โโโ habits/
โ โโโ config.md # Habit definitions
โ โโโ logs/
โ โโโ 2026-02-14.md # Daily habit logs
โ โโโ 2026-02-13.md
โ โโโ ...
โโโ journal/
โ โโโ daily/
โ โโโ 2026-02-14.md # Daily notes (can include habits or link to them)
โ โโโ ...
โโโ templates/
โ โโโ daily-note.md
โ โโโ weekly-review.md
โโโ dashboards/
โโโ habits.md # Habit dashboard with queries
Habit Configuration
Define your habits in a central config:
# Habit Configuration
## Active Habits
### Health
- ๐๏ธ Exercise (flex: Running, Strength Training, Yoga, Swimming)
- ๐ง Water (target: 8 glasses)
- ๐ด Sleep by 11pm
### Mind
- ๐ Read (target: 30 min)
- ๐ง Meditate (target: 10 min)
- ๐ Journal
### Growth
- ๐ป Code (target: 1 hour)
- ๐ต Practice guitar (target: 20 min)
### Avoid
- ๐ซ No alcohol
- ๐ซ No social media before noon
Weekly Review Template
Create templates/weekly-review.md:
# Week of {{date}}
## Habit Review
### Completion Rate
<!-- Query: average completion for the week -->
### Streaks
<!-- Current active streaks -->
### Wins
-
### Struggles
-
### Adjustments
<!-- What to change next week -->
## Weekly Stats
- Best day:
- Worst day:
- Habits completed: /total
The Dashboard
Create dashboards/habits.md as your habit command center:
# ๐ฑ Habit Dashboard
## Current Streaks
<!-- Generated by plugin or Dataview query -->
## This Month's Heatmap
<!-- Generated by Habit Space plugin -->
## Monthly Completion Trend
<!-- Dataview chart or plugin visualization -->
## Quick Links
- [[habits/config|Habit Config]]
- [[journal/daily/{{date:YYYY-MM-DD}}|Today's Note]]
- [[templates/weekly-review|Weekly Review Template]]
Habit Design Principles
The system doesn't matter if the habits are wrong. Here are principles for choosing what to track:
Start With 3-5 Habits Maximum
The number one mistake is tracking too many habits from day one. You'll feel overwhelmed by day 3 and abandon the system by day 10.
Start with 3 habits you're already partially doing. Once those are automatic (2-4 weeks), add one more. Build up slowly.
Use the Two-Minute Rule
Each habit should have a "minimum viable" version that takes two minutes or less:
- Exercise โ Do 5 pushups
- Read โ Read one page
- Meditate โ Take 3 deep breaths
- Journal โ Write one sentence
On bad days, do the two-minute version. It maintains the streak and keeps the habit alive.
Track "Don't" Habits
Some of the most powerful habits are things you don't do:
- No alcohol
- No social media before noon
- No eating after 8pm
These are naturally "done" unless you break them. In your daily note, mark them as complete by default and uncheck if you slip.
Use Flex Habits
Rigid habits break. "Run 5K every morning" will fail the first time it rains. Instead, define flexible habits:
- Exercise โ Running OR Gym OR Yoga OR Walking
You still get credit for exercising. You just choose the variant that fits the day. This dramatically improves consistency because you're never in a position where the "right" choice is impossible.
Review Weekly, Not Daily
Daily reviews of habit data are noise. Weekly reviews show patterns. Set up a weekly review habit where you:
- Look at your completion rate for the week
- Identify which habits are sticking and which aren't
- Decide if any habits need to be adjusted, replaced, or removed
- Celebrate wins (seriously โ this matters)
Syncing Your Habits Across Devices
Since your habits are just files, syncing works like syncing any other Obsidian vault:
Obsidian Sync (Paid)
The official option. End-to-end encrypted, works seamlessly. $4/month.
iCloud Drive (Free, Apple only)
Put your vault in iCloud Drive. Works well on Mac and iOS. Occasional sync conflicts.
Syncthing (Free, Any platform)
Peer-to-peer file sync. No cloud. Open source. Slightly more setup but maximum privacy.
Git (Free, Technical)
Use the Obsidian Git plugin to auto-commit and push. Great for version history. Requires Git knowledge.
The beauty of file-based habit tracking is that you're not locked into any sync method. Use whatever you're already using for your vault.
Advanced: Automating with Templater
The Templater plugin can automate repetitive parts of habit tracking:
Auto-populate today's habits:
<%*
const habits = ["๐๏ธ Exercise", "๐ Read", "๐ง Meditate", "๐ง Water", "๐ Journal"];
for (const h of habits) {
tR += `- [ ] ${h}\n`;
}
%>
Auto-calculate completion in frontmatter:
<%*
// Count checked vs total checkboxes after the note is filled
const content = tp.file.content;
const checked = (content.match(/- \[x\]/g) || []).length;
const total = (content.match(/- \[[ x]\]/g) || []).length;
const pct = total > 0 ? Math.round((checked / total) * 100) : 0;
%>
completion: <% pct %>
Common Mistakes to Avoid
Tracking too many habits: Start with 3-5. Seriously.
Optimizing the system instead of doing the habits: If you spend more time tweaking your templates than actually exercising, you've lost the plot.
Breaking the chain panic: Missing one day is fine. Missing two days is a pattern. Don't let a single miss derail the whole system.
No weekly review: Without review, you're collecting data you never use. Schedule 15 minutes every Sunday.
Making it too complex: The best system is the one you actually use. If fancy Dataview queries stress you out, just use checkboxes.
Getting Started Today
Here's your action plan:
- Right now: Create a
habitsfolder in your vault - Right now: Write down 3-5 habits in a new note
- Today: Set up your daily note template with those habits as checkboxes
- This week: Check off your habits each day. Don't install any plugins yet. Just checkboxes.
- After 1 week: Install a habit plugin if you want visualization (Habit Space for heatmaps/streaks, Tracker for charts)
- After 1 month: Set up your weekly review template
- After 3 months: Look at your data. You'll be amazed at what you see.
The system grows with you. Start simple, add complexity only when you need it. The markdown files will be there regardless of which plugins you use today, tomorrow, or five years from now.
That's the whole point.