Advanced Features and Best Practices
This guide covers advanced Obsidian features, powerful Dataview queries, and lessons learned from real project use.
Dataview Queries
Dataview transforms your vault into a database. These examples are from the actual Garage Project.
Basic Query Syntax
QUERY_TYPE
FROM "folder/path" OR #tag
WHERE condition
SORT field ASC/DESCQuery Types:
TABLE- Tabular dataLIST- Simple listTASK- Todo items
Task Aggregation
Show all incomplete tasks grouped by file:
TASK
FROM ""
WHERE !completed
GROUP BY file.link
SORT file.name ASCFrom Garage Project (00-Index.md):
- Shows all pending tasks across entire vault
- Grouped by source document
- Quick view of what needs attention
Result:
## 10-Planning/To-Do.md
- [ ] Finalize HVAC contractor selection
- [ ] Order mini-split equipment
## 20-Design/Interior/Electrical Planning.md
- [ ] Plan subpanel location
- [ ] Calculate electrical loads
Order Tracking
Show all orders with status (30-Vendors & Contacts/Orders/Orders Index.md):
TABLE vendor, status, order_id, stage, key_dates.ordered as Ordered, key_dates.eta as ETA
FROM "30-Vendors & Contacts/Orders"
WHERE type = "order"
SORT status ASC, key_dates.ordered DESCShows:
| File | Vendor | Status | Order ID | Stage | Ordered | ETA |
|---|---|---|---|---|---|---|
| Mini-Split HVAC Order | TBD | planning | 6 | |||
| Radiant Materials | Hershberger’s | delivered | 97898 | 2 | 2025-10-20 | 2025-10-21 |
Meeting Timeline
Chronological meeting list:
TABLE date, attendees, tags
FROM "40-Meetings"
WHERE type = "meeting"
SORT date DESCDecision Tracking
Show all decisions by status:
TABLE date, area, decision, status
FROM "10-Planning"
WHERE type = "decision" OR contains(file.name, "Decision")
SORT date DESCFilter by Stage
Show tasks for current construction stage:
TASK
FROM ""
WHERE !completed AND contains(text, "stage:: 2")
GROUP BY file.linkStages in Garage Project:
- Stage 1: Planning
- Stage 2: Foundation
- Stage 3: Design finalization
- Stage 4: Framing
- Stage 5: Mechanicals
- Stage 6: Finish work
Photo Documentation Query
Recent photos by phase:
TABLE date, time, phase, status
FROM "pictures"
WHERE type = "photo-documentation"
SORT date DESC, time DESC
LIMIT 20Advanced: Conditional Formatting
Highlight overdue items:
TABLE key_dates.eta as "Due Date",
choice(key_dates.eta < date(today), "⚠️ OVERDUE", "✓ On Track") as Status
FROM "30-Vendors & Contacts/Orders"
WHERE type = "order" AND status != "delivered"DataviewJS for Complex Queries
Calculate total budget spent:
```dataviewjs
let orders = dv.pages('"30-Vendors & Contacts/Orders"')
.where(p => p.type == "order" && p.status == "delivered");
let total = orders
.map(p => p.totals?.total || 0)
.reduce((a, b) => a + b, 0);
dv.paragraph(`**Total Spent**: $${total.toLocaleString()}`);
```Group meetings by month:
```dataviewjs
let meetings = dv.pages('"40-Meetings"')
.where(p => p.type == "meeting")
.sort(p => p.date, "desc");
let byMonth = meetings.groupBy(p =>
p.date.toFormat("yyyy-MM")
);
for (let group of byMonth) {
dv.header(3, group.key);
dv.list(group.rows.map(p => p.file.link));
}
```Advanced Organization Techniques
Nested Tags
Use hierarchy in tags:
tags: [construction/foundation, construction/concrete, hvac/radiant]Query by tag hierarchy:
LIST
FROM #constructionMatches: #construction/foundation, #construction/framing, etc.
YAML Arrays and Objects
Complex metadata:
---
key_dates:
ordered: 2025-10-20
shipped: 2025-10-21
delivered: 2025-10-21
installed:
totals:
subtotal: 1200.00
tax: 96.00
shipping: 50.00
total: 1346.00
contacts:
sales:
name: John Smith
phone: (555) 123-4567
support:
name: Jane Doe
phone: (555) 987-6543
---Query nested data:
TABLE contacts.sales.name as "Sales Contact", totals.total as "Total"
FROM "30-Vendors & Contacts"
WHERE totals.total > 1000Inline Dataview Fields
Embed metadata in content:
- Pressure test completed at [psi:: 65] PSI
- Duration: [duration:: 24] hours
- Result: [result:: passed]Query inline fields:
LIST
FROM ""
WHERE psi > 60Folder-Specific Queries
Only show items from specific phase:
TABLE status, date
FROM "50-Build"
WHERE type = "build"
SORT date DESCAdvanced Linking Techniques
Block References
Link to specific paragraphs:
- Add block ID:
This is important information about the foundation. ^foundation-key-point- Reference it:
As noted in [[50-Build/Initial Build#^foundation-key-point|^foundation-key-point]]Embed Sections
Include content from other documents:
![[50-Build/Initial Build#construction-progress|Construction Progress]]Embeds just the “Construction Progress” section.
Alias Links
Multiple names for same document:
---
title: Hershberger's Amish Builders
aliases: [Hershberger's, Marcus, Primary Contractor]
---Now all these work:
[[Hershberger's Amish Builders]][[Hershberger's]][[Marcus]][[Primary Contractor]]
External Links with Metadata
[Creatherm Specifications](https://www.creatherm.com/products/specifications/)
^creatherm-specs
Later reference: [[#^creatherm-specs|^creatherm-specs]]Templater Plugin (Optional)
Even more powerful templates:
Installation
- Community Plugins → Search “Templater”
- Install and enable
- Settings → Template folder location
Dynamic Templates
Meeting template with auto-date:
---
title: <% tp.date.now("YYYY-MM-DD") %> - Meeting -
type: meeting
date: <% tp.date.now("YYYY-MM-DD") %>
attendees: []
---
# Meeting - <% tp.date.now("YYYY-MM-DD") %>
## Attendees
-
## Discussion
<% tp.file.cursor() %>
## Action Items
- [ ]
## Decisions MadeOrder template with calculations:
---
title: Order
totals:
subtotal: <% tp.file.cursor(1) %>
tax: <% parseFloat(tp.file.cursor(1)) * 0.08 %>
shipping: <% tp.file.cursor(2) %>
total: <%*
let subtotal = parseFloat(tp.file.cursor(1));
let tax = subtotal * 0.08;
let shipping = parseFloat(tp.file.cursor(2));
tR = (subtotal + tax + shipping).toFixed(2);
%>
---Graph View Optimization
Filtering the Graph
Show only specific types:
- Graph View → Filters
- Add:
path:"50-Build"ORtag:#meeting
Color coding:
- Color groups: By folder or tag
- 10-Planning: Blue
- 20-Design: Green
- 50-Build: Orange
Local Graph
See connections for current note:
- Open note
- More options → Open local graph
- Shows immediate connections
Use case: Understand how a decision relates to meetings, design docs, and build progress.
Search Mastery
Advanced Search Operators
Search for multiple terms:
creatherm AND insulation
Exclude terms:
foundation -excavation
Search specific folders:
path:"50-Build" concrete
Search by tag:
tag:#hvac
Search properties:
[type:vendor] [status:active]
Combine operators:
path:"40-Meetings" (marcus OR hershberger) -quote
Saved Searches
Create search queries once, reuse forever:
Example: “Active Vendors”
path:"30-Vendors & Contacts" [type:vendor] [status:active]
Performance Optimization
For Large Vaults (1000+ files)
Enable file indexing:
- Settings → Files & Links → Detect all file extensions
Exclude from indexing:
# .obsidian/app.json
"userIgnoreFilters": [
"archive/",
"private/",
"Templates/"
]
Limit Dataview queries:
# Add LIMIT to expensive queries
TASK
FROM ""
WHERE !completed
LIMIT 50Optimize images:
- Resize large photos (max 2000px wide)
- Use JPG instead of PNG for photos
- Keep original photos elsewhere if needed
Mobile Sync
For iOS/Android access:
Option 1: Obsidian Sync ($10/month)
- Official, encrypted
- Works anywhere
- Fast
Option 2: Git + Working Copy (iOS)
- Free
- More complex
- Requires technical knowledge
Option 3: iCloud/Dropbox
- Free
- Can have conflicts
- Slower sync
Recommendation: Obsidian Sync for active project management; Git for archival.
Backup Strategies
Multi-Layer Backup
Garage Project uses:
- Git repository: Version history
- GitHub: Remote backup
- Local backup: Time Machine/Windows Backup
- Cloud storage: Secondary copy in Dropbox
Backup schedule:
- Git: After each work session
- GitHub: Push daily (or auto with Obsidian Git plugin)
- Local: Automatic (hourly)
- Cloud: Continuous sync
Git Best Practices
What to commit:
# After significant updates
git add .
git commit -m "docs: add week 3 construction progress and photos"
git pushWhat to ignore (.gitignore):
.obsidian/workspace*
.obsidian/cache
.trash/
node_modules/
public/
Branching for experiments:
# Try major reorganization on branch
git checkout -b reorganize-structure
# Make changes
# If good: merge. If bad: abandon branchLessons Learned
What Worked Well
✅ Phase-based organization: Natural project flow ✅ Numeric prefixes: Consistent ordering ✅ Rich frontmatter: Enables powerful queries ✅ Photo documentation: Invaluable reference ✅ Products Used page: Centralized specs ✅ Decision log: Clear rationale for choices ✅ AI assistance: 30+ hours saved ✅ Web publishing: Easy stakeholder sharing ✅ Dataview: Dynamic, always-current views
What to Do Differently
⚠️ Start earlier: Begin documentation at project start, not partway through ⚠️ Consistent photo naming: Use descriptive names or strict convention from day 1 ⚠️ More granular decisions: Document smaller choices, not just major ones ⚠️ Time tracking: Would add time spent on tasks for future estimation ⚠️ Budget tracking: More detailed expense categorization ⚠️ Templates earlier: Create templates before needing them ⚠️ Mobile workflow: Better mobile capture for on-site notes
Common Pitfalls to Avoid
❌ Over-organizing early: Start simple, add structure as needed ❌ Too many tags: Stick to 5-10 main tags ❌ Inconsistent naming: Pick conventions early, stick to them ❌ Neglecting cross-references: Links add value, use them liberally ❌ Skipping frontmatter: Always include type, tags, status minimum ❌ Forgetting to commit: Git only helps if you use it ❌ Not using templates: Typing same structure repeatedly is wasteful
Best Practices Checklist
Daily
- Update construction progress in build documents
- Add photos with at least brief descriptions
- Create meeting notes same day (while fresh)
- Mark completed tasks
- Commit changes to Git
Weekly
- Review and enhance photo descriptions
- Update timeline with week’s progress
- Review open action items
- Web publish updates (push to GitHub)
- Archive/file email correspondence
Monthly
- Review decisions log
- Update budget tracking
- Vendor performance notes
- Backup verification
- Clean up and organize new content
Project Milestones
- Comprehensive progress update
- Photo collection and organization
- Stakeholder communication
- Update project schedule
- Review lessons learned
Advanced Use Cases
Multi-Project Management
Separate vaults or one vault?
Separate vaults:
- ✅ Cleaner organization
- ✅ Easier to archive completed projects
- ❌ Can’t cross-reference between projects
Single vault with folders:
- ✅ Can link between projects
- ✅ Shared templates and references
- ❌ More complex organization
Recommendation: Separate vaults for unrelated projects; single vault for related projects (e.g., multiple home renovations).
Team Collaboration
Git-based workflow:
- Each team member clones repository
- Work in Obsidian locally
- Commit changes with clear messages
- Push/pull regularly to stay in sync
- Resolve conflicts (rare with markdown)
Roles:
- Project manager: Maintains structure, approves changes
- Contributors: Add documentation, update progress
- Reviewers: Verify accuracy, maintain quality
Project Templates
Create template vault for future projects:
Project-Template/
├── content/
│ ├── index.md (template)
│ ├── 10-Planning/
│ │ ├── Timeline.md (empty)
│ │ ├── To-Do.md (empty)
│ │ └── Budget.md (template)
│ ├── Templates/
│ │ ├── Meeting.md
│ │ ├── Vendor.md
│ │ └── Decision.md
│ └── CLAUDE.md (generic)
├── quartz/ (configured)
└── .gitignore
Start new project:
- Copy template vault
- Rename
- Update project-specific details
- Begin documenting
Success Metrics
For Garage Project
Quantitative:
- 100+ markdown documents created
- 50+ photos documented
- 15+ vendor contacts tracked
- 14+ products fully specified
- 25+ meetings documented
- ~30-45 hours saved with AI
- Zero information lost or misplaced
Qualitative:
- Always know project status
- Easy contractor/vendor reference
- Clear decision history
- Shareable progress with family
- Complete project archive
- Reusable knowledge for future
Define Your Own Metrics
Track what matters for your project:
- Time to find information (should be <30 seconds)
- Completeness (all meetings documented?)
- Stakeholder satisfaction (easy to share updates?)
- Future value (would this help in 5 years?)
Next Steps
Continue Learning
Obsidian Resources:
- Obsidian Forum: https://forum.obsidian.md
- Obsidian Discord: Active community
- YouTube: Many tutorial channels
Dataview:
- Documentation: https://blacksmithgu.github.io/obsidian-dataview/
- Examples: Community forum
Quartz:
- Documentation: https://quartz.jzhao.xyz
- GitHub discussions
Contribute Back
Share your learnings:
- Create your own documentation system guide
- Share useful templates
- Post helpful Dataview queries
- Help others in community forums
Iterate and Improve
Your system will evolve:
- Try new approaches
- Refine what works
- Drop what doesn’t
- Document your learnings
Conclusion
This documentation system has proven its value through real-world use on a complex construction project. The principles and practices here are applicable to any project requiring comprehensive documentation.
Key Takeaways:
- Structure early: Phase-based organization scales well
- Frontmatter matters: Enables powerful queries and automation
- Document as you go: Far easier than retroactive documentation
- Use AI wisely: Accelerates work but requires human oversight
- Link liberally: Connections add immense value
- Publish externally: Web presence aids communication
- Commit regularly: Git protects your work
- Stay consistent: Templates and conventions pay dividends
Start simple, grow as needed. You don’t need to implement everything at once. Begin with basic organization and templates, then add advanced features as your needs evolve.
Related Guides
- 00 - Overview - System overview
- 01 - Obsidian Setup and Configuration - Get started
- 02 - Vault Structure and Organization - Organize your vault
- 04 - Documentation Workflows - Common workflows
- 03 - Web Publishing with Quartz - Share your docs
- 05 - AI Integration and Automation - Leverage AI
This guide represents 6+ months of real-world project documentation experience. Adapt these practices to your specific needs and context.