From Obsidian to Blog in One Push

This blog runs on Quartz — a static site generator built specifically for Obsidian vaults. Here is how the publishing pipeline works.

The Flow

graph LR
    A[Obsidian] -->|git push| B[Gitea]
    B -->|webhook| C[Builder]
    C -->|npm build| D[Static Files]
    D -->|nginx| E[blog.revur.net]
  1. Write in Obsidian like normal — wikilinks, callouts, tags all work
  2. Push to a Gitea repo
  3. A webhook triggers the builder container
  4. Quartz compiles markdown to a static site
  5. nginx serves it

Why Quartz?

FeatureQuartzHugoJekyll
Obsidian wikilinksNativePluginNo
CalloutsNativeNoNo
Graph viewBuilt-inNoNo
Full-text searchBuilt-inExternalExternal
Build speedFastFastestSlow

Wikilinks just work [[self-hosting-matrix]] in Obsidian creates a working link on the blog with hover previews. No conversion step needed.

Writing

The Builder

The builder is a lightweight Node.js container that:

  1. Listens for Gitea webhooks (HMAC-SHA256 verified)
  2. Pulls the latest code
  3. Runs npx quartz build
  4. Atomically swaps the output directory

Total deploy time from push to live: under 60 seconds.

Zero Maintenance

Since everything is in Docker with auto-restart, the pipeline requires no babysitting. Write, push, done.