.base at it, and the table is live.
A Base is a YAML file that points at a folder or tag, treats every matching note's frontmatter as a row, and renders the result as a sortable, filterable, editable table or card grid [1]. Edits flow both ways — change a cell, the note's frontmatter changes. For an intermediate user with messy reference notes, the upgrade path is five clicks. The catch: Bases only reads YAML frontmatter, not inline key::value or inline tasks [30].
# Filter the whole vault to a single folder filters: and: - file.folder.contains("Books") - file.ext != "base" formulas: Title: link(file.path, title) Rating: if(rating == null, "N/A", ["⭐", rating.toString()].join(" ")) Cover: image(cover) views: - type: table name: "All books" order: [title, author, status, rating, pages] sort: - { property: status, direction: ASC } - type: cards name: "5★" filters: { and: [rating == 5] }
| title | author | status | rating | pages |
|---|---|---|---|---|
| Designing Data-Intensive Apps | Kleppmann | read | ⭐ 5 | 616 |
| A Pattern Language | Alexander | now | ⭐ 4 | 1216 |
| Thinking in Systems | Meadows | queue | — | 240 |
| The Information | Gleick | read | ⭐ 4 | 544 |
| House of Leaves | Danielewski | queue | — | 709 |
Cmd/Ctrl; in any note. Mass-edit via the Properties sidebar by selecting multiple notes [24].
Tick frontmatter keys in the "Properties" panel. Keep file.path while you debug, then delete it [14].
"Add view" stores type + filters + order. "All books" / "To read" / "5★" coexist as tabs [10].
# the whole grammar fits in five keys filters: # global conditions applied to every view formulas: # custom calculated properties properties: # display config for columns summaries: # custom aggregations views: # named views (table / cards / list / map)
and / or / not over file.hasTag(), file.inFolder(), file.hasLink() and property comparisons. Two layers: a global filter, then a per-view filter [6].image(cover), link(file.path, title), date arithmetic with "1M" / "2h" duration strings [4].```base fence or transclude with ![[Library.base#5★]] [10].Folder-scoped library with All Books, Queue, Published, Series Cards, By Year, Current Year. Cover formula image(cover), rating renders as stars [15].
filters: and: - file.folder.contains("Reading") formulas: Rating: if(rating==null,"N/A",...)
Standardises status, passion (1–5), deadline, progress (0–100). Display formulas render emoji ratings and progress bars [18].
status: In Progress passion: 5 deadline: 2026-08-19T12:51 progress: 60
Embed a base inside a person's note that filters Attendees.contains(this.file). The single most useful Bases trick — lights up the graph by reading existing links as data [20].
filters: and: - Type == "Meeting" - Attendees.contains(this.file)
Ready-to-use movie/TV shape: title, type, status, priority, rating, dates, progress, external_link — drops straight into a Bases source schema with no rework [21].
type: movie status: Watchlist priority: 3 rating: null
Tags notes #🍽️/recipe and uses a multi-select ingredients property curated from common cooking ingredients via Metadata Menu — portable to ingredients.contains("garlic") [23].
filters: and: - file.hasTag("recipe") - ingredients.contains("garlic")
Parses the daily-note filename as a date, exposes month/day/year as formula columns, filters on month == today().month && day == today().day [19].
formulas: Month: file.name.slice(5,7) Day: file.name.slice(8,10)
A cards-view index of every other base, using file.basename + ".jpg" as the cover-image formula — a visual launcher that replaces the homepage MOC you were maintaining by hand [22].
formulas: Cover: image(file.basename + ".jpg") views: - { type: cards, image: Cover }
Books note with a readDates array property; a "Read 2025" view filters on the formula readDates.filter(value.toString().contains("2025")) [17].
readDates: [2024-03-12, 2025-11-08] # view filter: readDates.filter(value.toString().contains("2025"))
.md
Operators: arithmetic + - * / % (), comparison == != > < >= <=, boolean ! && ||. Dates accept duration-string arithmetic — date + "1M", date - "2h". Global functions: if, now, today, date, duration, link, list, min/max, number, image, icon [41].
Live-update gotcha: plugins that write via app.vault.modify() can leave the metadata index stale until Settings → Files and Links → Rebuild Cache [42].
Spec-style comparisons. Editable grids. The workhorse.
Image-led views — books, films, recipes. Cover formula + cover/contain fit [12].
Bullets or numbered indexes. Less metadata, more prose.
Pinned locations on an interactive map.
key::value + inline tasks — the structural advantage [30]Pragmatic rule: rebuild new dashboards in Bases, keep Dataview alive for grouped or task-heavy queries you'd otherwise have to restructure your vault to migrate [26].
Handles fields, aliases, FROM, WHERE, SORT, LIMIT, and GROUP BY. DataviewJS is explicitly unsupported. Inline key::value data must first be lifted into frontmatter via the Dataview-to-Properties plugin before Bases can see it [25] [24].
Side-by-side boards for status columns — the most-requested replacement for the Kanban community plugin [37].
Date-property notes pinned to a calendar grid — the natural pair to daily-notes bases [37].
Bases rendering on obsidian.md Publish — the last major gap holding back externalised personal sites [37].
1.10's Bases plugin API already lets community plugins ship custom view layouts (Maps was the proof-of-concept), so expect Gantt / timeline / chart views from the community before Obsidian ships them natively [2].
The view is downstream of the data; the data is the work. An empty Base is two clicks. A Base over a folder with no consistent frontmatter shows nothing — and you'll blame Bases.
Start with one folder. Add four properties. Then open Bases. The whole thing should take an evening, not a weekend.
file.mtime.relative() or an Overdue badge.Folders → links → MOCs. One wikilink per note as the rule.
The metadata layer Bases queries. Read this before you build.
Five-line daily template. One hotkey. One mobile pathway.
The keyboard-first plugin pack. What to enable, what to skip.