Why I Migrated from VitePress to Hugo for This Blog
I moved this blog from VitePress to Hugo because it is mostly text. The old setup shipped too much JavaScript for pages that should just load.
I moved this blog from VitePress to Hugo because it is mostly text. The old setup shipped too much JavaScript for pages that should just load.
· git
Lnk moves dotfiles into ~/.config/lnk, leaves relative symlinks behind, supports host-specific files, and runs bootstrap scripts. Git stays the source of truth.
· llm
One prompt works for small hacks. Larger projects need product context, technical constraints, module boundaries, sprint-sized slices, and tight test loops.
· go
pin is a Go spinner with colors, prefixes, message updates, pipe detection, and no external dependencies. It exists because a spinner should not drag a UI framework into a small CLI.
· docker
SSL certificates should be boring. Zero is a small Go binary that handles ACME challenges, renews certificates, writes them to a shared volume, and reloads Nginx.
· docker
FTL deploys Docker apps over SSH with one YAML file, no required registry, Nginx routing, SSL, health checks, and deployment hooks. It is for the space between rsync scripts and a full orchestrator.
· go
I needed a spinner for a Go CLI and ended up inside a UI architecture. Some terminal libraries are great. They are also the wrong tool for a linear command that just needs progress output.
· docker
Docker networking gets a lot easier once you separate internal ports from host port mappings. Containers talk by service name and internal port. The outside world uses the mapped port.
· go
Go 1.23 added range-over-function iterators and the iter package. For CLI progress streams, that can replace channels, goroutines, and hand-rolled state machines.
NextJS App Router does not require Vercel. A standalone build, one Node container, one Nginx container, and Docker Compose are enough for a boring self-hosted deployment.