My Obsidian Γ— Claude Γ— Quartz Workflow

I’ve wired Claude Code directly into my Obsidian vault so it actively helps maintain structure and consistency, rather than just being a chatbot I open when something breaks.

The goal: write and think in Obsidian, publish to Quartz automatically, and have Claude handle the boring maintenance work passively through hooks and skills.

Here’s how it all fits together.

CLAUDE.md β€” The Control Center

Everything starts with CLAUDE.md at the vault root. Claude Code reads this first β€” think of it as the constitution for how Claude behaves in this vault.

## Style rules
 
- Writing inside `00 Blogs/`: blog writing style
- Writing notes (01 Atlas/, 02 Calendar/, etc.): notes style
- Conversational replies in terminal: caveman mode
 
## Pipeline
 
/obsidian-refine β†’ /obsidian-cleanup β†’ /obsidian-index β†’ /backup-vault

The key insight here: context-aware style switching. Claude doesn’t apply the same voice everywhere β€” it adapts based on where the file lives. Writing a blog post vs jotting an inbox note vs replying in the terminal all get completely different treatment.

Writing Styles

Three distinct modes, each defined as a rule file in .claude/rules/:

Caveman Mode (Terminal Replies)

All conversational output in the Claude Code terminal uses stripped-down caveman grammar. Short sentences. Big words swapped for small ones. No filler.

The reason is token efficiency. Long, polished terminal responses eat context window fast. Caveman mode keeps the back-and-forth snappy without losing the actual information β€” turns out β€œME FIX CODE! UGH old code bad.” gets the point across just fine πŸ‘€

Blog Writing Style

For anything inside 00 Blogs/, Claude writes like me β€” casual but technical, personal but not rambling. The style guide enforces:

  • Standard structure: ## Introduction + ## Table of Contents on every _index.md
  • WikiLink paths without 00 Blogs/ prefix (Quartz-compatible)
  • No passive voice, no marketing speak
  • Personal asides in italics, blockquotes for key insights
  • Emojis sparingly β€” warmth, not decoration

Notes Style

For 01 Atlas/, 02 Calendar/, 03 Efforts/, 04 Inbox/ β€” dense, scannable, reference-first. No narrative intro, just structured knowledge. One idea per bullet. Think internal wiki, not blog post.

Hooks β€” Passive Automation

The real unlock is PostToolUse hooks in .claude/settings.json. These fire automatically after every Write or Edit β€” I don’t have to remember to run anything.

Blog Index Enforcement

{
  "matcher": "Write",
  "hooks": [{ "command": "python3 scripts/enforce-blog-index.py" }]
}

After every file write inside 00 Blogs/, enforce-blog-index.py runs and:

  • Creates a stub _index.md if a folder is missing one
  • Adds new posts to their folder’s Table of Contents automatically
  • Updates the parent folder’s TOC when new subfolders appear

Why this matters for tokens: without this hook, I’d need to ask Claude to re-scan the whole 00 Blogs/ directory at the start of every session to understand what exists. The hook keeps every _index.md current passively β€” so Claude reads the index and immediately has an accurate map of the blog structure without re-exploring.

Inbox Threshold Alert

When 04 Inbox/ hits 5+ unprocessed notes, the hook surfaces a reminder to run the cleanup pipeline. Keeps the inbox from silently bloating between pipeline runs.

Note-taking Pipeline

The second brain pipeline runs in four phases, each a slash command:

/obsidian-refine β†’ /obsidian-cleanup β†’ /obsidian-index β†’ /backup-vault

/obsidian-refine β€” Standardise

Fixes frontmatter across all inbox notes: normalises dates, corrects tags, sanitises formatting. Notes land in 04 Inbox/ from wherever (quick capture, phone, Telegram) and come out with consistent structure.

/obsidian-cleanup β€” Categorise

Routes notes from 04 Inbox/ to the right vault section based on tags:

  • concepts β†’ 01 Atlas/ (evergreen knowledge)
  • projects/* β†’ 03 Efforts/ (active work)
  • Calendar entries β†’ 02 Calendar/

This is where CLAUDE.md’s tag conventions pay off β€” concepts, projects/homelab, projects/<name> are the routing keys for the entire system. Consistent tagging at capture time means zero manual sorting.

/obsidian-index β€” Map of Contents

Regenerates _index.md files across the vault. This is the sparse retrieval layer β€” instead of loading the entire vault into context, Claude reads the index first and drills down only where needed. Keeps sessions fast and focused.

/backup-vault β€” Publish

Commits and pushes everything to the iujinwee-vault Git repo. The Quartz garden at garden.iujinwee.cc picks up changes from there automatically.

Weekly: /state-of-brain

Once a week I run /state-of-brain β€” Claude reads across the vault, identifies emergent themes, contradiction clusters, and stale knowledge, then writes a report to 02 Calendar/Obsidian/[YYYY_WW].md.

It’s weirdly useful. Patterns surface that I’d never notice day-to-day when I’m heads-down in individual notes.

The Quartz Connection

00 Blogs/ syncs directly to the Quartz site. WikiLinks resolve to Quartz URLs β€” which is why all links in blog posts drop the 00 Blogs/ prefix. Quartz treats that folder as its content root, so paths like [[Home Lab 🌱/architecture|Core Architecture]] map cleanly to the published URL structure.

The whole system is designed so writing in Obsidian feels natural, publishing is automatic, and Claude is an active collaborator β€” not a tool I open when something breaks πŸš€


Thanks for reading β€” if you’re building something similar I’d love to hear about it. Reach me at code.iujinwee.cc