Obsidian Power User
I’ve spent more messages debugging Obsidian than debugging most of my servers. Templates, queries, automation, folder structures - the rabbit hole goes deep.
This is everything I’ve learned building a knowledge management system that spans work, personal life, technical documentation, and a collection of letters to my daughter.
The Philosophy
Obsidian is just markdown files. That’s the magic.
No proprietary database. No cloud lock-in. Files you can grep, script, and version control. When Obsidian dies (and all software eventually dies), your notes survive.
The philosophy:
- Folders for context - Visual organization, search scoping
- Links for connections - Ideas that relate should connect
- Frontmatter for machines - Metadata that Dataview can query
- Templates for consistency - Every note type has a template
Folder Structure
Vault/
├── 00-Inbox/ # Quick capture, process later
├── 01-Daily/ # Daily notes
│ └── YYYY/MM/ # Nested by year and month
├── 10-Work/
│ ├── Clients/
│ ├── Projects/
│ └── Meetings/
├── 20-Personal/
│ ├── Journal/
│ ├── Letters/ # To my daughter
│ └── Health/
├── 30-Technical/
│ ├── Homelab/
│ ├── Programming/
│ └── Security/
├── 40-Reference/
│ ├── Snippets/
│ └── Cheatsheets/
├── 90-Templates/
└── 99-Archive/
Number prefixes force sort order. Inbox first, archive last.
Year/Month nesting for daily notes prevents folders with 365+ files.
Separation of concerns - Work search doesn’t return personal journal entries.
Daily Notes
The daily note is the entry point to everything. One file per day, created automatically.
The Template
---
date: <% tp.date.now("YYYY-MM-DD") %>
day: <% tp.date.now("dddd") %>
type: daily
---
# <% tp.date.now("dddd, MMMM Do, YYYY") %>
## Navigation
- [[<% tp.date.now("YYYY-MM-DD", -1, tp.file.title, "YYYY-MM-DD") %>|← Yesterday]]
- [[<% tp.date.now("YYYY-MM-DD", 1, tp.file.title, "YYYY-MM-DD") %>|Tomorrow →]]
- [[<% tp.date.now("YYYY-[W]WW", 0, tp.file.title, "YYYY-MM-DD") %>|This Week]]
---
## 🎯 Goals
- [ ]
## 📋 Work
## 🏠 Personal
## 🔧 Technical
## 💭 End of Day
---
*Created: <% tp.date.now("HH:mm") %>*
Key Features
Navigation links - Every daily note links to yesterday and tomorrow. Click through time like a timeline.
Section headers - Work, personal, technical stay separate but in one file.
Templater variables - <% tp.date.now() %> fills in dates at creation time.
Templater Deep Dive
Templater is Obsidian’s most powerful plugin. It turns templates into executable code.
Date Manipulation
// Today
<% tp.date.now("YYYY-MM-DD") %>
// Yesterday
<% tp.date.now("YYYY-MM-DD", -1) %>
// Next Friday
<% tp.date.now("YYYY-MM-DD", 0, "YYYY-MM-DD", "Friday") %>
// Dynamic from filename (if file is named 2024-01-15)
<% tp.date.now("YYYY-MM-DD", -1, tp.file.title, "YYYY-MM-DD") %>
User Prompts
// Ask for input
<% tp.system.prompt("What's the meeting about?") %>
// Choose from options
<% tp.system.suggester(["Work", "Personal", "Technical"], ["work", "personal", "technical"]) %>
File Operations
// Move file to folder after creation
<% await tp.file.move("10-Work/Meetings/" + tp.file.title) %>
// Rename based on content
<% await tp.file.rename(tp.file.content.match(/# (.*)/)[1]) %>
Dataview Queries
Dataview turns your vault into a queryable database.
Basic Queries
LIST
FROM "01-Daily"
WHERE date >= date(today) - dur(7 days)
SORT date DESC
Shows the last 7 daily notes.
Task Aggregation
TASK
FROM "01-Daily" OR "10-Work"
WHERE !completed
WHERE file.mtime >= date(today) - dur(14 days)
GROUP BY file.link
All incomplete tasks from the last 2 weeks, grouped by source file.
Table with Computed Fields
TABLE
file.mday as "Modified",
length(file.outlinks) as "Links Out",
length(file.inlinks) as "Links In"
FROM "30-Technical"
SORT file.mday DESC
LIMIT 10
Shows recent technical notes with link counts.
DataviewJS for Complex Queries
When declarative queries aren’t enough:
// Extract text from a specific heading across files
const pages = dv.pages('"01-Daily"')
.sort(p => p.file.name, 'asc');
for (let page of pages) {
const content = await dv.io.load(page.file.path);
const section = content.match(/## Goals\n([\s\S]*?)(?=\n## |$)/);
if (section) {
dv.header(4, page.file.link);
dv.paragraph(section[1].trim());
}
}
This pulls “Goals” sections from every daily note.
Automation
Auto-Create Daily Notes
Notes should exist whether Obsidian is open or not.
With Templater:
- Settings → Trigger on file creation → Enable
- Daily note folder gets template auto-applied
With cron (headless):
#!/bin/bash
VAULT="$HOME/Documents/Vault"
DATE=$(date +%Y-%m-%d)
YEAR=$(date +%Y)
MONTH=$(date +%m)
FILE="$VAULT/01-Daily/$YEAR/$MONTH/$DATE.md"
if [ ! -f "$FILE" ]; then
mkdir -p "$(dirname "$FILE")"
cat "$VAULT/90-Templates/Daily.md" | \
sed "s/{{date}}/$DATE/g" > "$FILE"
fi
Run at midnight via cron.
Periodic Notes
Weekly reviews, monthly summaries:
---
date: <% tp.date.now("YYYY-MM-DD") %>
week: <% tp.date.now("YYYY-[W]WW") %>
type: weekly
---
# Week <% tp.date.now("WW") %> Review
## What Happened
```dataview
LIST
FROM "01-Daily"
WHERE week = this.week
SORT date ASC
Wins
Challenges
Next Week
The Dataview query auto-populates links to that week's daily notes.
---
## The Letters Folder
Some things deserve special treatment.
20-Personal/Letters/ ├── 2023-01-birthday.md ├── 2023-06-summer-begins.md ├── 2024-09-first-day-high-school.md └── …
Template:
```markdown
---
type: letter
recipient: daughter
date: <% tp.date.now("YYYY-MM-DD") %>
age: [her age]
---
# <% tp.date.now("MMMM Do, YYYY") %>
Dear [Name],
[Content]
Love,
Dad
These don’t appear in work searches. They don’t pollute task queries. They exist in their own quiet space, accumulating over years.
Someday she’ll read them.
Search Optimization
Path-Scoped Search
path:10-Work docker
Only searches Work folder.
path:30-Technical -path:Archive
Technical notes, excluding archived ones.
Frontmatter Search
type:meeting client:acme
Finds meeting notes for a specific client (requires Dataview or similar indexing).
Sync Strategy
I use Syncthing (not Obsidian Sync) to keep vaults synchronized:
Desktop → Syncthing → NAS → Syncthing → Laptop
Both machines sync to the NAS. Conflicts are rare with daily notes (each day is a unique file).
For mobile, I use Working Copy (iOS) with a Git remote. The vault is a Git repo.
Performance Tips
Big vaults get slow. Mitigations:
- Exclude folders from search - Settings → Files & Links → Excluded files
- Limit Dataview queries - Use
LIMIT 20to prevent scanning thousands of files - Archive old content - Move completed projects to 99-Archive
- Disable live preview for huge files
Lessons Learned
Start simple. My first template was 10 lines. It grew as needs emerged.
Links > Folders. Folders separate. Links connect. Both matter.
Frontmatter is for machines. If you want Dataview to find it, put it in frontmatter.
Templates are code. Version them. Test them. Debug them.
700+ messages. That’s how many it took to get here. Every one taught something.
The second brain doesn’t build itself. But once built, it remembers everything you forget.