Obsidian Integration

The garden format is Obsidian-native. No plugin required — open the garden as a vault and Obsidian reads it directly.

Why it works without a plugin

Every garden entry is a YAML-frontmatter markdown file. Obsidian reads YAML frontmatter natively as properties. The tags: field maps to Obsidian tags. The body is standard markdown. Nothing needs to be transformed.

Zero configuration: Open the garden directory as an Obsidian vault. The tags panel, property search, and Dataview queries all work immediately against the garden's existing structure.

Setup

Clone the garden with a sparse blobless clone so only index files and entry bodies you open are fetched from the remote. Entry bodies load on demand — the initial clone stays small even as the garden grows.

# Clone with sparse checkout — only index files materialise
git clone --filter=blob:none --no-checkout \
  https://github.com/Hortora/garden ~/.hortora/garden

cd ~/.hortora/garden
git sparse-checkout init
git sparse-checkout set \
  GARDEN.md SCHEMA.md CHECKED.md \
  "*/INDEX.md" "*/GE-*.md"
git checkout main

Then open ~/.hortora/garden as an Obsidian vault: Open another vault → Open folder as vault.

Install the Obsidian Git community plugin to keep the garden synced. Set it to pull on startup and auto-commit at an interval if you want to capture from Obsidian.

What works natively

Once the vault is open, Obsidian's built-in features work against the garden immediately:

Dataview queries

Install the Dataview community plugin to query the garden as a database. These queries work against the garden's existing frontmatter fields — no changes to entry files needed.

Staleness view — entries past threshold

Shows entries where the age (days since submission) exceeds the entry's own staleness_threshold.

```dataview
TABLE title, score, staleness_threshold, submitted
FROM ""
WHERE contains(file.frontmatter.id, "GE-")
WHERE (date(today) - date(submitted)).days > staleness_threshold
SORT submitted ASC
```

High-value entries — score ≥ 12

```dataview
TABLE title, score, domain, submitted
FROM ""
WHERE contains(file.frontmatter.id, "GE-") AND score >= 12
SORT score DESC
```

Entries by domain

```dataview
TABLE length(rows) AS "Entries"
FROM ""
WHERE contains(file.frontmatter.id, "GE-")
GROUP BY domain
```

Recent captures — last 30 days

```dataview
TABLE title, type, score, submitted
FROM ""
WHERE contains(file.frontmatter.id, "GE-")
WHERE (date(today) - date(submitted)).days < 30
SORT submitted DESC
```

Gotchas only — by stack

```dataview
TABLE title, stack, score
FROM ""
WHERE contains(file.frontmatter.id, "GE-") AND type = "gotcha"
SORT stack ASC
```

Capturing from Obsidian

You can write entries directly in Obsidian, but they bypass the validation pipeline (score threshold, format check, L1 deduplication). Always submit via pull request to get CI validation:

  1. Write the entry in Obsidian using the template below
  2. Save to the correct domain directory: java/GE-YYYYMMDD-xxxxxx.md
  3. Commit with Obsidian Git and open a PR on GitHub
  4. CI validates the entry — merge when it passes
ID generation: Use the MCP server's garden_capture tool to generate a valid GE-ID and create the branch automatically, then copy the entry content into Obsidian for editing.

Entry template

Add this as an Obsidian template (Templates core plugin or Templater community plugin):

---
id: GE-<YYYYMMDD>-<6hex>
title: "Short imperative title — the weird thing, not the fix"
type: gotcha
domain: java
stack: "Technology, Library, Version"
tags: [tag1, tag2]
score: 10
verified: true
staleness_threshold: 730
submitted: <% tp.date.now("YYYY-MM-DD") %>
---

## Title

**ID:** GE-<YYYYMMDD>-<6hex>
**Stack:** Technology, Library, Version
**Symptom:** What you observe.
**Context:** When and where this applies.

### What was tried (didn't work)
- tried X — result

### Root cause
Why it happens.

### Fix
Code or config.

### Why this is non-obvious
The insight.

*Score: 10/15 · Included because: [reason] · Reservation: none*

Known limitations