I keep most of my notes in Obsidian. I wanted a blog that worked the same way, where publishing a post means writing a note and nothing else. No server to run, no CMS to maintain. This is how I set it up.

What is a static website?

A static site is just a folder of files. When someone requests the page, the server hands back the file. There’s no database, or code running to assemble the page on request. This is important because there’s nothing server-side to exploit or keep patched. Because of the small footprint, it’s free to host, and lets you host your blog posts in Markdown.

Being that I use Obsidian daily, being able to use markdown files that I could host on github works well. I chose to use Hugo to help me do this. Here’s how I did it:

Install Hugo

Hugo is in the standard arch repo, and same goes for most other repositories:

sudo pacman -S hugo

sudo apt install hugo # if debian based

Check it installed:

hugo version

Create the site

Scaffold the site with one command:

hugo new site blog
cd blog

I used PaperMod for the theme. It gets added as a git submodule:

git submodule add https://github.com/adityatelange/hugo-PaperMod.git themes/PaperMod

and set in hugo.toml:

baseURL = "https://payloaf.sh/"
title   = "payloaf.sh"
theme   = "PaperMod"

Open the folder as an Obsidian vault

The blog folder is also my Obsidian vault. I opened it with “Open folder as vault”, so writing a post is just making a note in content/posts.

I use two plugins. Templater fills in the front matter on new posts so I can keep the posts consistent. The Git plugin commits and pushes the vault to GitHub.

Sort out the front matter

Every post starts with a block of metadata at the top. Hugo writes it in TOML (+++) by default, but Obsidian’s Properties panel only reads YAML (---), so I switched to YAML. Hugo reads both, so nothing else had to change.

It looks like this:

---
title: "How I turned my Obsidian vault into a static blog website"
date: 2026-11-10T22:22:52+00:00
draft: true
tags: ["hugo", "obsidian"]
---

By default Hugo sets draft = true. Change it to false when you want the post published, otherwise it stays hidden on the live site.

Templates and files

Templater fills in the front matter for me on every new post, with a separate template for box write-ups. Each post lives in its own folder, so images and any files I attach, like a script, sit right next to the write-up and get published with it.

Put it on GitHub

The vault is a git repo, so I made a private repo and pushed to it. Private because only the built site needs to be public, not the drafts and notes.

gh repo create <repo> --private
git remote add origin [email protected]:<you>/<repo>.git
git push -u origin main

Deploy with Cloudflare Pages

I connected the repo to Cloudflare Pages. It runs Hugo on every push and serves the output. The settings are build command hugo, output directory public, and a HUGO_VERSION variable so it builds with the same version I use locally. Then I pointed payloaf.sh at it and Cloudflare sorted the certificate.

Publishing a post

Day to day I don’t touch the terminal. The Obsidian Git plugin commits and pushes the vault for me, and Cloudflare rebuilds off the push. So publishing is: write the note, set draft to false, commit and sync.

That’s the whole loop.