# prek

[pre-commit](https://pre-commit.com/) 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 like [CPython](https://github.com/python/cpython), [Apache Airflow](https://github.com/apache/airflow), [FastAPI](https://github.com/fastapi/fastapi), and more projects are picking it up—see [Who is using prek?](#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 languages are not yet supported for full drop‑in parity with `pre-commit`. See [Language Support](https://prek.j178.dev/languages/) for current status.

## Features

- A single binary with no dependencies, does not require Python or any other runtime.
- [Faster](https://prek.j178.dev/benchmark/) than `pre-commit` and 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](https://prek.j178.dev/workspace/)).
- Integration with [`uv`](https://github.com/astral-sh/uv) for managing Python virtual environments and dependencies.
- Improved toolchain installations for Python, Node.js, Bun, Go, Rust and Ruby, shared between hooks.
- [Built-in](https://prek.j178.dev/builtin/) Rust-native implementation of some common hooks.

## Why prek?

### prek is faster

- It is [multiple times faster](https://prek.j178.dev/benchmark/) than `pre-commit` while also using less disk space.
- Hook environments and toolchains are shared across hooks instead of being duplicated per repository, which reduces both install time and cache size.
- Repositories are fetched in parallel, hook environments are prepared in parallel when their dependencies do not overlap, and hooks can run concurrently by [`priority`](https://prek.j178.dev/configuration/#priority).
- It uses [`uv`](https://github.com/astral-sh/uv) for creating Python virtualenvs and installing dependencies, which is known for its speed and efficiency.
- It implements some common hooks in Rust as [builtins](https://prek.j178.dev/builtin/), which are faster than their Python counterparts.
- It supports `repo: builtin` for offline, zero-setup hooks, which is not available in `pre-commit`.

### prek is easier to work with

- No need to install Python or any other runtime just to use `prek`; it is a single binary.
- `prek` automatically installs the toolchains it needs for supported languages, so you spend less time managing Python versions, Node runtimes, Ruby installs, and similar setup.
- It supports native [`prek.toml`](https://prek.j178.dev/configuration/) in addition to pre-commit YAML, and [`prek util yaml-to-toml`](https://prek.j178.dev/cli/#prek-util-yaml-to-toml) helps migrate existing configs.
- Built-in support for [workspaces](https://prek.j178.dev/workspace/) means monorepos can keep separate configs per project and still run everything from one command.
- [`prek install`](https://prek.j178.dev/cli/#prek-install) and [`prek uninstall`](https://prek.j178.dev/cli/#prek-uninstall) honor repo-local and worktree-local `core.hooksPath`.
- [`prek run`](https://prek.j178.dev/cli/#prek-run) supports selecting or skipping multiple projects or hooks in workspace mode, instead of only accepting a single optional hook id, and adds quality-of-life improvements such as `--dry-run`, `--directory`, `--last-commit`, and `--no-fail-fast`.
- [`prek list`](https://prek.j178.dev/cli/#prek-list), [`prek util identify`](https://prek.j178.dev/cli/#prek-util-identify), and [`prek util list-builtins`](https://prek.j178.dev/cli/#prek-util-list-builtins) make it easier to inspect configured hooks, debug file matching, and discover builtins.

### prek includes security-focused safeguards

- [`prek auto-update`](https://prek.j178.dev/cli/#prek-auto-update) supports `--cooldown-days`, so you can keep newly published releases on hold for a cooling-off period before adopting them.
- [`prek auto-update`](https://prek.j178.dev/cli/#prek-auto-update) validates pinned SHA revisions against the fetched upstream refs, including impostor-commit detection, and keeps `# frozen:` comments in sync with the configured commit.
- [`prek auto-update --check`](https://prek.j178.dev/cli/#prek-auto-update--check) is useful in CI when you want updates or frozen-reference mismatches to fail the job without rewriting the config.

For more detailed improvements prek offers, take a look at [Difference from pre-commit](https://prek.j178.dev/diff/).

## Who is using prek?

prek is pretty new, but it is already being used or recommended by some projects and organizations. GitHub stars are current as of April 15, 2026.

- [apache/airflow](https://github.com/apache/airflow/issues/44995) 45,050 stars
- [python/cpython](https://github.com/python/cpython/issues/143148) 72,330 stars
- [pdm-project/pdm](https://github.com/pdm-project/pdm/pull/3593) 8,553 stars
- [fastapi/fastapi](https://github.com/fastapi/fastapi/pull/14572) 97,209 stars
- [fastapi/typer](https://github.com/fastapi/typer/pull/1453) 19,210 stars
- [fastapi/asyncer](https://github.com/fastapi/asyncer/pull/437) 2,407 stars
- [astral-sh/ruff](https://github.com/astral-sh/ruff/pull/22505) 47,070 stars
- [astral-sh/ty](https://github.com/astral-sh/ty/pull/2469) 18,308 stars
- [openclaw/openclaw](https://github.com/openclaw/openclaw/pull/1720) 357,512 stars
- [home-assistant/core](https://github.com/home-assistant/core/pull/160427) 86,029 stars
- [python-telegram-bot/python-telegram-bot](https://github.com/python-telegram-bot/python-telegram-bot/pull/5142) 29,025 stars
- [DetachHead/basedpyright](https://github.com/DetachHead/basedpyright/pull/1413) 3,267 stars
- [OpenLineage/OpenLineage](https://github.com/OpenLineage/OpenLineage/pull/3965) 2,406 stars
- [authlib/authlib](https://github.com/authlib/authlib/pull/804) 5,271 stars
- [django/djangoproject.com](https://github.com/django/djangoproject.com/pull/2252) 1,994 stars
- [Future-House/paper-qa](https://github.com/Future-House/paper-qa/pull/1098) 8,377 stars
- [Goldziher/kreuzberg](https://github.com/Goldziher/kreuzberg/pull/142) 7,550 stars
- [python-attrs/attrs](https://github.com/python-attrs/attrs/commit/c95b177682e76a63478d29d040f9cb36a8d31915) 5,770 stars
- [jlowin/fastmcp](https://github.com/jlowin/fastmcp/pull/2309) 24,539 stars
- [apache/iggy](https://github.com/apache/iggy/pull/2383) 4,116 stars
- [apache/lucene](https://github.com/apache/lucene/pull/15629) 3,401 stars
- [jcrist/msgspec](https://github.com/jcrist/msgspec/pull/918) 3,692 stars
- [MoonshotAI/kimi-cli](https://github.com/MoonshotAI/kimi-cli/pull/535) 7,800 stars
- [simple-icons/simple-icons](https://github.com/simple-icons/simple-icons/pull/14245) 24,873 stars
- [ast-grep/ast-grep](https://github.com/ast-grep/ast-grep.github.io/commit/e30818144b2967a7f9172c8cf2f4596bba219bf5) 13,413 stars
- [commitizen-tools/commitizen](https://github.com/commitizen-tools/commitizen) 3,377 stars
- [cocoindex-io/cocoindex](https://github.com/cocoindex-io/cocoindex/pull/1564) 6,865 stars
- [cachix/devenv](https://github.com/cachix/devenv/pull/2304) 6,665 stars
- [pyodide/pyodide](https://github.com/pyodide/pyodide/pull/6182) 14,527 stars
- [prowler-cloud/prowler](https://github.com/prowler-cloud/prowler/pull/10601) 13,592 stars

## Badges

Show that your project uses prek with a badge in your README:

```markdown
[![prek](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/j178/prek/master/docs/assets/badge-v0.json)](https://github.com/j178/prek)
```

```html
<a href="https://github.com/j178/prek">
  <img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/j178/prek/master/docs/assets/badge-v0.json" alt="prek">
</a>
```

```rst
.. image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/j178/prek/master/docs/assets/badge-v0.json
   :target: https://github.com/j178/prek
   :alt: prek
```
