I’ve been a Python developer for years, and I usually stick to the standard tools: make for shortcuts, uv, poetry or pip for dependencies, and Docker for everything else.
They work great. But recently, on a project with a mix of Python scripts, frontend assets, and Docker containers, I hit a wall.
I found myself writing a Makefile that was 200 lines long. Half of it was just checking if the virtual environment was active. The other half was trying (and failing) to run tests in parallel without breaking the database setup.
I looked at tools like just (which is amazing, by the way), but I wanted something that felt a bit more “Python-native” — something that understood pyproject.toml and .venv without me having to script it manually.
So, I did what any procrasti-working developer would do: I decided to build my own.
It’s called Zetten, and I wrote it in Rust.
The goal
I didn’t want to replace make or just. I just wanted a tool that:
- Implicitly understands Python: If I run
ztn run test, it should know to look forpytestin my virtual env. - Is fast: It shouldn’t add latency to my dev loop.
- Handles dependencies: “Don’t run tests until the build is done.”
The “happy accident” with AI
As I was building it, I realised something interesting. When I tried to get Cursor or Copilot to work on my repo, they often struggled with my complex Makefiles. They would hallucinate commands or flags.
But once I moved my tasks into Zetten’s config (which is just a TOML file), the AI agents suddenly got much smarter. They could read the config and know exactly how to run the project.
It wasn’t a planned feature, but it turned out that explicit configuration is great for both humans and AI.
I’ve been using Zetten on my own projects for a few months now, and it’s finally stable enough to share. If you’re curious about Rust, or just tired of maintaining complex shell scripts for your Python projects, give it a look.
I’m still learning Rust, so if you spot any borrow-checker crimes in the codebase, let me know!
Follow the journey
I’ll be posting here regularly about my experience building Zetten, optimising its performance (I’m aiming for <10ms overhead), and deeper dives into how I’m making it “AI-First.”
Subscribe on Substack to follow along.