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]
- Write in Obsidian like normal — wikilinks, callouts, tags all work
- Push to a Gitea repo
- A webhook triggers the builder container
- Quartz compiles markdown to a static site
- nginx serves it
Why Quartz?
| Feature | Quartz | Hugo | Jekyll |
|---|---|---|---|
| Obsidian wikilinks | Native | Plugin | No |
| Callouts | Native | No | No |
| Graph view | Built-in | No | No |
| Full-text search | Built-in | External | External |
| Build speed | Fast | Fastest | Slow |
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:
- Listens for Gitea webhooks (HMAC-SHA256 verified)
- Pulls the latest code
- Runs
npx quartz build - 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.