Query Your Saved Web Content With Obsidian Dataview
You’ve been saving web content to Obsidian for weeks. Your vault has 50, maybe 100 clipped articles. But finding the right one means scrolling through folders or relying on full-text search.
Dataview changes this. It treats your Markdown files like a database --- query them by metadata, filter by tags, sort by date, and build dashboards that update automatically.
Here’s how to set it up for your web clips.
What Dataview Does
Dataview is an Obsidian plugin that lets you query your notes using a SQL-like syntax. Every Markdown file becomes a row. Every frontmatter field becomes a column. Every query returns a live, auto-updating table.
The Foundation: Frontmatter
Dataview’s power depends on consistent frontmatter in your clipped files. When you save web content with Save, add this metadata:
---
title: "React Server Components: A Complete Guide"
source: "https://example.com/rsc-guide"
clipped: 2026-03-15
type: article
status: unread
tags: [react, server-components, performance]
rating:
---
Fields that make web clips queryable:
- clipped --- when you saved it
- type --- article, tutorial, documentation, paper, thread
- status --- unread, reading, read, processed
- rating --- 1-5 after you’ve read it (leave blank initially)
- tags --- topics covered
Essential Queries
Reading Queue
See all unread clips, newest first:
```dataview
TABLE title, type, clipped
FROM "clips"
WHERE status = "unread"
SORT clipped DESC
```
Recently Read
What you’ve processed in the last 30 days:
```dataview
TABLE title, rating, tags
FROM "clips"
WHERE status = "read" AND clipped >= date(today) - dur(30 days)
SORT rating DESC
```
Best Content by Topic
Find your highest-rated clips on a specific topic:
```dataview
TABLE title, rating, source
FROM "clips"
WHERE contains(tags, "react") AND rating >= 4
SORT rating DESC
```
Content Type Breakdown
How many of each type you’ve saved:
```dataview
TABLE length(rows) AS Count
FROM "clips"
GROUP BY type
SORT length(rows) DESC
```
Clips Needing Processing
Find saved content you haven’t reviewed yet:
```dataview
TABLE title, type, clipped
FROM "clips"
WHERE !rating
SORT clipped ASC
LIMIT 10
```
Building a Research Dashboard
Create a note called Dashboard.md that aggregates all your queries:
# Research Dashboard
## Reading Queue ({{date}})
### Unread Articles
(dataview query here)
### In Progress
(dataview query here)
## This Week's Saves
(dataview query here)
## Top Rated Content
(dataview query here)
## By Topic
(dataview query here)
This dashboard updates automatically every time you open it. No manual maintenance required.
Advanced: Inline Queries
Dataview also supports inline queries within your notes. Reference clip counts or metadata anywhere:
I've saved `= length(filter(pages("clips"), (p) => p.status = "read"))` articles
this month, with an average rating of
`= round(average(filter(pages("clips"), (p) => p.rating).rating), 1)`.
This renders as plain text: “I’ve saved 23 articles this month, with an average rating of 3.8.”
DataviewJS for Complex Queries
For more complex analysis, use DataviewJS (JavaScript):
```dataviewjs
// Show clips per week over the last 8 weeks
const clips = dv.pages('"clips"')
.where(p => p.clipped)
.sort(p => p.clipped, 'desc');
const weeks = {};
for (const clip of clips) {
const week = clip.clipped.toFormat("yyyy-'W'WW");
weeks[week] = (weeks[week] || 0) + 1;
}
dv.table(
["Week", "Clips Saved"],
Object.entries(weeks).slice(0, 8).map(([week, count]) => [week, count])
);
```
Tips for Clean Data
Use a Template
Create a clip template with pre-filled frontmatter so every save is consistent:
---
title: ""
source: ""
clipped: {{date}}
type: article
status: unread
tags: []
rating:
---
Normalize Your Tags
Pick a standard set and stick with it. react not React or reactjs. performance not perf or web-performance. Inconsistent tags break Dataview queries.
Update Status After Reading
The status field only works if you update it. When you finish reading a clip, take 10 seconds to change status: unread to status: read and add a rating.
Keep Source URLs
The source field lets you always go back to the original. Dataview can render these as clickable links:
```dataview
TABLE title, "[Link](" + source + ")" AS Source
FROM "clips"
WHERE status = "read"
SORT clipped DESC
LIMIT 20
```
Why Clean Markdown Matters Here
Dataview queries your frontmatter, but you also search clip content regularly. This is where Save’s clean extraction pays off.
When you search your vault for “server components streaming,” you want to find relevant paragraphs in your clips --- not navigation menus, cookie banners, or sidebar widgets. Clean Markdown means clean search results.
Getting Started
- Install the Dataview plugin in Obsidian (Community Plugins → Search “Dataview”)
- Install Save for clean web clipping
- Add frontmatter to your next 5 clips using the template above
- Create a Dashboard note with the reading queue query
- Watch your vault transform from a pile of files into a queryable knowledge base