# Difference from pre-commit ## General differences - `prek` supports both `.pre-commit-config.yaml` and `.pre-commit-config.yml` configuration files. - `prek` implements some common hooks from `pre-commit-hooks` in Rust for better performance. - `prek` supports `repo: builtin` for offline, zero-setup hooks. - `prek` uses `~/.cache/prek` as the default cache directory for repos, environments and toolchains. - `prek` decoupled hook environment from their repositories, allowing shared toolchains and environments across hooks. - `prek` supports `language_version` as a semver specifier and automatically installs the required toolchains. ## Workspace mode `prek` supports workspace mode, allowing you to run hooks for multiple projects in a single command. Each subproject can have its own `.pre-commit-config.yaml` file. See [Workspace Mode](./workspace.md) for more information. ## Language support ### Python #### Dependency Management with `uv` `prek` uses `uv` for creating virtual environments and installing dependencies: - First tries to find `uv` in the system PATH - If not found, automatically installs `uv` from the best available source (GitHub releases, PyPI, or mirrors) - Automatically installs the required Python version if it's not already available !!! warning "Environment Variables" Since `prek` calls `uv` under the hood to create Python virtual environments and install dependencies, most `uv` environment variables will affect `prek`'s behavior. For example, setting `UV_RESOLUTION=lowest-direct` in your environment will cause hook dependencies to be resolved to their lowest compatible versions, which may lead to installation failures with old packages on modern Python versions. If you encounter unexpected behavior when installing Python hooks, check whether you have any `UV_*` environment variables set that might be affecting dependency resolution or installation. #### PEP 723 Inline Script Metadata Support For Python hooks **without** `additional_dependencies`, `prek` can read PEP 723 inline metadata from the script specified in the `entry` field. **Example:** `.pre-commit-config.yaml`: ```yaml repos: - repo: local hooks: - id: echo name: echo language: python entry: ./echo.py ``` `echo.py`: ```python # /// script # requires-python = ">=3.13" # dependencies = [ # "pyecho-cli", # ] # /// from pyecho import main main() ``` **Important Notes:** - The first part of the `entry` field must be a path to a local Python script - If `additional_dependencies` is specified in `.pre-commit-config.yaml`, script metadata will be ignored - When both `language_version` (in config) and `requires-python` (in script) are set, `language_version` takes precedence - Only `dependencies` and `requires-python` fields are supported; other metadata like `tool.uv` is ignored ### Ruby `prek` does not currently support installing a new version of Ruby to run Ruby hooks. All versions of Ruby found in the system PATH will be considered based on their version, and common locations used by Ruby version managers (such as `rvm`, `rbenv`, `mise`, `asdf`, and `homebrew`) will be also be checked. `language_version` can be used to specify the required Ruby version, and the hook will fail if a suitable Ruby version is not found. Gems specified in hook gemspec files and `additional_dependencies` will be installed into an isolated gemset for Ruby hooks. This gemset will be shared between hooks that use the same Ruby version and have the same set of dependencies, including across different repositories. ### Rust `prek` supports installing packages from virtual workspaces. See [#1180](https://github.com/j178/prek/pull/1180) ### Docker & Docker Image `prek` auto-detects the available container runtime on the system (Docker, Podman, or [Container](https://github.com/apple/container)) and uses it to run container-based hooks. You can also explicitly specify the container runtime using the [`PREK_CONTAINER_RUNTIME`](configuration.md#environment-variables) environment variable. ## Command line interface ### `prek run` - `prek run [HOOK|PROJECT]...` supports selecting or skipping multiple projects or hooks in workspace mode. See [Running Specific Hooks or Projects](workspace.md#running-specific-hooks-or-projects) for details. - `prek run` can execute hooks in parallel by priority (hooks with the same [`priority`](./configuration.md#priority) may run concurrently), instead of strictly serial execution. - `prek` provides dynamic completions of hook id. - `prek run --last-commit` to run hooks on files changed by the last commit. - `prek run --directory ` to run hooks on a specified directory. ### `prek list` `prek list` command lists all available hooks, their ids, and descriptions. This provides a better overview of the configured hooks. ### `prek auto-update` - `prek auto-update` updates all projects in the workspace to their latest revisions. - `prek auto-update` checks updates for the same repository only once, speeding up the process in workspace mode. - `prek auto-update` supports `--dry-run` option to preview the updates without applying them. - `prek auto-update` supports the `--cooldown-days` option to skip releases newer than the specified number of days (based on the tag creation timestamp for annotated tags, or the tagged commit timestamp for lightweight tags). ### `prek sample-config` - `prek sample-config` command has a `--file` option to write the sample configuration to a specific file. ### `prek cache` - `prek cache clean` to remove all cached data. - `prek cache gc` to remove unused cached repositories, environments and toolchains. - `prek cache dir` to show the cache directory. `prek clean` and `prek gc` are also available but hidden, as `prek cache` is preferred.