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.
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.
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:
- Properties panel: every entry's
score,type,domain,submitted, andstaleness_thresholdappear as sortable properties - Tags:
tags: [hibernate, jpa, flush]→ Obsidian tag search and the tag pane - Full-text search: Obsidian's built-in search scans all entry bodies
- Graph view: entries linked via
See also: GE-XXXXin the body are visible in Obsidian's graph if you create wikilinks - Backlinks: works if you convert
See alsoreferences to[[GE-XXXX]]wikilinks (can be done with a find-replace)
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.
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
TABLE title, score, domain, submitted
FROM ""
WHERE contains(file.frontmatter.id, "GE-") AND score >= 12
SORT score DESC
```
Entries by domain
TABLE length(rows) AS "Entries"
FROM ""
WHERE contains(file.frontmatter.id, "GE-")
GROUP BY domain
```
Recent captures — last 30 days
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
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:
- Write the entry in Obsidian using the template below
- Save to the correct domain directory:
java/GE-YYYYMMDD-xxxxxx.md - Commit with Obsidian Git and open a PR on GitHub
- CI validates the entry — merge when it passes
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
- Writes bypass CI: entries created or edited directly in Obsidian skip the validation pipeline. Always submit via PR to get score checking and deduplication.
- See also references:
See also: GE-XXXX [title]in entry bodies are plain text, not wikilinks. Obsidian's graph view won't show these connections unless you manually convert them to[[GE-XXXX]]syntax. - Sparse checkout: with blobless sparse checkout, entry bodies not yet fetched appear as empty files in Obsidian until you open them (which triggers the on-demand fetch).