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/DESC

Query Types:

  • TABLE - Tabular data
  • LIST - Simple list
  • TASK - Todo items

Task Aggregation

Show all incomplete tasks grouped by file:

TASK
FROM ""
WHERE !completed
GROUP BY file.link
SORT file.name ASC

From 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 DESC

Shows:

FileVendorStatusOrder IDStageOrderedETA
Mini-Split HVAC OrderTBDplanning6
Radiant MaterialsHershberger’sdelivered9789822025-10-202025-10-21

Meeting Timeline

Chronological meeting list:

TABLE date, attendees, tags
FROM "40-Meetings"
WHERE type = "meeting"
SORT date DESC

Decision Tracking

Show all decisions by status:

TABLE date, area, decision, status
FROM "10-Planning"
WHERE type = "decision" OR contains(file.name, "Decision")
SORT date DESC

Filter by Stage

Show tasks for current construction stage:

TASK
FROM ""
WHERE !completed AND contains(text, "stage:: 2")
GROUP BY file.link

Stages 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 20

Advanced: 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 #construction

Matches: #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 > 1000

Inline 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 > 60

Folder-Specific Queries

Only show items from specific phase:

TABLE status, date
FROM "50-Build"
WHERE type = "build"
SORT date DESC

Advanced Linking Techniques

Block References

Link to specific paragraphs:

  1. Add block ID:
This is important information about the foundation. ^foundation-key-point
  1. 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.

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]]
[Creatherm Specifications](https://www.creatherm.com/products/specifications/)
^creatherm-specs
 
Later reference: [[#^creatherm-specs|^creatherm-specs]]

Templater Plugin (Optional)

Even more powerful templates:

Installation

  1. Community Plugins → Search “Templater”
  2. Install and enable
  3. 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 Made

Order 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" OR tag:#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 50

Optimize 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:

  1. Git repository: Version history
  2. GitHub: Remote backup
  3. Local backup: Time Machine/Windows Backup
  4. 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 push

What 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 branch

Lessons 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:

  1. Each team member clones repository
  2. Work in Obsidian locally
  3. Commit changes with clear messages
  4. Push/pull regularly to stay in sync
  5. 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:

  1. Copy template vault
  2. Rename
  3. Update project-specific details
  4. 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:

Dataview:

Quartz:

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:

  1. Structure early: Phase-based organization scales well
  2. Frontmatter matters: Enables powerful queries and automation
  3. Document as you go: Far easier than retroactive documentation
  4. Use AI wisely: Accelerates work but requires human oversight
  5. Link liberally: Connections add immense value
  6. Publish externally: Web presence aids communication
  7. Commit regularly: Git protects your work
  8. 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.



This guide represents 6+ months of real-world project documentation experience. Adapt these practices to your specific needs and context.