↓ Skip to main content

Writing and Publishing from Obsidian to Hugo

·313 words·2 mins
Author
PN

Obsidian.png

One of the goals for this site was a frictionless writing pipeline — write in Obsidian, publish to the web with a single command. Here’s how it works..

The Stack
#

  • Obsidian — where posts are written, on the laptop
  • Hugo — static site generator, builds the HTML
  • GitHub Actions — builds and deploys on every push
  • GitHub Pages — hosts the final site

The Pipeline
#

A single bash script handles everything between writing and publishing:

  1. rsync copies posts from the Obsidian vault to Hugo’s content/blog/ directory
  2. A Python script converts Obsidian image syntax (![image.png](/images/image.png)) to standard Hugo markdown and copies images to static/images/
  3. Git commits and pushes to main
  4. GitHub Actions picks up the push, runs hugo --minify, and deploys to GitHub Pages

The whole thing takes about two minutes from running the script to the post being live.

Why This Setup
#

Hugo is fast, free to host, and the source files are plain markdown in a git repo — no database, no CMS, no lock-in. Obsidian is already where notes and documentation live, so writing a blog post feels no different to writing any other note.

The pipeline itself is a small bash script and a short Python file — nothing exotic. It will eventually move to a custom domain via Cloudflare Pages, but for now GitHub Pages works perfectly.

What’s Next
#

The next step is pointing this at a custom domain via Cloudflare and integrating it with the broader homelab stack — the same k3s cluster, ArgoCD, and CI/CD pipeline that manages everything else.

The source for this site is at github.com/pakube999/pakube999.github.io.

Credit
#

The Obsidian-to-Hugo pipeline concept was inspired by NetworkChuck’s blog post on his writing workflow. The bash and Python scripts were adapted from his approach and modified for this setup — GitHub Actions deployment rather than Hostinger, and Linux paths throughout.

NetworkChuck’s original post