Inspired by How I use Obsidian.
My system is oriented towards speed, security and reliability. I don’t want the overhead of having to consider where something should go. I want to use secure, well-supported software that I can rely on a decade from now.
Personal rules
Rules I follow in my personal vault:
- Use the bare minimum set of plugins – each new plugin introduces security, reliability and UI issues.
- Instead of plugins, write small, understandable programs if possible. Store them in
/Scripts. - Avoid splitting content into multiple vaults.
- Minimal folders for organization.
- Avoid non-standard Markdown.
- Always pluralize categories and tags.
- Use YAML
tagsfor durable metadata; use inline#tagsfor in-note semantics. My Tags documents the tags that are allowed to be used inline, enforced via/Scripts/cleanup_life_lab.py - Use internal links profusely.
- Use
YYYY-MM-DDdates everywhere. - Use the 7-point scale for ratings.
Most of my notes are in the root of the vault, not a folder.
A few reference folders I use:
- Experiments
- Goals
- Reviews
Three admin folders exist so that their contents don’t show up in the file navigation:
- Attachments for images, audio, videos, PDFs, etc.
- Daily for my daily notes, all named
YYYY-MM-DD.md. This also contains Unique Notes. - Templates for templates.
Other utility folders:
- Bases
- Readwise
- Scripts
Claude / AI
I use Claude Code extensively with my Vault. More on this later.
Plugins
- Readwise
- Minimal Theme Settings for Kepano’s Minimal Theme
- Calendar
Formatting
./format.sh uses prettier to format all Markdown files in the Vault.
Ïone liner: cd ~/meditations && ./Scripts/format.sh --skip-dirs Readwise,Scripts,node_modules,.git,.obsidian,.claude --km
Blogging
I use a simple script Scripts/blog_sync.py to sync select notes into My Vercel Blog. This syncs all notes tagged with #blog and uses the blog-sync property in frontmatter to specify the destination filepath. It also does some minor things like preserving existing frontmatter at the destination while updating content, and stripped out Obsidian-specific syntax during sync.