Skip to content

Dispatches

Python Code Quality: Black, Flake8, and Ruff

Python's flexibility is a feature, but that same flexibility means every team is one undocumented style preference away from a code review thread about trailing whitespace. Linters and formatters exist to take those conversations off the table and keep them there.

Three tools dominate the Python ecosystem today: Black, the opinionated formatter; Flake8, the composable linting wrapper; and Ruff, the Rust-powered all-in-one tool that has become the default choice for new projects. Each takes a different approach to the same goal of keeping Python code clean, consistent, and readable.

This post covers what each tool does, the trade-offs involved in choosing between them, who is behind each project, and why Ruff has become the tool to reach for on a greenfield Python project in 2026.

Configuring the GitHub Issue Template Chooser

When you add issue templates to a GitHub repository, the "New Issue" button no longer opens a blank editor. GitHub replaces it with a chooser: a page that lists each template by name and description and, by default, includes a link that lets contributors skip the templates and open a blank issue. The chooser is useful on its own, but a small configuration file alongside your templates gives you considerably more control over what contributors see and where they can go.

The file, .github/ISSUE_TEMPLATE/config.yml, controls two things: whether blank issues are allowed, and whether additional links appear in the chooser that point contributors to discussions, documentation, or other resources.

This post covers how the file works, what options it supports, and how I use it across my own projects.

Elevate Your Git Workflow: A Guide to Using pre-commit

Every developer has pushed a commit they immediately regretted: a trailing whitespace violation that failed the linter, a file left with Windows line endings, a secret accidentally included in a configuration file, or a Go source file that was never formatted with gofmt. These are the kinds of issues that are trivial to catch but easy to forget under deadline pressure. Pre-commit hooks are the last line of defense between your editor and your repository, and pre-commit is the framework that makes managing them across multiple languages and projects practical.

This post covers what pre-commit is, why you should consider it in your development workflow, how to get it running on your machine, how to run it in CI, and how to use your own hook repository.

Use Ansible Collections Directly from Source During Development

I've recently been working on writing an Ansible collection from scratch. The collection ships everything in a single repo – the collection itself, example playbooks, roles, and supporting content. As it matured I started running it through Ansible Automation Platform (AAP) alongside local development, and that's when a friction point I hadn't anticipated started to slow me down.

I'd been using a Makefile to build and install the collection locally before testing it. Every change - a tweak to a module, an update to a role - meant stopping, rebuilding, reinstalling, then running the playbook. It was interrupting the flow constantly. But I couldn't just rip that out, because I also needed AAP to be able to pull the collection directly from the repo without a manual build step. I needed a setup that worked for both, without breaking either.

When you use AAP with a project repo that also contains the collection you're developing, you end up with a constraint that makes local development awkward. This post explains the problem and how to solve it.

govm: Switch Between Go Versions Without the Headache

If you write Go code regularly across multiple projects, you have almost certainly run into this situation: one project pins to Go 1.22, another requires Go 1.23, and a third is cutting edge on whatever just shipped. Installing Go manually, updating your PATH by hand, and keeping track of which binary lives where is tedious and error-prone. A version manager removes all of that friction.

govm is a lightweight, open-source Go version manager built by Melkey. It ships both a polished terminal UI (TUI) and a clean command-line interface, installs Go releases directly from go.dev, and uses a shim-based approach to switch versions without touching your shell configuration after the initial setup. It has become a regular part of my toolbox as an open source developer who routinely jumps between Go releases.