I’ve always been looking for a way to centralize the data I want to share with people and the stuff I want to keep private in a single context. I tried Ghost CMS, Medium and a few other alternatives along the way, but there was always something that didn’t quite work for me: too opinionated, too limited, or just not mine.

Obsidian has always been convenient for managing notes during my studies, and I wanted to avoid copying and pasting things I wanted to make public just to duplicate them. This setup is the result.

The obvious next question was how to publish. Obsidian Publish, the official hosting service, would have been the easy choice, but at $10/month it didn’t feel worth it when I could self-host for free. Beyond the cost, it’s a closed platform: you get what you’re given and nothing more. With Quartz I can extend the frontend with custom components, which gives me complete freedom to build the site however I want.

All content is written in Obsidian. I keep all my notes, both private and public, in a single vault. Not everything I write ends up here: only notes with publish: true in their frontmatter are included in the build, which lets me write freely without worrying about accidentally publishing something private. The vault lives in a private GitHub repository, so unpublished notes stay off the public internet while still being version-controlled and backed up.

Architecture

Here’s how all the pieces fit together:

Instead of maintaining a separate repository for Quartz, I added the official project as a git subtree inside my own repo. This lets me pull upstream Quartz updates directly while keeping everything in one place. At build time, Quartz reads the vault and generates the static site, publishing only the notes I’ve explicitly marked as public. Every push to the main branch triggers a build on Cloudflare Pages, which builds and serves the site on my custom domain, registered and managed through Cloudflare.