Blog

Thoughts on python development, DevOps, and technology

Hardening Django in Production: The Security Fixes That Actually Matter

An exposed .env, an unguarded admin URL, rate limiting that broke per-worker, missing security headers — the holes that show …

How I Auto-Deploy Django to a Hetzner VM with GitHub Actions

What happens after `git push origin main` on this site: an SSH trip to a Hetzner VM that pulls the …

Scheduled Publishing in Django: Why a Post Hides Itself

This site hides a post unless is_published is True AND published_at is set and in the past. Why? Because a …

🏗️ Terraform + Ansible: Deploy Django Without Manual Server Steps

Manual server setup is unreproducible. Terraform defines infrastructure as code — servers, networks, firewalls. Ansible configures the environment — dependencies, …

⚙️ A Working CI Pipeline for Django: What Actually Needs to Run

A Django CI pipeline requires three mandatory stages: tests (pytest/Django runner), linting (Black/flake8), and security scans (bandit/check --deploy). Everything else …

🧩 HTMX Lets You Skip the Frontend Framework — How It Works

HTMX replaces JavaScript frameworks by having the server return HTML fragments that the browser swaps directly. No JSON APIs. No …

⚡ Why Django ORM + PostgreSQL Indexing Defines Query Speed

Indexing is not optional. Without it, PostgreSQL scans entire tables. With it, queries jump straight to rows in logarithmic time. …

How I Deploy My Django App: One VM, Ansible, Docker, and What I Learned Writing It Down

Most portfolio deploys are done by hand and remembered by hope. I rewrote mine as code: Ansible to provision and …

Staging Is Not Dev: Understanding Git Workflows and Environments

One of the biggest confusions for junior developers: where do I code, where do I test, and how does Git …

When the Scanners Came Knocking: A Production Security Retrospective

What happened when my newly-launched Django portfolio site got hit by automated vulnerability scanners, and the 6 changes I made …