Effortless Pantry-Tracking in Obsidian with Bases
While some users rely on Dataview for advanced querying, Bases gives you spreadsheet-style editing and live formulas with far less setup—perfect for a lightweight pantry tracker.
1 Set up a single Pantry folder
Forget meal plans and recipe files. Everything lives in /Pantry/:
Vault/
└── Pantry/
├── Chicken Breast.md
├── Olive Oil.md
└── Pantry.baseA lean structure means fewer moving parts—and zero maintenance headaches.
2 Create an ingredient note
---
item: Chicken Breast
on_hand: 750 # grams you have now
reorder_point: 250 # when to restock
---
Duplicate this file, rename it **Olive Oil.md**, change just the three numbers. Repeat for every food you track.
3 Build Pantry.base
3.1 Click-through (GUI)
- ⌘ P (Mac) or Ctrl P (Win/Linux) → start typing “Bases: Create new base” and hit Enter.
Open the file → press ✏︎ Edit base.
Source → Folder → Pantry.
Add three Property columns: Item, On hand (g), Reorder at (g).
Click + Add column → Formula, name it Need to buy (g), and paste:
max(0, reorder_point - on_hand)
- Save—the live table appears.
Already have ingredient notes? The table back-fills instantly: no refresh needed.
Copy-paste (YAML)
---
bases:
source: "folder(Pantry)"
columns:
- label: Item
value: item
- label: On hand (g)
value: on_hand
- label: Reorder at (g)
value: reorder_point
- label: Need to buy (g)
formula: max(0, reorder_point - on_hand)
---
If *Need to buy shows “—”*, reopen the editor and set its column type to **Formula** - Bases sometimes reset after a paste.
4 Daily workflow - two steps
Cook → open each used note → overwrite on_hand.
Glance at Pantry.base.
Any row where Need to buy (g) > 0 is your live shopping list.
5 Embed the grocery list on your dashboard
Add one line inside your dashboard note:
![[Pantry/Pantry.base]]

The grocery table refreshes instantly anywhere it’s embedded
Renaming **Pantry.base** will break the embed update links if you ever change the file name.
6 Fine-tuning (optional)
Adjust reorder_point as you learn real-world consumption.
Add last_updated if you want age tracking.
Duplicate Pantry.base as Grocery Only.base and add
filter: “Need to buy (g) > 0” for a cleaner view.
That’s the whole system-one folder, one table, no scripts. Enjoy never running out of broccoli again!
Conclusions
Bases vs Dataview: Dataview excels at deep, SQL-like queries and can mash data from any corner of your vault. Bases, in contrast, feels more like a live spreadsheet: you change a number, a formula recalculates instantly, and the result can be embedded anywhere. For a simple “How many grams of broccoli do I have?” workflow, that immediacy wins.
That said, the setup you’ve just seen is deliberately minimal. You could layer on:
- Early-warning columns (
days_left,at_risk) - Buttons for one-click stock decrements
- Scripts that auto-log purchases
…but none of that is required to keep your grocery list accurate.
Bases is still in beta. Expect new column types, improved filters, and UI tweaks over the next few months.