- Fast, reliable and reproducible lint setup
- Black / flake8 / ruff called directly or within pre-commit
- Not enforced on development machines
- Duplicate setup on CI
- Not all tools are wrapped
- The config options / versions don't match Then;
- Developers push code without applying linter fixes
- CI fails unexpectedly
- The project doesn't have a code standard
- Mental cost of doing things increase significantly
- New contributors are afraid to touch the code
- https://github.com/ulgens/django-blasphemy/blob/59225046c8eb0b3b260b4a3ec2180ce93e6c9ebc/.pre-commit-config.yaml
- Built in hooks https://prek.j178.dev/builtin/
- Ruff https://docs.astral.sh/ruff/
- zizmor https://docs.zizmor.sh/
- uv lock check https://github.com/astral-sh/uv-pre-commit
- pyproject-fmt https://pyproject-fmt.readthedocs.io/en/latest/
- ty? https://docs.astral.sh/ty/
- django-upgrade https://github.com/adamchainz/django-upgrade
- Not tests.
- https://github.com/django/django/blob/378481165d14fea4c2a4b7717af3d7bdf9150f08/tox.ini
- https://github.com/django/django/blob/378481165d14fea4c2a4b7717af3d7bdf9150f08/.github/workflows/linters.yml
- https://github.com/django/django/blob/378481165d14fea4c2a4b7717af3d7bdf9150f08/.pre-commit-config.yaml
- https://github.com/django/django/blob/378481165d14fea4c2a4b7717af3d7bdf9150f08/docs/Makefile#L184
- https://github.com/langchain-ai/langchain/blob/6fb37dba71da807af60aa7b909f71f0625a666bf/.pre-commit-config.yaml
- https://github.com/langchain-ai/langchain/blob/6fb37dba71da807af60aa7b909f71f0625a666bf/.github/workflows/_lint.yml
- https://github.com/langchain-ai/langchain/blob/6fb37dba71da807af60aa7b909f71f0625a666bf/libs/Makefile
- https://github.com/langchain-ai/langchain/blob/6fb37dba71da807af60aa7b909f71f0625a666bf/libs/core/Makefile
- https://github.com/langchain-ai/langchain/blob/6fb37dba71da807af60aa7b909f71f0625a666bf/libs/langchain_v1/Makefile
- ...
- https://github.com/django/djangoproject.com/blob/ab5429a66410966cebbce2616e216abf02f50b32/.pre-commit-config.yaml
- https://github.com/django/djangoproject.com/blob/ab5429a66410966cebbce2616e216abf02f50b32/.github/workflows/prek.yml
- https://github.com/python/cpython/blob/2a07ff980b412559f6cedafd432118684faa8d09/.pre-commit-config.yaml
- https://github.com/python/cpython/blob/2a07ff980b412559f6cedafd432118684faa8d09/.github/workflows/lint.yml
- Gitlab
- depot https://depot.dev/
- https://github.com/j178/prek?tab=readme-ov-file#features
- j178/prek#73
- https://x.com/akx/status/1820774517771260401 :')
That also teaches people a bit of a team work and how important it is that even if it is a bit "less efficient" for them to fulfill all the expectation of the project/community they are contriibuting to, this makes the whole community better. That's another "educational aspect" of it - you should go extra mile as individual contributor to adhere to the community expectations, and I think failing check that makes you rebase and fix your PR has a good educational role here, much better than fire-and-forget and let someone else (be it CI or maintainer) to fix things for you.
- Renovate for the win: https://docs.renovatebot.com/modules/manager/pre-commit/
- Has support since 2021: renovatebot/renovate#11166
- Dependabot support (March 2026): https://github.blog/changelog/2026-03-10-dependabot-now-supports-pre-commit-hooks/
- https://github.com/ulgens/django-blasphemy/blob/main/pyproject.toml#L62C1-L63C1
- https://github.com/ulgens/renovate-presets/blob/main/python.json5
...