Part 5: Living with It
Part 5 of the digital garden series.
The decisions
Some of these will change. For now:
Quartz v4 stable, not v5 pre-release. Upgrading later should cost almost nothing since Quartz is a CI build tool here, not a framework.
Workers + R2, not Pages. Forced by the file size wall, turned out to be a better fit.
Obsidian Sync + git push to publish. Sync for multi-device capture, git for versioning and CI. They coexist as sibling directories (covered below).
Mobile is capture-only. Quick captures on the phone, processing on the desktop. Prevents sync conflicts and matches how I actually use the phone.
Zettelkasten connections, no taxonomy system. The hardest decision to stick with. The temptation to build structure is strong. So far the answer has been: write it, link it, let the graph show you what the categories are.
Minimal frontmatter. Title, date, tags. Context lives in prose.
What we threw away
The first iteration had too much structure. This is a recurring pattern: build the scaffolding, discover it creates friction, tear it down, keep what’s left.
Every row was designed before it was removed. What survived on the right is smaller than what was built on the left, and the middle column names the friction that did the tearing.
Type enums for experiences. An evening that involved food, conversation, and a walk doesn’t fit in a single enum. Experiences are just experiences now.
Multi-section templates. Prescribed sections (Background, Concepts & Motifs, Jumping Off) felt productive to design and oppressive to fill out. Templates now have title, date, tags, and nothing else.
Sequence-numbered observations. YYYY-MM-DD-001-decision-slug.md with typed categories. Too much friction at the moment of capture.
A monolithic AGENTS.md. Too long, too prescriptive. The current version is a concise overview with pointers to skills and commands that load on demand.
The combined vault. The original design put the Obsidian vault and the git repo in one directory. vault/ was gitignored inside the repo, synced by Obsidian Sync, while everything else was git-managed. This worked until it didn’t: Sync exclusion rules grew fragile, .gitignore and Sync exclusions had to stay perfectly aligned, and the Obsidian file picker showed build artifacts alongside notes. Separating them into sibling directories (secondbrain/ for the site, vault/ for Obsidian) eliminated the overlap. The vault is now pure ingress: capture from any device, then move content to the site at the keyboard via /capture. Templates moved site-side since the AI commands are the ones that use them. No plugins needed in the vault.
Domain separation
The file tree serves multiple systems that need to not step on each other:
| Domain | Obsidian Sync | Git | Purpose |
|---|---|---|---|
../vault/ | yes | no (sibling dir) | Mobile capture, daily notes, drafts |
content/ | no (excluded) | yes | Published content |
media/ | no (excluded) | yes (LFS) | Web-optimized media for R2 |
quartz/, worker/, Makefile | yes | yes | Development artifacts |
memory/ | yes | yes | AI session persistence |
.opencode/ | no (dotfile) | yes | AI harness configuration |
The domain separation evolved over time. Early on, development artifacts used a dotfile convention to hide from Obsidian. That created a different problem: files I might want to browse or edit in Obsidian were invisible. The next iteration used Obsidian Sync exclusions instead, keeping content/ and media/ out of Sync while letting development files remain visible. Ultimately even exclusion-based coexistence was too much coupling. The vault moved to a sibling directory, reducing Obsidian to a pure capture tool with no awareness of the site.
What I’ve noticed so far
/connect is the most valuable part of the AI harness. Every time it surfaces a link to something I wrote months ago, the graph gets denser.
Session memory is surprisingly high-value. I can put the project down for a week and pick it up without the “where was I” tax.
The Makefile ASCII diagram is genuinely useful. When I forget a step, I read the diagram. It’s the first thing I’d share if open sourcing the workflow.
What’s next
The system is functional and I’m actively writing in it. Some open threads:
Custom Quartz styling. The default theme is fine but the goal is something closer to ellie.wtf in personality. Fonts, colors, layout. This is purely aesthetic and low priority but will eventually happen.
CSP nonce injection. The current Content Security Policy allows unsafe-inline and unsafe-eval because Quartz’s SPA navigation uses Function(). Injecting nonces per-request in the Worker would allow removing these directives. This requires HTML parsing on every request, which is feasible but needs careful performance testing.
Quartz canvas support. Obsidian canvases are spatial arrangements of notes and media. Quartz doesn’t render them yet. When it does, that opens up a new content type for visual thinking.
A signal agent for voice memos. The idea is: record a voice memo on the phone, it lands in private/inbox/ as a transcription, and gets processed through /capture like any other inbox item. The tooling for speech-to-text is mature enough that this is plausible.
Migrating content from the old blog. There are roughly thirty posts on andrew.dunn.dev (technical notes, reading, travel) that should eventually live here. This is manual editorial work, not a bulk import, because each post needs its wikilinks and connections.
The system will keep evolving. That’s the point of a garden.