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
It is not production-ready yet, some subcommands and languages are still not implemented, but feel free to try it out and provide feedback.
Current supported languages are python
, node
, go
, docker
, docker-image
, pygrep
, 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 subproject 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 list
command lists all available hooks, their ids, and descriptions, providing a better overview of the configured hooks.- prek provides shell completions for
prek run <hook_id>
command, making it easier to run specific hooks without remembering their ids.
prek is pretty new, but it is already being used or recommend by some projects and organizations:
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.1.2/prek-installer.sh | sh
# On Windows
powershell -ExecutionPolicy ByPass -c "irm https://github.com/j178/prek/releases/download/v0.1.2/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
mise
mise use 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.