
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.
Warning
This project was previously named prefligit
, but it has been renamed to prek
to avoid typosquatting issues.
Warning
This project is still in early stage of development, some features are still not implemented. It is not production-ready yet, but feel free to try it out and provide feedback.
Current supported languages are python
, node
, go
, docker
, docker-image
, system
, script
and fail
.
- 🚀 A single binary with no dependencies, does not require Python or any other runtime.
- ⚡ About 10x faster than
pre-commit
and uses only a third of disk space. - 🔄 Fully compatible with the original pre-commit configurations and hooks.
- 🐍 Integration with
uv
for managing Python virtual environments and dependencies. - 🛠️ Improved toolchain installations for Python, Node.js, Go, Rust and Ruby, shared between hooks.
- 📦 Built-in implementation of some common hooks.
- 🏗️ (TODO) Built-in support for monorepos.
prek is designed as a drop-in replacement:
- Install prek.
- Replace
pre-commit
withprek
in your commands - Your existing
.pre-commit-config.yaml
works unchanged
$ prek run
trim trailing whitespace.................................................Passed
fix end of files.........................................................Passed
typos....................................................................Passed
cargo fmt................................................................Passed
cargo clippy.............................................................Passed
For configuring .pre-commit-config.yaml
and writing hooks, you can refer to the pre-commit documentation as prek is fully compatible with it.
- It is about 10x faster than
pre-commit
and uses only a third of 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.
- It uses
uv
for 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.
- 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.
- (TODO): Built-in support for workspaces (or monorepos), each sub-project can have its own
.pre-commit-config.yaml
file. prek run
has some 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 --files
anymore.prek run --last-commit
runs hooks for files changed in the last commit.
- prek provides shell completions for
prek run <hook_id>
command, so you can easily find the available hooks.
Standalone installer
prek provides a standalone installer script to download and install the tool:
# On Linux and macOS
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/j178/prek/releases/download/v0.0.23/prek-installer.sh | sh
# On Windows
powershell -ExecutionPolicy ByPass -c "irm https://github.com/j178/prek/releases/download/v0.0.23/prek-installer.ps1 | iex"
PyPI
prek is published as Python binary wheel to PyPI, you can install it using pip
, uv
(recommended), or pipx
:
pip install prek
# or
uv tool install prek
# or
pipx install prek
Homebrew
brew install prek
Cargo
Build from source using Cargo:
cargo install --locked --git https://github.com/j178/prek
GitHub Releases
prek release artifacts can be downloaded directly from the GitHub releases.
If installed via the standalone installer, prek can update itself to the latest version:
$ prek self update
This project is heavily inspired by the original pre-commit tool, and it wouldn't be possible without the hard work of the maintainers and contributors of that project.
And a special thanks to the Astral team for their remarkable projects, particularly uv, from which I've learned a lot on how to write efficient and idiomatic Rust code.