Weekly chart without Tracker
Dashy vault/Guides/Weekly chart without Tracker
Guides/Weekly chart without Tracker.md

A weekly chart in Obsidian without Tracker

Properties
blocks
chart
reads
number properties in daily notes
needs dataview
checked on
Dashy 1.5.2

You log a number in each daily note and want the weekly total as bars, with a line for your goal. Tracker draws a bar per day and has no way to add a week up. Dashy's chart block does it in six lines.

Obsidian Charts turned on? Write dashy-chart

Obsidian Charts also uses the chart code block. When Charts is on, Dashy leaves chart to it, so your Charts blocks keep working. Name the blocks below dashy-chart instead of chart: same keys, always Dashy.

Weekly bars of running distance over half a year, a dashed goal line at 30 km, the current week drawn lighter
What you have at the end of step 2. Two weeks with no runs are a gap, not a zero. From a demo vault.

1Put the number in a property

Dashy reads frontmatter only: the Properties at the top of a note. One number property per thing you measure.

Diary/2026-09-14.md
---
run_km: 8.5
---

## 2026-09-14
  • 2026-09-14The note's name is its date. That is how a value lands in its week.
  • run_km: 8.5A plain number. A day with no run leaves the property out.

Coming from Tracker, your numbers may live in the text of the note, as a tag or a Dataview inline field. Dashy does not read either. Move each one into a property, by hand or with find and replace:

Before: in the text
Easy run by the river. #run:8.5

run_km:: 8.5
After: a property
---
run_km: 8.5
---

Easy run by the river.

2Add it up by week

Make a note for the chart, say Running.md, and paste this block. It draws the picture above.

Running.md
```chart
source: Diary
field: run_km
type: bar
bucket: week
unit: km
goal: 30
```
  • bucket: weekAdds up every value in a week. The week starts on Monday or Sunday, as your language has it.
  • type: barBars. Leave it out for a line.
  • goal: 30A dashed line at 30, with its value. The axis always stretches to show it.
  • RangeBy default the last 182 days for weeks. range: 90d or range: year to change it.

The week you are in is drawn lighter, and its tooltip says "so far". A week with no runs is a gap, never a zero. Hover a bar for its total.

3Several numbers side by side

Up to four properties on one chart with series, each its own bar. Times work as they are written: 51min, 1h 12m, 0:48:30.

Running.md
```chart
source: Diary
type: bar
bucket: week
series:
  - { field: run_time, label: Run }
  - { field: bike_time, label: Bike, color: orange }
  - { field: swim_time, label: Swim, color: cyan }
```
renders as
Grouped weekly bars for run, bike and swim time, the y axis labelled in hours

Bars stand side by side, never stacked, on one axis. For two numbers on different scales, steps and sleep for example, use two chart blocks.

The whole note

Both charts in one piece, ready to paste into an empty note.

Running.md
```chart
source: Diary
field: run_km
type: bar
bucket: week
unit: km
goal: 30
```

```chart
source: Diary
type: bar
bucket: week
series:
  - { field: run_time, label: Run }
  - { field: bike_time, label: Bike, color: orange }
  - { field: swim_time, label: Swim, color: cyan }
```

The same chart with Tracker or dataviewjs

Both read the same run_km property.

With the Tracker plugin
```tracker
searchType: frontmatter
searchTarget: run_km
folder: Diary
startDate: -6M
endDate: 0d
bar:
    title: Running
    yAxisLabel: Distance
    yAxisUnit: km
```
  • One bar per day. Tracker has no setting to add up a week; that is an open request.
  • Tracker's docs list no goal line for bar or line charts.
  • Tracker also reads tags (searchType: tag), inline fields (searchType: dvField) and text. If you keep it for that, keep it.
With Dataview and Obsidian Charts
```dataviewjs
const weeks = {};
for (const p of dv.pages('"Diary"').where(p => p.run_km && p.file.day)) {
  const key = p.file.day.startOf("week").toFormat("yyyy-MM-dd");
  weeks[key] = (weeks[key] ?? 0) + p.run_km;
}
const labels = Object.keys(weeks).sort().slice(-26);
window.renderChart({
  type: "bar",
  data: { labels, datasets: [{ label: "Run, km", data: labels.map(k => weeks[k]) }] },
}, this.container);
```
  • Two plugins: Dataview with Enable JavaScript queries on, and Obsidian Charts for renderChart.
  • A week with no runs has no key in weeks, so it drops off the axis instead of showing as a gap.
The same weekly running chart twice: the dataviewjs and Obsidian Charts version with rotated ISO week labels and the no-run weeks missing from its axis, and the Dashy chart with the empty weeks as a gap and a dashed 30 km goal line
This script on top, the Dashy block from step 2 below. Same notes.
DashyTrackerdataviewjs
Weekly totalsbucket: weekNo, a bar per dayGroup in code
A week with no dataA gapDays with no note have no barDrops off the axis
Goal linegoalNot in the docsWrite it
Reads tags and inline fieldsNo, properties onlyYesInline fields, yes
What you installDashyTrackerDataview and Obsidian Charts

Variations

By month, this year

A bar per calendar month, from 1 January to today.

chart
```chart
source: Diary
field: run_km
type: bar
bucket: month
range: year
unit: km
```

A weekly average

Sleep is not a total. agg: avg takes the week's average instead of its sum.

chart
```chart
source: Diary
field: sleep
agg: avg
bucket: week
goal: 8h
```

Habit days per week

A checkbox sums to the number of ticked days in each week.

chart
```chart
source: Diary
field: gym
type: bar
bucket: week
goal: 3
```

Notes per week

agg: count needs no property: it counts the dated notes in each week.

chart
```chart
source: Diary
agg: count
type: bar
bucket: week
```

If a block shows an error

A Dashy chart that cannot draw says why, inside the note. The usual three:

  • An error from Obsidian Charts, not from Dashy. With Charts on, a chart block is Charts'. Write dashy-chart.
  • None of the selected notes has a name starting with a date like YYYY-MM-DD. Rename the daily notes, or add date_field: date if the date is a property.
  • "run_km" holds text or another value that is not a number. Something like run_km: 8.5 km. Keep the number alone and put the unit in unit: km.