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.md per 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.

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.