Map

Quartz

Toolbox toolboxtypescriptstatic-site-generatorobsidiandigital-gardenpublishingpkmTypeScriptMIT โ†ณ show in map Markdown
title
Quartz
type
toolbox
summary
Static-site generator that publishes Obsidian-compatible Markdown vaults as digital gardens
tags
typescript, static-site-generator, obsidian, digital-garden, publishing, pkm
language
TypeScript
license
MIT
created
2026-04-22
updated
2026-04-22

Quartz is a static-site generator built by Jacky Zhao (jackyzha0) for publishing personal Markdown vaults as websites. The pitch is narrow on purpose: it's the publishing layer for digital gardens. Drop a folder of Markdown into content/, run npx quartz build, get a site with wikilinks, backlinks, full-text search, a graph view, and popover previews โ€” the same affordances Obsidian users already rely on, served as static HTML.

Originally derived from Hugo, the project rewrote itself in TypeScript with a JSX-based component system. Source code ships in full to every user; there is no opaque CLI binary doing the rendering.

What it does

The compile pipeline is: Markdown โ†’ unified/remark AST โ†’ plugin-driven transforms โ†’ JSX render โ†’ static HTML. Plugins exist at three stages โ€” parsing, filtering, and emitting โ€” and the standard ones do the work most digital-garden authors expect:

  • Resolve [[wikilinks]] and ![[transclusions]] (Obsidian-style)
  • Render frontmatter properties, callouts, and Mermaid diagrams
  • Build the backlinks index
  • Generate the graph data for the in-page graph view
  • Produce a lunr.js full-text search index served client-side
  • Run KaTeX for LaTeX, Shiki for syntax highlighting

Page-level interactivity (search, graph, popovers, SPA routing) ships as small client bundles, not a framework. Page navigation runs through micromorph for SPA-style instant transitions without a full SPA's runtime cost.

Obsidian compatibility

The compatibility surface is the differentiator. Most static-site generators treat Markdown as a lowest-common-denominator format and ignore Obsidian extensions. Quartz treats Obsidian Flavored Markdown as the input contract:

  • Wikilinks resolve by filename across folders, just like Obsidian
  • Transclusions render inline content from another file
  • Callouts render with the same > [!note] syntax
  • Frontmatter properties (tags, aliases, parent) are first-class
  • Folder structure becomes URL structure
  • Hidden files (prefixed _) and Obsidian's .obsidian/ config are filtered automatically

The practical consequence: you can author in Obsidian, commit, push, and the published site looks like a styled version of what you saw locally. No translation step, no incompatible-syntax hunts.

Customization tiers

Three explicit modes, called out in the philosophy page:

  1. Content-only. Edit content/, leave everything else alone.
  2. Config-only. Tweak quartz.config.ts (plugins, theme, metadata) and quartz.layout.ts (page structure โ€” header, sidebar, footer composition).
  3. Source-level. Modify any plugin or component directly. The project ships its full source as part of the install, so users can fork the rendering pipeline without forking a separate repo.

This is the same "ship the source, don't hide the engine" pattern as karing (sing-box fork shipped with the client) and mihomo (Clash fork). The Quartz-specific motivation is that personal sites are personal โ€” defaults should be opinionated but not load-bearing.

Build and host

npx quartz build --serve runs the dev server with hot reload on config changes and incremental rebuilds on content edits. Output is plain static HTML/CSS/JS suitable for any static host: GitHub Pages (the default path documented), Cloudflare Pages, Netlify, S3, self-hosted nginx, or a Docker image. The repo includes Dockerfile and docker-compose configs out of the box.

Build performance is a stated priority. Incremental rebuilds keep the iteration loop tight even on vaults with thousands of files; SPA routing keeps published pages feeling instantaneous after the first load.

Philosophy

The philosophy page is unusually direct for a static-site generator. Three claims that drive the design:

  • A garden should be a true hypertext. Quoting Mike Caulfield's "The Garden and the Stream" โ€” Quartz rejects file-cabinet hierarchies and Zettelkasten-style upfront categorization. Thinking is rhizomatic, the publishing tool should be too.
  • A garden should be shared. Hamming's "door open" quote is load-bearing. Half-baked notes published create feedback loops that fully private notes cannot.
  • A garden should be your own. The three customization tiers exist so the tool fits both non-technical writers and senior developers without forcing either into the other's workflow.

The project explicitly sees itself as "agentic software" โ€” opinionated defaults, full user control, no lock-in.

Tradeoffs

  • TypeScript and Node v22+ required. Heavier toolchain than Hugo or Zola; trivial if you already have Node, friction if you don't.
  • Obsidian-shaped or nothing. Quartz isn't a general-purpose SSG. If your content isn't a wiki-style vault, the default themes and components will feel over-equipped.
  • Plugin system, not theme marketplace. Customization happens in code, not by dropping a theme folder in. Power-users love this; non-coders hit a wall faster than with Hugo themes.
  • Discord-first community. Issue tracker is reasonably active but most live help happens on Discord, which is fine if you live there and worse if you don't.

Repo

https://github.com/jackyzha0/quartz โ€” 11,915 stars, 3,704 forks, MIT licensed, created 2021-07. Documentation site at quartz.jzhao.xyz is itself built with Quartz, which is the cleanest possible demo.