For my previous digital garden I’ve used Obsidian Publish. It’s powerful in it’s simplicity - select some notes, click publish and you’re done. That simplicity has a price though, to the tune of 96$/year and a fair amount of restrictions on how you can customize your site. You can provide a css theme and a single .js file.

And while I was struggling with what I want my digital garden to become (see Rethinking my digital garden) I’ve decided that I want a more customizable solution going forward. So here it is in all it’s over-engineered glory 🤓.

flowchart LR
    subgraph Local["Local Obsidian"]
      PrivateLocal["Private Notes"]
      PublicLocal["Public Notes (submodule)"]
    end

    subgraph GitHub["GitHub Repositories"]
      PrivateRemote["Private Notes"]
      PublicRemote["Public Notes"]
      QuartzRemote["Quartz App"]
    end

    Contributors["Other contributors"]

    subgraph Cloudflare["Cloudflare"]
      Worker["Worker"]
      Host["CDN"]
    end

    PrivateLocal[Private Notes] -->|push| PrivateRemote["Private Notes"]
    PublicLocal -->|push| PublicRemote
    Contributors -->|push| PublicRemote
    PublicRemote -->|Workflow: copy to /content/| QuartzRemote
    QuartzRemote -->|trigger| Worker
    Worker -->|Build & Publish Site|Host

For this setup I’m using 3 repositories:

  • Private Notes: Containing all of my second brain notes
  • Public Notes: Containing all of my digital garden notes. It’s setup as a git submodule of Private Notes. This allows me to locally interact with Private Notes as one big Obsidian Vault that contains both my private & public notes.
  • Quartz App: A fork of Quartz, a static site generator that turns my digital garden notes from the Public Notes repo into a website. A GitHub workflow in the Public Notes repository automatically copies & commits new notes from Public Notes into the /content/ directory of the Quartz app.

To host this digital garden I’m using Cloudflare Workers. It’s similar to GitHub Pages and free for static sites. I’ve decided on Cloudflare vs. GitHub Pages because I already use it as DNS server for my domain and it was easy to setup. Another small advantage of Cloudflare is that it allows me to keep all the git repositories private whereas GitHub Pages requires a repository to be public in the free plan. But it’s a small advantage because in the end this is a public site anyway.

I’m sure this whole workflow can be simplified a lot. But it does provide the following benefits:

  • A single unified Obsidian Vault containing both private & public notes and allowing linking in between (although linking from public to private is a bit dumb).
  • Publishing a notes is as easy as moving it into the public folder in my Obsidian vault and pushing it. The rest is fully automated.
  • My AI agents can read/write and publish both private and public notes
  • Independent contributors can commit & publish public notes automatically (or via. PR).
  • Quartz code & notes are in independent repositories. Quartz can be changed or replaced without impact.