prek¶
pre-commit is a framework to run hooks written in many languages, and it manages the language toolchain and dependencies for running the hooks.
prek is a reimagined version of pre-commit, built in Rust. It is designed to be a faster, dependency-free and drop-in alternative for it, while also providing some additional long-requested features.
Note
Although prek is pretty new, it's already powering real‑world projects—see Who is using prek?. If you're looking for an alternative to pre-commit, please give it a try—we'd love your feedback!
Please note that some subcommands and languages are still missing for full drop‑in parity with pre-commit. Track the remaining gaps here: TODO.
Features¶
- 🚀 A single binary with no dependencies, does not require Python or any other runtime.
- ⚡ Faster than
pre-commitand more efficient in disk space usage. - 🔄 Fully compatible with the original pre-commit configurations and hooks.
- 🏗️ Built-in support for monorepos (i.e. workspace mode).
- 🐍 Integration with
uvfor managing Python virtual environments and dependencies. - 🛠️ Improved toolchain installations for Python, Node.js, Bun, Go, Rust and Ruby, shared between hooks.
- 📦 Built-in Rust-native implementation of some common hooks.
Why prek?¶
prek is faster¶
- It is multiple times faster than
pre-commitand takes up half the disk space. - It redesigned how hook environments and toolchains are managed, they are all shared between hooks, which reduces the disk space usage and speeds up the installation process.
- Repositories are cloned in parallel, and hooks are installed in parallel if their dependencies are disjoint.
- Hooks can run in parallel by priority (hooks with the same
prioritymay run concurrently), reducing end-to-end runtime. - It uses
uvfor creating Python virtualenvs and installing dependencies, which is known for its speed and efficiency. - It implements some common hooks in Rust, built in prek, which are faster than their Python counterparts.
- It supports
repo: builtinfor offline, zero-setup hooks, which is not available inpre-commit.
prek provides a better user experience¶
- No need to install Python or any other runtime, just download a single binary.
- No hassle with your Python version or virtual environments, prek automatically installs the required Python version and creates a virtual environment for you.
- Built-in support for workspaces (or monorepos), each subproject can have its own
.pre-commit-config.yamlfile. prek runhas some nifty improvements overpre-commit run, such as:prek run --directory <dir>runs hooks for files in the specified directory, no need to usegit ls-files -- <dir> | xargs pre-commit run --filesanymore.prek run --last-commitruns hooks for files changed in the last commit.prek run [HOOK] [HOOK]selects and runs multiple hooks.
prek listcommand lists all available hooks, their ids, and descriptions, providing a better overview of the configured hooks.prek auto-updatesupports--cooldown-daysto mitigate open source supply chain attacks.- prek provides shell completions for
prek run <hook_id>command, making it easier to run specific hooks without remembering their ids.
For more detailed improvements prek offers, take a look at Difference from pre-commit.
Who is using prek?¶
prek is pretty new, but it is already being used or recommend by some projects and organizations:
- apache/airflow
- python/cpython
- pdm-project/pdm
- fastapi/fastapi
- fastapi/typer
- fastapi/asyncer
- astral-sh/ruff
- astral-sh/ty
- home-assistant/core
- DetachHead/basedpyright
- OpenLineage/OpenLineage
- authlib/authlib
- django/djangoproject.com
- Future-House/paper-qa
- requests-cache/requests-cache
- Goldziher/kreuzberg
- python-attrs/attrs
- jlowin/fastmcp
- apache/iceberg-python
- jcrist/msgspec
- python-humanize/humanize
- MoonshotAI/kimi-cli
- simple-icons/simple-icons
- ast-grep/ast-grep
- commitizen-tools/commitizen
Badges¶
Show that your project uses prek with a badge in your README: