runtimeterror/content/posts/publish-silverbullet-notes-quartz/index.md

2.6 KiB

title date draft description featured toc reply categories tags
Publish Silverbullet Notes with Quartz 2024-09-28 true This is a new post about... false true true Self-Hosting
api
automation
caddy
cicd
selfhosting
tailscale

It's been about two months since I switched my note-keeping efforts from Obsidian to SilverBullet, and I've been really enjoying it. Being able to access and write my notes from any device with a web browser has been super convenient, and SilverBullet is packed with useful features (and easily extensible to add new ones) without feeling slow, bloated, or otherwise cumbersome. The container-based setup is also easy to deploy.

But one use case I hadn't yet migrated from Obsidian to SilverBullet was managing the notes I share publicly at notes.runtimeterror.dev using Quartz. I had set this up using a public repo containing the Quartz code with a dedicated (public) Obsidian vault folder embedded within. Since the contents are just Markdown files I could simply edit them directly and cut out Obsidian altogether, but I could see myself struggling to keep up with the links between notes if I was editing them manually. I really wanted to find a way to use SilverBullet for my published notes too.

I played a bit with SilverBullet's publishing plugin, which would let me selectively publish notes in certain folders or bearing certain tags, but the HTML it produces is a bit sparse. I didn't want to give up the Quartz niceties like the auto-generated navigation menu and built-in search.

After a little experimentation I settled on an approach that I think works really well for my needs:

  • SilverBullet syncs to a private repo via the Git plug.
  • Pushes to that private repo trigger a workflow run in my (public) Quartz repo.
  • A workflow in the Quartz repo clones the private SilverBullet repo to content/.
  • Quartz processes the Markdown files in the content/ directory and renders HTML output to public/.
  • The contents of public/ are transferred to my server via Tailscale, and then served by Caddy.

This post will describe the entire setup in detail.