Blog

Python Project Setup (2026 Edition)

A few years back I linked to Alex Mitelman’s Python best practices post as my go-to reference for new project setup. The tooling has moved on quite a bit since then, so here’s my updated take.

The new stack is three tools, all from Astral: uv, ruff, and ty. They’re fast, they integrate cleanly with each other, and they collapse a lot of the old toolchain into a much simpler setup.

uv — dependency management, environments, everything

uv replaces pyenv + pip + venv in one shot. It handles Python version management, virtual environments, dependency locking, and running commands in the right environment.

Linux Bonding with VLANs

Every time I set up network bonding on a Linux box I end up digging through the same stack of man pages and blog posts from 2014. This is my attempt to write it down somewhere useful.

The Setup

The goal is straightforward: combine two physical NICs into a bonded interface for redundancy (or throughput), then layer VLAN-tagged sub-interfaces on top of the bond. This is bread-and-butter stuff for any server attached to a managed switch.

Python Typer

I love writing a good cli tool, but it’s no fun parsing switches and arguments. Python’s click is a solid choice, but lately I’ve been loving typer. Typer is a super easy-to-use library, built on top of click.

Typer uses method variables and type hints to generate and parse the command line arguments for you, and even generates the help context. It’s practically magic.

check it out:
Typer

Python Best Practices

I always forget which tools are the latest and greatest to use when I’m setting up a new Python project. Alex Mitelman published a really helpful summary here:


Python Best Practices for a New Project in 2021

Control Chromecast From Linux / BSD / MacOS
$ export URL="http://ccmixter.org/contests/freestylemix/hisboyelroy/freestylemix_-_hisboyelroy_-_Revolve.mp3"
$ playerctl -p My_Chromecast open "$URL"

This will play a song on the Chromecast.

Ok, that’s awesome. chromecast_mpris, by Alex DeLorenzo

Query Instance Metadata on Google Cloud

I needed my web server to dynamically find the database instance in my Google Cloud project. Yes, I could use DNS, or environment variables. Instead, I just wanted to look it up at runtime via a start script.

The only magic here was getting the format string correct.

gcloud compute instances list  --project nicks-project --filter="tags:db" \ 
--format='value[](networkInterfaces[].networkIP.notnull().list():label=INTERNAL_IP)'

Done!

Taking Better Meeting Notes

I usually take lots of notes during meetings, but they’re usually pretty random, and I almost never do anything with them. I’m not sure I’ll enact all of the ideas in Vasili’s note, but he has some really good recommendations for taking great notes, and actually doing something with them afterwards :)

Source: https://barehands.substack.com/p/how-to-take-meeting-notes

No Script Is Too Simple

What must be done (“start the project”, “run the tests” etc.) won’t change. How it must be done (“yarn …”, “docker-compose …”) can change multiple time in a project’s lifespan. It’s a lot easier to update a single script than to propagate a new set of commands.

Source: https://nicolasbouliane.com/blog/no-script-is-too-simple

Note Taking by Hand

Computers and phones have become the go-to note-taking method for many. But your brain benefits from an old-fashioned pen and paper.

Source: https://www.bbc.com/worklife/article/20200910-the-benefits-of-note-taking-by-hand