May 19, 2026 · 5min code problem-solution

Implementing the blog

Preamble

Spent a few hours today implementing the blog on this website. It seems there are only a few options to write a blog:

SolutionStart EffortWriting EffortCoder Satisfaction
Commercial platformLowLowBelow absolute zero
Premade docker containerLowLowMedium
Self-host WordPressMediumLowNope :\
Static Site Generator (SSG)MediumMediumGood
Self-coded SSG with dynamic writingHighLowAmazing

As usual, the option that gives the greatest satisfaction is the one that starts with "what if i write a little tool that..." /s

My Journey

Taking great care to limit the gigantic NIH (Not Invented Here syndrome) inside of me, I decided to implement my blog as option #4: Static Site Generator. Luckily, my website is already made with Zola!

Templates

The templates are not really interesting: one page lists posts, another renders a post, and Zola does the rest. I will link the code here once I publish the repo.

Posts

Posts are written as markdown with a simple header at the top:

+++
title = "Implementing the blog"
slug = "2026-09-19-implementing-the-blog"
date = 2026-09-19
+++

## Preamble
Spent a few hours today implementing the blog on this website. It seems there are only four options to write a blog:

...

As usual, the option that gives the greatest satisfaction is the one that starts with "what if i write a little tool that..." /s

## My Journey
Taking great care to limit the gigantic NIH ([Not Invented Here Syndrome](https://en.wikipedia.org/wiki/Not_invented_here)) inside of me, I decided to implement my blog as option #4: Static Site Generator.
Luckily, my website is already made with [Zola](https://getzola.org/)!

...

The Problem

I am somewhat a lazy person, so if something takes just more effort than necessary I will be lazy to do that thing.

So if writing a post requires me to rsync it to the server afterwards, chances are it will not happen:

$ git add .
$ git commit -m "write a post about ..."
$ git push
$ zola build
$ rsync -av public/* server:/opt/www/lovie.dev/

And it requires me to have an SSH key for my server on each machine I wanna write on. Impossible lol.

No-JS

No-JS is a massive challenge I set for my site. JavaScript is a horrible language, but this is, surprisingly, not the issue here. Most private networks like Tor and I2P promote a no-js environment for security. I want even the most privacy-obsessed nerd to be able to read my blog (yes I might be going insane), so no-js is a requirement for me.

I do use JS for some Quality-of-Life features like the light/dark mode toggle, but the posts are not optional.

Possible Solutions

0. Live with it

Seriously, for most people, this is the solution. Compiling and rsync-ing the site takes extra 3 seconds. As for the SSH keys, most people can draft posts anywhere else (like in Obsidian!), then simply copy it to the git repo, build, and sync (both building and syncing can be automated with a simple justfile).

But who are we? We are nerds! So that does not apply.

1. Pre-made solutions

There are many solutions already available which can be self-hosted and provide on-site writing and drafting features (which requires auth and admin pages which is meh but kinda required so whatever lol).

// TODO: For some reason I wasn't able to find any example to put here, but I do remember coming across some a year ago. Maybe this doesn't exist anymore, or perhaps I'm going insane. Sidenote: WordPress fits this definition, but there is a reason why it is not mentioned in the solutions list lol.

2. The "Web 2" solution

A website that queries a server for posts and then post content and renders it. The simplest solution if you have to write your own site and write from anywhere.

But this requires auth and admin panels which complicates the development.

NO-JS. I require no-js, so this just won't work for me.

3. Server-based Static Site Generators

This is the cleanest solution by far. Use markdown to write posts and render then into a static website, but render them on the server and provide an endpoint where the site owners can draft and post. Unfortunately, I couldn’t find an open-source solution that matched what I wanted (this is definitely not a suggestion for somebody to write one /s). Same goes for the auth requirement as the previous solution.

My Solution

The server-based static rendering seemed the best, but I just could not bear implementing auth, so instead my server used a CRON script to fetch my website repo every 5 minutes, compare the hashes, and build the site if they do not match:

#!/bin/sh
set -eu

SITE="WEBSITE_GIT_REPO_PATH"
BRANCH="main"
PUBLIC="/opt/www/lovie.dev"

cd "$SITE"

git fetch origin "$BRANCH"

LOCAL="$(git rev-parse HEAD)"
REMOTE="$(git rev-parse "origin/$BRANCH")"

if [ "$LOCAL" = "$REMOTE" ]; then
    exit 0
fi

# This is fine :D
git reset --hard "origin/$BRANCH"

zola build

rsync -a --delete public/ "$PUBLIC/"

Because this generates plain html and css, no-js works perfectly fine and I don't rsync anything. I can write posts form anywhere I can access my GitLab.

Conclusion

This is not the most efficient nor the cleanest solution, but it works and solves the problem I face, so I'm happy.

Did I spend way too much time thinking about this and writing this post? For sure. Did I enjoy it? Yes.