Fast task runner for Python projects
Project description
Zetten
Zetten is a fast, deterministic task runner for Python backend projects, written in Rust. It provides a reliable way to run common backend tasks - tests, linters, type checks, builds - using a single execution engine that behaves the same locally and in CI. Zetten replaces ad-hoc setups built from Makefiles, shell scripts, nox/tox, and CI YAML glue with a small, explicit, and predictable tool. Zetten is inspired by tools like make, nox, just, and cargo, but is designed specifically for modern Python backend workflows.
Why Zetten
Python backend projects often rely on a mix of:
- Makefiles
- shell scripts
- tox / nox
- CI YAML logic
These approaches are flexible, but they are often:
- non-deterministic
- slow as projects grow
- hard to reason about
- inconsistent between local runs and CI
Zetten focuses on a small set of guarantees:
- The same inputs always produce the same results
- Tasks only run when their inputs change
- Independent tasks run in parallel
- Local and CI execution behave identically
Features
- Fast execution using a Rust-based core
- Deterministic task caching based on input hashing
- Python virtual environment awareness
- Automatic environment detection without manual activation
- Parallel task execution using a worker pool
- Task dependency execution using a DAG model
- Structured logging and progress reporting
- Clear and consistent exit code semantics
What Zetten Is (and Is Not)
Zetten is
- A task runner for Python backend projects
- A local development and CI execution tool
- Deterministic and cache-aware
- CLI-first
Zetten is not
- A framework
- A workflow engine
- A job queue
- A replacement for linters or test frameworks
- A runtime dependency of your application
Quick Start
Install Zetten:
pip install zetten
Initiate a project:
zetten init
Define tasks in pyproject.toml:
[tool.zetten.tasks.test]
cmd = "pytest"
inputs = ["src/", "tests/"]
[tool.zetten.tasks.lint]
cmd = "ruff check src"
inputs = ["src/"]
Define tasks in zetten.toml:
[tasks.test]
cmd = "pytest"
inputs = ["src/", "tests/"]
[tasks.lint]
cmd = "ruff check src"
inputs = ["src/"]
Run tasks:
zetten run test
zetten run lint test
Zetten will only re-run tasks when their inputs change.
Configuration Model
Configuration is explicit by design:
- No templating
- No conditionals
- No implicit behavior
Configuration lives in:
- pyproject.toml (preferred)
- zetten.toml (for legacy or minimal projects)
If no configuration is found, Zetten will explain how to fix it.
Commands
- zetten run — execute tasks deterministically
- zetten watch — re-run tasks on input changes
- zetten graph — inspect the task dependency graph
- zetten doctor — diagnose configuration and environment issues
- All commands produce stable, CI-safe output with well-defined exit codes.
Status
Zetten is in v0.1 and is feature-complete for its initial design. Core semantics - execution, caching, exit codes, configuration - are stable.
Documentation
Full documentation is available at: Github Wiki
Contributing and Feedback
Zetten is intentionally minimal and opinionated. Feedback is welcome, especially around:
- Developer experience
- CI usage
- Installation friction
- Missing but essential workflows.
Please open an issue or discussion on GitHub before proposing large changes.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file zetten-1.0.2.tar.gz.
File metadata
- Download URL: zetten-1.0.2.tar.gz
- Upload date:
- Size: 4.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
00bf47599e7055a7ab682f5396776da2b52456cb586f6841001779748ff617c2
|
|
| MD5 |
9f805b4fb81739e9605036e923afcb60
|
|
| BLAKE2b-256 |
279ff04dec567e91f48205314439277a809df38c3679e523885c69ba03471561
|
File details
Details for the file zetten-1.0.2-py3-none-any.whl.
File metadata
- Download URL: zetten-1.0.2-py3-none-any.whl
- Upload date:
- Size: 4.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3802ab8e6628bed3ab507e5f14096dcd8f01b85e1e4b9457277a50e182c0fb1b
|
|
| MD5 |
5a2101452cba2910694b1a09c6f04d7e
|
|
| BLAKE2b-256 |
afc7afdfb5aeb554a45d78e0c5b9ff808d64f0734e1d0b59ac2d7e154668f442
|