A weekly review in Obsidian, without Dataview
period: noterange: notecompare: usualA weekly review asks the same questions every week: how did I sleep, how often did I train, was this week normal for me. One template answers them. Its blocks take the week from the note's own name, 2026-W40, so the numbers stay that week's however late you open the note. The same cards do the monthly review.
1Properties in your daily notes
The review counts what your daily notes already hold. One property per thing you track: a number for a score or a count, a checkbox for a habit.
---
sleep_score: 83
gym: true
meditate: true
steps: 7300
---
## 2026-10-02
2026-10-02The note's name is its date. Named another way, like02.10.2026? Dashy reads the day format set in Daily notes or Periodic Notes. Without one, adddate_format: DD.MM.YYYYto the block.sleep_score: 83A number. The review averages it over the week.gym: trueA checkbox. Summed, it counts the days you ticked it.DiaryThe folder the blocks read from. Use the one your daily notes already live in.
2A note named for its week
The review lives in a weekly note, and its name says which week. Periodic Notes names them this way, or you name them yourself.
# Week 40
## What went well
## What to change
2026-W40Week 40 of 2026. This page uses ISO weeks, Monday 28 September to Sunday 4 October, as you get without Periodic Notes or with its weekly format set toGGGG-[W]WW. A month is2026-09, a quarter2026-Q3, a year2026.- Periodic NotesDashy reads the name the way Periodic Notes made it: in the weekly format set there, or, with weekly notes on and no format saved, in its default
gggg-[W]ww. That is a locale week: in an English interface it starts on Sunday, so2026-W40is 27 September to 3 October. Without Periodic Notes, the name is read as an ISO week. - The whole nameThe name has to be the week and nothing else.
2026-W40 reviewis not read as a week: the block says so instead of guessing.
3The week in numbers
Paste this block into the weekly note.
```stats
source: Diary
period: note
columns: 2
items:
- { label: Sleep, field: sleep_score, agg: avg, compare: usual, better: up }
- { label: Gym days, field: gym, agg: sum, compare: true, better: up }
- { label: Steps a day, field: steps, agg: avg, precision: 0, compare: true, better: up }
- { label: Meditation in a row, field: meditate, agg: current_streak, unit: days }
```
period: noteWritten once, next toitems, it holds for every card: each counts the week this note is named for. A card with its ownperioduses that instead.compare: usualIs this week normal for me? Sleep reads82with▼ −3, and the tooltip saysvs usual: 85: the average of every earlier note, the week itself left out. It works withagg: avg.compare: trueAgainst the week before, all seven days of it once this week is over: gym4,▲ +1,vs the week before: 3.current_streakOnce the week is over, counted back from its last day, Sunday here (Saturday for a locale week that starts on Sunday), not from today, and that day counts like any other: left unticked, the streak reads 0. While the week runs, counted back from today, and today not ticked yet does not break it. It counts inside the week, so seven days at most.
The week comes from the name, not from today. Open the note months later and every card shows the same numbers: notes dated after the week count nowhere, and compare: usual reads only the notes before it.
4A bar a day
Under the cards, the week day by day. This and the block from step 3 draw the picture above.
```chart
source: Diary
field: steps
label: Steps
type: bar
range: note
goal: 10000
```
range: noteThe seven days of the week the note is named for, a bar each. The heading names them:Steps: sum per day, Sep 28, 2026 to Oct 4, 2026.goal: 10000A dashed line at your daily goal.- A day with no noteA gap, not a zero: a day you did not log is not a day of no steps.
- Obsidian ChartsWith it turned on, write the block as
dashy-chart:chartthen belongs to Charts.
5One template, every week
Put both blocks in the note your weekly notes are made from: the template file set for weekly notes in Periodic Notes, or a note you insert with the core Templates plugin. Nothing in them names a date, so every weekly note made from it counts its own week.
- The week you are inCounts up to today.
compare: truereads the same days of last week, asperiod: weekdoes. - A week still aheadNext week's note, made early, draws no numbers yet, only a line:
This window starts on Oct 12, 2026, so there is nothing to count yet. - The template itselfIts name is not a week, so opened on its own, its blocks show an error. The notes made from it do not.
6The monthly review
A note named 2026-09 is September. Paste the step 3 block as it is: period: note now counts the month, and compare: true reads the whole of August, vs the month before: 13. For the habits, a calendar of the month.
```heatmap
source: Diary
range: note
layout: calendar
layers:
- { field: gym, color: orange, label: Gym }
- { field: meditate, color: purple, label: Meditation }
```
range: noteWithlayout: calendar, the month the note is named for:September 2026, a dot under each day for each habit you kept. Nothing is dimmed once the month is over.- CaptionThe days with at least one dot, out of the month's days:
Gym, Meditation: 28 of 30 days. - In a weekly noteThe same block draws that week as one row.
More on the calendar, colours and days off: a monthly habit calendar.
The whole templates
Ready to paste into your weekly and monthly templates. The cards are the same block in both.
```stats
source: Diary
period: note
columns: 2
items:
- { label: Sleep, field: sleep_score, agg: avg, compare: usual, better: up }
- { label: Gym days, field: gym, agg: sum, compare: true, better: up }
- { label: Steps a day, field: steps, agg: avg, precision: 0, compare: true, better: up }
- { label: Meditation in a row, field: meditate, agg: current_streak, unit: days }
```
```chart
source: Diary
field: steps
label: Steps
type: bar
range: note
goal: 10000
```
## What went well
## What to change
```stats
source: Diary
period: note
columns: 2
items:
- { label: Sleep, field: sleep_score, agg: avg, compare: usual, better: up }
- { label: Gym days, field: gym, agg: sum, compare: true, better: up }
- { label: Steps a day, field: steps, agg: avg, precision: 0, compare: true, better: up }
- { label: Meditation in a row, field: meditate, agg: current_streak, unit: days }
```
```heatmap
source: Diary
range: note
layout: calendar
layers:
- { field: gym, color: orange, label: Gym }
- { field: meditate, color: purple, label: Meditation }
```
## The month in a few lines
Ask your agent
With Dashy's skill installed, an AI agent can write this from a request in plain words: it looks at your property names and folders first, then writes the blocks. Open the note in Reading view and paste any error a block shows back to the agent.
In my weekly review template, add numbers that count the week each review note is named for: my average sleep against my usual level, gym days and steps a day against the week before, and how many days in a row I have meditated. Under them, a bar a day for my steps with a line at 10,000. Put the same numbers in my monthly review template, with a month calendar of gym and meditation days instead of the steps chart.
What comes back is something like the templates above. The agent's YAML may differ from the guide's, with your own property names and labels, but it should do the same, and this guide is the reference to compare it against. More on working with an agent.
What it does not do
- No lists of notes. Dashy counts the books you finished this month, but it has no block that lists them. A list of the period's notes is still a query.
- The name is the period.
period: notein a note named anything else is an error, not a guess. For a note named otherwise, write the week out:period: 2026-W40, orrange: 2026-W40on a chart or heatmap. - No offset. There is no
note-1for the week before.compare: truealready measures against it; any other week, write it out.
The same review with dataviewjs
The usual way today: a script reads the week from the note's name and adds up the daily notes in it.
```dataviewjs
const start = dv.luxon.DateTime.fromFormat(dv.current().file.name, "kkkk-'W'WW");
const end = start.endOf("week");
const days = dv.pages('"Diary"')
.where(p => p.file.day && p.file.day >= start && p.file.day <= end);
const sleep = days.sleep_score.array().filter(v => typeof v === "number");
dv.table(["", "This week"], [
["Sleep", sleep.length ? (sleep.reduce((a, b) => a + b, 0) / sleep.length).toFixed(1) : "-"],
["Gym days", days.where(p => p.gym === true).length],
]);
```
- Needs Enable JavaScript queries in Dataview's settings. It is off by default.
- The name is read as an ISO week, as written. A locale week from Periodic Notes is more code: Luxon has no token that parses it.
- Last week, your usual level and the arrows are more code: the same loop over other dates. A bar a day is a second script, with Obsidian Charts.
| Dashy | dataviewjs | |
|---|---|---|
| The week from the name | period: note | fromFormat on the name |
| Against last week | compare: true | Write it |
| Against your usual | compare: usual | Write it |
| A bar a day | range: note | A second script and Obsidian Charts |
| What you install | Dashy | Dataview, JavaScript queries on |
Variations
This week's habits as a row
The calendar block from step 6, pasted into the weekly note: seven days, a dot for each habit you kept.
```heatmap
source: Diary
range: note
layout: calendar
layers:
- { field: gym, color: orange, label: Gym }
- { field: meditate, color: purple, label: Meditation }
```
A week written out
In a note with any other name, say a project log, name the week in the block.
```stats
source: Diary
period: 2026-W40
items:
- { label: Gym days, field: gym, agg: sum, compare: true, better: up }
```
A season
from and to, both days included. compare: true reads as many days right before from.
```stats
source: Diary
period: { from: 2026-09-01, to: 2026-09-14 }
items:
- { label: Gym days, field: gym, agg: sum, compare: true, better: up }
```
Daily notes named 02.10.2026
When Daily notes or Periodic Notes has no such day format set, say how the names are written.
```stats
source: Diary
period: note
date_format: DD.MM.YYYY
items:
- { label: Sleep, field: sleep_score, agg: avg, compare: usual, better: up }
```
If a block shows an error
A block that cannot draw what you asked for says why, inside the note. The ones you are likely to see here:
period: noteneeds a note named like a day, week, month, quarter or year, and this note is "Weekly review". The block sits in a note whose name is not a period: the template itself, or a name with words after the week. The message lists the formats it reads.compare: usualworks only withagg: avg. The usual level is an average. On asumcard, usecompare: true.- no history before this period, in grey where the arrow would be.
compare: usualfound no earlier note to average: your first week of notes. It is not an error.
Related guides

This month as a calendar, a dot in each habit's colour.

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

Weekly bars with a goal line, from frontmatter.
Dashy is in Obsidian's community plugins. Search for Dashy, install, enable, then paste the templates above.