Reference/progress.md
progress: how far along
Properties
code block
progresskeys
2 on the block, 17 on each bar
checked on
Dashy 1.5.2
Bars towards a goal: how far a number has come against a target.
From the demo vault
```progress
items:
- { label: Days logged this year, source: Diary, agg: count, goal: 365, icon: 📔 }
- { label: Books this year, source: Books, period: year, date_field: finished, agg: count, goal: 24, icon: 📚 }
- { label: Steps, source: Diary, field: steps, agg: sum, goal: 3000000, unit: steps, sub: three million }
```
renders as
A minimal block
The shortest config worth pasting. Change the folder and the property names to yours.
```progress
items:
- { label: Days logged this year, source: Diary, agg: count, period: year, goal: 365 }
- { label: Running volume, source: Diary, field: distance_km, agg: sum, goal: 200, unit: km }
```
Keys on the block
| Key | What it does | Type | Default |
|---|---|---|---|
columns |
columns in the grid, 1 to 4; without it every bar is its own row | number | 1 |
items required |
the list of bars | list | none |
Keys on each bar
Each entry under items is one bar.
| Key | What it does | Type | Default |
|---|---|---|---|
label requiredalso title, name |
caption above the bar | text | none |
goal requiredalso target |
the target to fill towards; must be above zero; a duration like 8h or 7:30 works too, read as minutes, and a plain number against a field of durations means minutes |
number or text | none |
sourcealso folder, from |
folder; includes nested ones | text | none |
tag |
tag, with or without the hash | text | none |
where |
a condition like year = 2026, rating >= 4, tags contains books, or several that must all hold: joined with and (year = 2026 and rating >= 4) or written as a list ([year = 2026, "rating >= 4"]). The field name may be a dotted path into a nested property, like health.sleep > 70. or is not supported; quote a value holding the word and or or. One unreadable condition drops the whole filter with a warning, and the numbers are drawn unfiltered |
text or list | none |
period |
narrow to a window ending today: week, month, year (the current calendar one) or a rolling count of days like 30d. The goal is measured against the period's value; notes without a date are left out first. A week starts on the first day of the interface language, Dashy's own when one is picked in its settings, otherwise Obsidian's: Sunday in English, Monday in most European languages |
text or number | none |
date_field |
a date frontmatter property to read instead of the note name: 2026-03-02 or 2026-03-02T10:30, or a dotted path into a nested property like meta.date. Feeds period's window and the streak, current_streak and latest readings; has no effect on count, sum, avg, min or max without period |
text | none |
fieldalso property, prop |
numeric frontmatter property, or a checkbox (ticked counts as 1, unticked as 0), dotted for a nested one like health.sleep; required for everything but count, streak and current_streak. A field missing from the whole selection, or holding text rather than a number, shows a dash and a warning naming it; count text instead with where: "field contains ..." and agg: count. A duration string like 5h 58min, 1h30m, 45m, 90 min or 7:30 counts as minutes, and sum, avg, min, max or latest over a field of durations shows 5h 58m; H:MM is always a duration, never a time of day. A field mixing durations and plain numbers counts both as minutes, shows a plain number and warns naming a note of each kind |
text | none |
aggalso aggregate |
count sum avg min max latest streak current_streak | text | count |
at_least |
with agg: streak or current_streak only: a day counts only once its notes' field values, summed for that day, reach this, like at_least: 5000 steps; combine with at_most for a range. Needs field; ignored on any other aggregate. Takes a duration like 7h or 7:30 too, read as minutes; a plain number against a field of durations means minutes |
number or text | none |
at_most |
with agg: streak or current_streak only: a day counts only while its notes' field values, summed for that day, stay at or under this, like at_most: 5 cigarettes; combine with at_least for a range. Needs field; ignored on any other aggregate. Takes a duration like 7h or 7:30 too, read as minutes; a plain number against a field of durations means minutes |
number or text | none |
days |
with agg: streak or current_streak only: weekdays makes Saturday and Sunday transparent, so they neither break the run nor add to it, whatever they hold; all, the default, counts every day. Ignored on any other aggregate |
text | all |
skip_field |
with agg: streak or current_streak only: a property marking a day special, like vacation: true or sick: flu; a day is special once any note landing on it sets the property to anything other than false, a blank string, 0 or absent. A special day neither breaks the run nor adds to it, whatever field holds, the same way days: weekdays treats a weekend, and the two combine. Ignored on any other aggregate |
text | none |
unit |
a suffix after the numbers: km, %, d. Ignored, with a warning, on a value shown as a duration, which carries its own units. | text | none |
precision |
decimal places, 0 to 6; by default a whole number stays whole and a fraction gets one decimal; no effect on a value shown as a duration | number | none |
iconalso emoji |
emoji | text | none |
sub |
small caption under the bar | text | none |
How it behaves
- Going past the goal is shown as it is, 125% stays 125%; only the bar itself stops at full.
countover nothing reads a plain0and an empty bar; every other aggregate, andstreakorcurrent_streakwith afieldset, shows a dash instead: "no data" and "zero" are different answers.streakcounts the longest run of consecutive days on record; label the bar "Best streak" or "Longest streak".current_streakcounts the run going on now, label it "Current streak" or "Days in a row": today never breaks it, a day not filled yet leaves the run counted up to yesterday, and only a gap on yesterday or earlier resets it. It counts within the selection afterperiod,where,tagandsource, soperiod: monthstops it at the first of the month.periodnarrows to a calendar week, month, year or a rollingNd, always ending today. A note's date is its name, as long as it starts withYYYY-MM-DD(2026-03-02 Mondaycounts,2026-03-021does not), unlessdate_fieldnames a property instead; a note with no date under either rule is left out before counting.at_least/at_mostturnstreakinto a threshold: a day counts only when its notes'fieldvalues, summed for that day, satisfy the bound,at_least: 5000on steps for example.days: weekdaysmakes Saturday and Sunday transparent forstreakandcurrent_streak: they neither break the run nor extend it, whatever they hold, so a Friday followed by a Monday is a run of two.skip_fielddoes the same for a day any note marks special,vacation: trueorsick: flufor example, and combines withdays: weekdays. All three keys apply toagg: streakandagg: current_streakonly and are ignored on every other aggregate.
Guides that use it
Dashy is in Obsidian's community plugins. Search for Dashy, install, enable, then run Dashy: Insert block and pick progress.