=============
== Leo Qin ==
=============

About This Blog

Frameworks

This blog is the second iteration of my blog. The first one was a WordPress site hosted on GoDaddy using a version of PHP that was many versions too old, a super heavy theme, and an extremely complex block based layout generator.

This second iteration is a completely static site generated by Hugo. The theme is called smol and it uses no javascript client-side.

Architecture

This blog is served by Cloudflare Pages, using their built-in Hugo integration. In particular, I use their integration with GitHub, where they subscribe to the main branch of a dedicated blog repository. So, when I push to main, Cloudflare will react by pulling down my changes and re-building and re-deploying the site. In practice, this takes less than a minute, sometimes less than 30 seconds.

If you want to explore the source code of this blog you can find it here.

But how does my code get to Github? Here’s where it gets weird.

This site is actually a mirror of a site in my home network. That site runs as a docker compose stack containing the generated static site files and a nginx web server.

The code for this site is stored in a self-hosted Gitea instance deployed in my home network using self-hosted Drone CI.

Gitea mirrors the code to GitHub using a push mirror authenticated with a GitHub Personal Access Token.

Ergo - when I push to main in Gitea, Drone CI gets alerted via webhook and deploys my blog locally, while Gitea force-pushes to Github, and Cloudflare deploys my site to the public internet.

It’s fun watching them race, sometimes.