Software engineering notes & case studies
Software engineering, from first principles to production.
Notes on backend systems, search, delivery, and the engineering decisions behind reliable software.
From Docker Compose to K3s: Evolving a Home-Server Deployment
Why a single-host IMDb Clone deployment moved from Docker Compose to K3s, Ansible, Argo CD, encrypted GitOps, managed TLS, and observable release flows.
2023
How to Cheaply Host Your Full-Stack Side Project: Serving It from Home
Hosting a stateful full-stack side project on one home server with Docker Compose, Traefik, dynamic DNS, HTTPS, and a realistic recovery plan.
spring bootHere is the backend to my IMDb Clone!
Exploring the modular Spring Boot backend for an IMDb clone with PostgreSQL, OpenSearch, accounts, ratings, watchlists, and rebuildable search projections.
2021
Managing Environments with Conda and pip
Managing Python environments with conda and pip, including channels, package exports, and reproducible setup files.
PythonTurning a Website into an API
Designing a typed FastAPI adapter around GitHub Trending, from resilient HTML parsing and fixture tests to caching, containers, and releases.
PythonPublishing a Pure-Python CLI with Conda - 9/9
Deciding when a conda package adds value, writing a noarch recipe, testing it, and publishing it without unnecessary platform conversion.
PythonBuilding a Reliable PyPI Release Pipeline - 8/9
Versioning, building, checking, testing, and publishing one immutable Python release through GitHub Actions and PyPI.
PythonDocumentation as Part of the Product - 7/9
Designing documentation for users and maintainers, then building tested API and project documentation with Sphinx.
PythonTesting a Python CLI and Automating CI - 6/9
Testing CLI output and failures without live HTTP, exercising built packages with tox, and choosing a focused GitHub Actions matrix.
PythonPackaging a Python CLI with Console Scripts - 5/9
Packaging a Python CLI with setup.py, a src layout, dependencies, and an installable console entry point.
ScriptingWhy a Bash Installer Becomes a Liability - 4/9
Building a careful user-level installer for a Python CLI and discovering which packaging responsibilities it still cannot solve well.
PythonDesigning a CLI with argparse - 3/9
Replacing manual argument parsing with argparse while keeping parsing, network behavior, output, and process termination separate.
PythonWhen sys.argv Stops Scaling - 2/9
Reading command-line arguments with sys.argv, defining useful exit codes, and seeing why manual CLI parsing becomes difficult to maintain.
PythonFrom a Python Script to a Command-Line Tool - 1/9
Starting with a tiny Python HTTP client and identifying the contracts that turn a useful script into a reliable command-line tool.