ยทHabit Space

The Complete Guide to Habit Tracking in Obsidian

A comprehensive, step-by-step guide to building a powerful habit tracking system in Obsidian using markdown, plugins, and daily notes. From basic checkboxes to heatmaps and streaks.

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:

  1. Settings โ†’ Core Plugins โ†’ toggle on "Daily notes"
  2. Set your date format (I recommend YYYY-MM-DD)
  3. Set your template folder
  4. 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 โ†’ Yoga vs Exercise โ†’ 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

  1. Settings โ†’ Community Plugins โ†’ Browse
  2. Search "Dataview" โ†’ Install โ†’ Enable
  3. 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:

  1. Look at your completion rate for the week
  2. Identify which habits are sticking and which aren't
  3. Decide if any habits need to be adjusted, replaced, or removed
  4. 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:

  1. Right now: Create a habits folder in your vault
  2. Right now: Write down 3-5 habits in a new note
  3. Today: Set up your daily note template with those habits as checkboxes
  4. This week: Check off your habits each day. Don't install any plugins yet. Just checkboxes.
  5. After 1 week: Install a habit plugin if you want visualization (Habit Space for heatmaps/streaks, Tracker for charts)
  6. After 1 month: Set up your weekly review template
  7. 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.