Two activities on one heatmap in Obsidian
layersGym in orange, reading in green, on one year of days. One heatmap block, a line per activity. A day with both is painted in one colour, the one you list first, and its tooltip names both.
1A checkbox per activity
One checkbox property per activity in each daily note. In a daily note, add a property, set its type to Checkbox, and name it after the activity.
---
gym: true
read: false
---
## 2026-09-14
2026-09-14The note's name is its date. Anything after the date is fine:2026-09-14 Mondaycounts too.gym: trueA ticked box paints the day. An unticked one, or none at all, leaves it empty.DiaryThe folder the block reads from. Use the one your daily notes already live in.
Numbers work too: run_km: 8.5 and swim_km: 1.5 on one grid. The darker the cell, the higher the number. The scale is shared by the whole grid, so a layer with small numbers stays pale next to one with big numbers.
2One grid, two colours
Make a note, say Habits.md, and paste this block. It draws the picture above.
```heatmap
source: Diary
layers:
- { field: gym, color: orange, label: Gym }
- { field: read, color: green, label: Reading }
title: Gym and reading
```
layersOne line per activity, in place offield. Use one or the other, not both.colorPer layer:blue,green,cyan,purple,pink,orange,red,grayor#rrggbb. Leave it out and the next free colour is picked.labelThe name in the legend and the tooltip. Without it, the property name.- CaptionCounts the days where any activity was painted.
3Pick which colour wins
A cell has one colour. On a day with both activities, the layer listed first paints it. Hover the cell and the tooltip lists every activity in that day's note, ticked or not, as in Gym 1, Reading 1. A property left out of the note is not listed.
So put first the one you want to see. If reading is rare and you want every reading day to show, swap the lines:
```heatmap
source: Diary
layers:
- { field: read, color: green, label: Reading }
- { field: gym, color: orange, label: Gym }
title: Gym and reading
```
A day with both never shows both colours. If every overlap has to be visible at a glance, use two grids, one per activity, as in the variations below.
The whole note
The block from step 2, ready to paste into an empty note.
```heatmap
source: Diary
layers:
- { field: gym, color: orange, label: Gym }
- { field: read, color: green, label: Reading }
title: Gym and reading
```
The same with Tracker
Tracker's calendar can read both properties from the same notes:
```tracker
searchType: frontmatter
searchTarget: gym, read
folder: Diary
datasetName: Gym, Reading
month:
startWeekOn: 'Mon'
```
- The calendar is a month view, one month at a time.
- It shows one activity at a time. Click its name in the header to switch to the next.
With dataviewjs you would draw the grid yourself, or add a heatmap plugin on top of Dataview. That code is longer than this page, so it is left out.
| Dashy | Tracker | |
|---|---|---|
| Both on one grid | Yes, a colour each | One at a time, click to switch |
| A day with both | First layer's colour, both in the tooltip | Shown in each activity's own view |
| Span | A year, or any range | A month |
| What you install | Dashy | Tracker |
Variations
Every overlap visible
Two grids, one under the other. Same days, same columns.
```heatmap
source: Diary
field: gym
color: orange
title: Gym
```
```heatmap
source: Diary
field: read
color: green
title: Reading
```
Three or more
Add a line per activity. A layer without color gets the next free one.
```heatmap
source: Diary
layers:
- { field: gym, color: orange, label: Gym }
- { field: read, color: green, label: Reading }
- { field: meditate, label: Meditation }
```
Half a year, phone-sized
One grid over the last 182 days instead of a grid per calendar year.
```heatmap
source: Diary
layers:
- { field: gym, color: orange, label: Gym }
- { field: read, color: green, label: Reading }
range: 182d
```
Holidays marked
Days whose note sets vacation get a hatched cell, over any colour they have.
```heatmap
source: Diary
layers:
- { field: gym, color: orange, label: Gym }
- { field: read, color: green, label: Reading }
skip_field: vacation
```
If a block shows an error
A block that cannot draw says why, inside the note. The usual three:
layersandfieldare both set. Keeplayersand delete the block's ownfieldline.coloris ignored. Acolorat the top of the block does nothing withlayers. Put one on each layer.- Layer 2: No note in the selection has "read". The property is misspelled, or the notes are in another folder.
Related guides

Counts, streaks and a year of days from daily note checkboxes.

Friday joins up with Monday. Holidays do not end the run.

A number summed by week, with a goal line.
Dashy is in Obsidian's community plugins. Search for Dashy, install, enable, then paste the note above.