progress
Dashy vault/Reference/progress
Reference/progress.md

progress: how far along

Properties
code block
progress
keys
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
```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
Three progress bars, one past its goal and coloured green

A minimal block

The shortest config worth pasting. Change the folder and the property names to yours.

progress
```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

KeyWhat it doesTypeDefault
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.

KeyWhat it doesTypeDefault
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.
  • count over nothing reads a plain 0 and an empty bar; every other aggregate, and streak or current_streak with a field set, shows a dash instead: "no data" and "zero" are different answers.
  • streak counts the longest run of consecutive days on record; label the bar "Best streak" or "Longest streak". current_streak counts 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 after period, where, tag and source, so period: month stops it at the first of the month.
  • period narrows to a calendar week, month, year or a rolling Nd, always ending today. A note's date is its name, as long as it starts with YYYY-MM-DD (2026-03-02 Monday counts, 2026-03-021 does not), unless date_field names a property instead; a note with no date under either rule is left out before counting.
  • at_least/at_most turn streak into a threshold: a day counts only when its notes' field values, summed for that day, satisfy the bound, at_least: 5000 on steps for example. days: weekdays makes Saturday and Sunday transparent for streak and current_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_field does the same for a day any note marks special, vacation: true or sick: flu for example, and combines with days: weekdays. All three keys apply to agg: streak and agg: current_streak only and are ignored on every other aggregate.