Overview
Keep a plain Obsidian vault flat, indexed by MOC notes, with kebab-case slugs, YAML frontmatter on every note, and wikilinks, so it publishes through Quartz without a transform step. For a research vault with typed note schemas, decision journals, and an auditor, start from vault-architecture instead.
Prefer MOCs over deep folder trees
A Map of Content (MOC) is a note that links its neighbors, so navigation follows links, not directories.
- Create one
index.mdper top-level domain folder, listing that domain’s notes inline. - Keep folders two levels deep at most:
backend/is fine,backend/postgres/migrations/is not. The shallow-folder rule is in folder-hierarchy. - A note lives in one folder but can be linked from several MOCs. When two folders fit, file it in the closer one and link it from the other.
- Grow a MOC from a cluster that already exists; see linking-and-tags.
Keep daily notes separate from atomic notes
Daily notes are scratch; atomic notes are durable. Mixing them degrades both.
vault/
├── daily/ # YYYY-MM-DD.md
├── backend/
│ ├── index.md # MOC
│ └── postgres.md # atomic note
└── coding/
Promote a daily-note idea to an atomic note when it is cited a second time. Atomic notes hold one idea, so split one that needs two H2 topics; size and title rules are in atomic-notes.
Name notes with kebab-case slugs
Use backend/postgres-replication.md, not Backend/Postgres Replication.md. Quartz derives the URL from the file path, and spaces become %20. Lowercase names behave the same on Linux and macOS filesystems, and [[postgres-replication]] is unambiguous. The frontmatter title carries the readable name. See naming-conventions.
Use wikilinks for internal links
Reserve markdown links for external URLs. Syntax is in markdown-syntax.
[[note]]resolves by name and works when the filename is unique.[[folder/note]]resolves by path and is required when two notes share a filename, such as[[seo/technical]]and[[frontend/technical]].[[note|display text]]changes the rendered text; it hides the destination on hover, so use it sparingly.- Rename notes inside Obsidian with “Automatically update internal links” on, so inbound links are rewritten. A rename on the filesystem breaks them.
Put frontmatter on every note
Every published note opens with YAML frontmatter; stubs use the same schema. Obsidian’s Properties view edits it without hand-typing YAML.
---
title: "Postgres: Best Practices"
slug: "postgres"
category: "backend"
tags: ["backend", "postgres", "database"]
status: "stable"
last_updated: 2026-10-01
summary: "One sentence routing hint."
related: ["[[backend/prisma]]", "[[backend/sqlite]]"]
---Inject the block from a template (obsidian-templates) instead of typing it. Which keys Quartz reads is covered in obsidian-publishing-to-quartz.
Keep templates and attachments out of the published tree
vault/
├── _templates/ # Templater templates
├── _attachments/ # images, PDFs
└── content/ # everything that publishes
Add _templates and _attachments to Quartz’s ignorePatterns, anchored at the content root (quartz-config). Also exclude .obsidian/, .trash/, and any private/ or daily/ folder that should not ship.
Install few plugins
- Bases is a core plugin since Obsidian 1.9: table, cards, list, and other views over notes filtered by property. Use it first for pages like “every note with
status: draft.” - Templater injects frontmatter on note creation.
- Tag Wrangler renames and merges tags vault-wide.
- Dataview is for queries that need its query language or JavaScript API; Bases covers plain property filters.
- Obsidian Git is optional if you already commit with the CLI.
Avoid plugins that rewrite note content on save; they create diffs you did not author. Install and configuration notes are in obsidian-plugins.