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:

  1. Folders for context - Visual organization, search scoping
  2. Links for connections - Ideas that relate should connect
  3. Frontmatter for machines - Metadata that Dataview can query
  4. 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:10-Work docker

Only searches Work folder.

path:30-Technical -path:Archive

Technical notes, excluding archived ones.

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:

  1. Exclude folders from search - Settings → Files & Links → Excluded files
  2. Limit Dataview queries - Use LIMIT 20 to prevent scanning thousands of files
  3. Archive old content - Move completed projects to 99-Archive
  4. 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.