Skip to content

j178/prek

Repository files navigation

prek

Development Status CI GitHub downloads Discord

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.

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.

Features

  • 🚀 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.

How to migrate

prek is designed as a drop-in replacement:

  • Install prek.
  • Replace pre-commit with prek 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.

Why prek?

prek is way faster

  • 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.

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.
  • (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 over pre-commit run, such as:
    • prek run --directory <dir> runs hooks for files in the specified directory, no need to use git 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.

Installation

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

Acknowledgements

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.

About

⚡ Better `pre-commit`, re-engineered in Rust

Topics

Resources

License

Stars

Watchers

Forks

Sponsor this project

 

Contributors 18

Languages