Every journal needs a first entry, and every pipeline needs a first deploy. This post is both.

If you can read this, the following chain of events worked end to end: a git push landed on a self-hosted Forgejo, a CI workflow rendered this site with Hugo inside an unprivileged build container, packed it into an OCI image, pushed that image to the server’s own registry — and a webhook swapped the running container for the new one, with an automatic rollback standing by in case anything went wrong.

git push && sleep 60 && curl -s https://dreaminginelectric.com/posts/hello-world/

More dispatches to follow.

Update: this very sentence arrived via the pipeline’s first fully automatic push-to-live deployment.