← Default view
atlas/obsidian roadmap/bases.live 42 sources 11 min expedition
// core plugin · obsidian 1.9 · shipped 2025-05-21

Your messy folder of notes is already a database. Add four properties, point a .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].

5
click-path steps
4
view types (T/C/L/M)
~90%
dataview replacement
4.4/5
community score
live · bidirectional

The .base on the left renders the table on the right.

edit a cell → frontmatter updates
Library.base YAML
# 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] }
Library — All books TABLE
All books
5★
Queue
+
file.folder contains "Books" 14 rows · editable
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
YAML defines columns and filters. Obsidian renders the table. Cells are editable → write back to frontmatter. Refined in 1.9.2 with chainable file properties.
click-path

Five steps from messy folder to live view.

no formulas required in step 1–5
1

Stamp properties

Cmd/Ctrl; in any note. Mass-edit via the Properties sidebar by selecting multiple notes [24].

2

Create the base

Bases: Create new base drops a .base beside the active note [9].

3

Set the filter

"Filters" → filehas tag or in folder. Three idioms cover 90% of cases [13].

4

Pick columns

Tick frontmatter keys in the "Properties" panel. Keep file.path while you debug, then delete it [14].

5

Save named views

"Add view" stores type + filters + order. "All books" / "To read" / "5★" coexist as tabs [10].

syntax

Anatomy of a .base file.

five top-level keys, all optional except views
# 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)
filters
Nested and / or / not over file.hasTag(), file.inFolder(), file.hasLink() and property comparisons. Two layers: a global filter, then a per-view filter [6].
formulas
Computed columns — image(cover), link(file.path, title), date arithmetic with "1M" / "2h" duration strings [4].
properties
Per-column display config — width, display name, hidden flags.
summaries
Aggregations at the bottom of a view: count, sum, avg.
views
One or more named views. Each stores its own type, filters, ordering, limit. Embed inline with a ```base fence or transclude with ![[Library.base#5★]] [10].
steal these

Recipe tiles — six bases worth copying tonight.

each one a real schema + YAML excerpt
⭐ 16

Book library

uroybd/Book-Base · 6 views

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",...)
forum

Project / task tracker

forum template · 4 keys

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
↔ this.file inverse-link

Meetings + people

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)
⭐ 25

Media log

Obsidian-TV-Tracker · frontmatter schema

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
🍽️ multi-select

Recipes

recipe-sheet · ~300 ingredients

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")
on this day daily

"On This Day" daily-notes

home-base tutorial · flashback

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)
📚 base of bases launcher

Base-of-Bases home page

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 }
practicalpkm

Yearly reading log

tamarisk.it · array filter

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"))
formula language

What "live" actually means.

small grammar, learnable in an afternoon
useful starter formulas — copy verbatim
Overdue badge
if(due && status != "Done" && due < today(), "Overdue", "")
"Overdue" · ""
Days until due
((due - today()) / 86400000).round()
7 · -2 · 41
Relative edit time
file.mtime.relative()
"3 days ago"
Group key (areas)
list(area).unique().sort().join(", ")
"Health, Work"
Rating stars
if(rating==null,"N/A",["⭐",rating.toString()].join(" "))
"⭐ 5"
Cover image
image(cover)
<img>
file.* — every row exposes these
file.name
filename without .md
file.path
full vault path
file.folder
parent folder path
file.tags
list of tags
file.links
list of internal links
file.ctime
created datetime ⚠ date() buggy
file.mtime
last-modified datetime
file.size
bytes on disk

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].

view types

Four built-in renderers. Two shipped May'25, two Oct'25.

community plugins now ship more via the Bases API

Table 1.9 · May'25

Spec-style comparisons. Editable grids. The workhorse.

Cards 1.9 · May'25

Image-led views — books, films, recipes. Cover formula + cover/contain fit [12].

List 1.10 · Oct'25

Bullets or numbered indexes. Less metadata, more prose.

Map 1.10 · Oct'25

Pinned locations on an interactive map.

⚠ needs the Maps plugin
migration decision

Bases vs Dataview — what the comparison actually says.

HN consensus: "like 90% replacement and faster"

Basescore plugin

YAML + visual editor · writes back
Status
Core plugin · active dev · "biggest update since Properties" [7]
Editing
Cells editable — writes back to frontmatter [1]
Reads
YAML frontmatter only — no inline key::value, no inline tasks [30]
GROUP BY
In development — per-view filters as a poor substitute [24]
Performance
Fast on large vaults [5] · can stutter even at 50 notes [35]
Views
Table · Cards · List · Map + plugin API [11]
Publish
Planned, not shipped [37]

Dataview⭐ 9.0k

DQL + DataviewJS · read-only
Status
Community · slow maintenance · v0.5.70 Apr 2025 [29] · "resting in academic sabbatical" [28]
Editing
Read-only · "could fetch data, could not make changes" [27]
Reads
Inline key::value + inline tasks — the structural advantage [30]
GROUP BY
Mature
Performance
Noticeable lag, esp. mobile [5]
Views
Table · List · Task · DataviewJS escape hatch
Publish
Unsupported [27]

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].

migration tool · ⭐ 52

Bases-Toolbox converts Dataview TABLE → .base

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].

known issues

Gotchas matrix — eleven things to expect.

community score 4.4/5 · "still a bit of a work in progress"
structural
No inline tasks / inline key::value [31]
major
No GROUP BY yet [24]
bug
date() fails on ISO8601 with seconds + offset · file.ctime formulas broken [32]
ui
Horizontal scroll broken on wide tables [33]
bug
Array-property equality filters stale [34]
perf
Stutter even on ~50-note datasets [35]
mobile
iOS renders empty rows despite synced data [36]
mobile
iPad: create/duplicate view doesn't focus [39]
ui
Embedded base has no height limit / scroll [40]
bug
this rebinds inside embedded code-fence base [6]
roadmap
Publish support not shipped [37]
roadmap signal

What's shipping next.

community plugins ship layouts before Obsidian does
in progress

Kanban view

Side-by-side boards for status columns — the most-requested replacement for the Kanban community plugin [37].

planned

Calendar view

Date-property notes pinned to a calendar grid — the natural pair to daily-notes bases [37].

planned

Publish support

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].

your turn

For an intermediate user, do this — this week.

six steps · zero formulas in the first four
// the rule that matters

Build the data before the view.

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.

The trap to avoid: building a Base before the underlying notes have consistent frontmatter. The view is downstream of the data, and the data is the work [24].
// six steps · this week
  1. Pick one messy folder of reference notes you query mentally ("books I want to read", "side projects").
  2. Add 2–4 consistent properties to those notes. Use the Properties view to mass-edit.
  3. Create one base on that folder with a Table view. Spend zero time on formulas.
  4. Add a second named view: a filtered subset (status / rating / tag).
  5. Only after both views feel useful, add one formula column — start with file.mtime.relative() or an Overdue badge.
  6. Bookmark or pin the base in your sidebar — it replaces the homepage MOC you were maintaining by hand.
in this expedition

Adjacent chapters — what to read next.

five chapters in adoption order
primary sources

42 citations · top 12 shown.

official docs + forum threads + practitioner blogs