astral-sh/ruffPublic

An extremely fast Python linter and code formatter, written in Rust.

Stars
50.5K
Forks
2.6K
Watchers
145
Open issues
1.7K
Open PRs
531
Contributors
~1K
Commits
18K
Branches
1.6K

RustMITCreated Aug 9, 2022Last push todayLatest release 0.17.4

Quick answers

What is ruff?
An extremely fast Python linter and code formatter, written in Rust.
How popular is ruff on GitHub?
astral-sh/ruff has 50,502 stars and 2,597 forks on GitHub.
What license does ruff use?
astral-sh/ruff is released under the MIT license.

Star history

since Nov 6, 2026

Star history is still being collected for this repository.

Contribution activity

commits per day, last 52 weeks
NovDecJanFebMarAprMayJunJulAugSepOctNovMonWedFri2025-11-09: 0 commits2025-11-10: 36 commits2025-11-11: 16 commits2025-11-12: 16 commits2025-11-13: 19 commits2025-11-14: 20 commits2025-11-15: 5 commits2025-11-16: 8 commits2025-11-17: 19 commits2025-11-18: 16 commits2025-11-19: 17 commits2025-11-20: 13 commits2025-11-21: 20 commits2025-11-22: 8 commits2025-11-23: 2 commits2025-11-24: 25 commits2025-11-25: 16 commits2025-11-26: 10 commits2025-11-27: 16 commits2025-11-28: 12 commits2025-11-29: 4 commits2025-11-30: 2 commits2025-12-01: 31 commits2025-12-02: 13 commits2025-12-03: 25 commits2025-12-04: 17 commits2025-12-05: 16 commits2025-12-06: 2 commits2025-12-07: 4 commits2025-12-08: 19 commits2025-12-09: 16 commits2025-12-10: 22 commits2025-12-11: 27 commits2025-12-12: 19 commits2025-12-13: 10 commits2025-12-14: 1 commit2025-12-15: 20 commits2025-12-16: 18 commits2025-12-17: 22 commits2025-12-18: 15 commits2025-12-19: 23 commits2025-12-20: 6 commits2025-12-21: 4 commits2025-12-22: 16 commits2025-12-23: 22 commits2025-12-24: 12 commits2025-12-25: 4 commits2025-12-26: 4 commits2025-12-27: 11 commits2025-12-28: 2 commits2025-12-29: 49 commits2025-12-30: 25 commits2025-12-31: 6 commits2026-01-01: 5 commits2026-01-02: 5 commits2026-01-03: 4 commits2026-01-04: 5 commits2026-01-05: 30 commits2026-01-06: 18 commits2026-01-07: 25 commits2026-01-08: 16 commits2026-01-09: 13 commits2026-01-10: 6 commits2026-01-11: 2 commits2026-01-12: 27 commits2026-01-13: 23 commits2026-01-14: 23 commits2026-01-15: 26 commits2026-01-16: 25 commits2026-01-17: 10 commits2026-01-18: 20 commits2026-01-19: 35 commits2026-01-20: 22 commits2026-01-21: 22 commits2026-01-22: 10 commits2026-01-23: 25 commits2026-01-24: 6 commits2026-01-25: 18 commits2026-01-26: 17 commits2026-01-27: 26 commits2026-01-28: 14 commits2026-01-29: 30 commits2026-01-30: 32 commits2026-01-31: 4 commits2026-02-01: 5 commits2026-02-02: 19 commits2026-02-03: 25 commits2026-02-04: 21 commits2026-02-05: 30 commits2026-02-06: 13 commits2026-02-07: 2 commits2026-02-08: 14 commits2026-02-09: 33 commits2026-02-10: 26 commits2026-02-11: 25 commits2026-02-12: 25 commits2026-02-13: 11 commits2026-02-14: 3 commits2026-02-15: 7 commits2026-02-16: 45 commits2026-02-17: 12 commits2026-02-18: 14 commits2026-02-19: 14 commits2026-02-20: 17 commits2026-02-21: 0 commits2026-02-22: 12 commits2026-02-23: 34 commits2026-02-24: 16 commits2026-02-25: 24 commits2026-02-26: 23 commits2026-02-27: 21 commits2026-02-28: 10 commits2026-03-01: 6 commits2026-03-02: 39 commits2026-03-03: 21 commits2026-03-04: 15 commits2026-03-05: 24 commits2026-03-06: 17 commits2026-03-07: 5 commits2026-03-08: 16 commits2026-03-09: 25 commits2026-03-10: 14 commits2026-03-11: 15 commits2026-03-12: 19 commits2026-03-13: 28 commits2026-03-14: 2 commits2026-03-15: 4 commits2026-03-16: 37 commits2026-03-17: 15 commits2026-03-18: 5 commits2026-03-19: 5 commits2026-03-20: 21 commits2026-03-21: 3 commits2026-03-22: 6 commits2026-03-23: 25 commits2026-03-24: 11 commits2026-03-25: 21 commits2026-03-26: 29 commits2026-03-27: 17 commits2026-03-28: 3 commits2026-03-29: 14 commits2026-03-30: 22 commits2026-03-31: 9 commits2026-04-01: 12 commits2026-04-02: 29 commits2026-04-03: 9 commits2026-04-04: 6 commits2026-04-05: 9 commits2026-04-06: 8 commits2026-04-07: 8 commits2026-04-08: 29 commits2026-04-09: 19 commits2026-04-10: 18 commits2026-04-11: 5 commits2026-04-12: 7 commits2026-04-13: 27 commits2026-04-14: 28 commits2026-04-15: 17 commits2026-04-16: 7 commits2026-04-17: 17 commits2026-04-18: 2 commits2026-04-19: 15 commits2026-04-20: 17 commits2026-04-21: 16 commits2026-04-22: 9 commits2026-04-23: 12 commits2026-04-24: 7 commits2026-04-25: 15 commits2026-04-26: 16 commits2026-04-27: 18 commits2026-04-28: 12 commits2026-04-29: 14 commits2026-04-30: 10 commits2026-05-01: 5 commits2026-05-02: 2 commits2026-05-03: 2 commits2026-05-04: 3 commits2026-05-05: 2 commits2026-05-06: 19 commits2026-05-07: 12 commits2026-05-08: 7 commits2026-05-09: 8 commits2026-05-10: 3 commits2026-05-11: 12 commits2026-05-12: 9 commits2026-05-13: 15 commits2026-05-14: 16 commits2026-05-15: 26 commits2026-05-16: 2 commits2026-05-17: 3 commits2026-05-18: 9 commits2026-05-19: 11 commits2026-05-20: 35 commits2026-05-21: 21 commits2026-05-22: 13 commits2026-05-23: 4 commits2026-05-24: 4 commits2026-05-25: 1 commit2026-05-26: 12 commits2026-05-27: 22 commits2026-05-28: 12 commits2026-05-29: 17 commits2026-05-30: 8 commits2026-05-31: 0 commits2026-06-01: 25 commits2026-06-02: 29 commits2026-06-03: 25 commits2026-06-04: 24 commits2026-06-05: 32 commits2026-06-06: 9 commits2026-06-07: 2 commits2026-06-08: 16 commits2026-06-09: 22 commits2026-06-10: 30 commits2026-06-11: 26 commits2026-06-12: 6 commits2026-06-13: 6 commits2026-06-14: 7 commits2026-06-15: 32 commits2026-06-16: 40 commits2026-06-17: 36 commits2026-06-18: 24 commits2026-06-19: 10 commits2026-06-20: 5 commits2026-06-21: 7 commits2026-06-22: 43 commits2026-06-23: 43 commits2026-06-24: 42 commits2026-06-25: 28 commits2026-06-26: 23 commits2026-06-27: 5 commits2026-06-28: 5 commits2026-06-29: 4 commits2026-06-30: 22 commits2026-07-01: 11 commits2026-07-02: 4 commits2026-07-03: 3 commits2026-07-04: 3 commits2026-07-05: 2 commits2026-07-06: 20 commits2026-07-07: 42 commits2026-07-08: 29 commits2026-07-09: 17 commits2026-07-10: 22 commits2026-07-11: 0 commits2026-07-12: 7 commits2026-07-13: 15 commits2026-07-14: 41 commits2026-07-15: 20 commits2026-07-16: 22 commits2026-07-17: 20 commits2026-07-18: 2 commits2026-07-19: 11 commits2026-07-20: 23 commits2026-07-21: 31 commits2026-07-22: 44 commits2026-07-23: 21 commits2026-07-24: 19 commits2026-07-25: 19 commits2026-07-26: 7 commits2026-07-27: 12 commits2026-07-28: 20 commits2026-07-29: 54 commits2026-07-30: 20 commits2026-07-31: 44 commits2026-08-01: 10 commits2026-08-02: 4 commits2026-08-03: 13 commits2026-08-04: 25 commits2026-08-05: 36 commits2026-08-06: 12 commits2026-08-07: 15 commits2026-08-08: 4 commits2026-08-09: 8 commits2026-08-10: 17 commits2026-08-11: 23 commits2026-08-12: 32 commits2026-08-13: 11 commits2026-08-14: 24 commits2026-08-15: 17 commits2026-08-16: 4 commits2026-08-17: 12 commits2026-08-18: 30 commits2026-08-19: 31 commits2026-08-20: 24 commits2026-08-21: 12 commits2026-08-22: 4 commits2026-08-23: 3 commits2026-08-24: 13 commits2026-08-25: 24 commits2026-08-26: 19 commits2026-08-27: 9 commits2026-08-28: 33 commits2026-08-29: 14 commits2026-08-30: 0 commits2026-08-31: 16 commits2026-09-01: 9 commits2026-09-02: 20 commits2026-09-03: 28 commits2026-09-04: 12 commits2026-09-05: 6 commits2026-09-06: 14 commits2026-09-07: 18 commits2026-09-08: 12 commits2026-09-09: 34 commits2026-09-10: 14 commits2026-09-11: 26 commits2026-09-12: 2 commits2026-09-13: 0 commits2026-09-14: 13 commits2026-09-15: 30 commits2026-09-16: 29 commits2026-09-17: 33 commits2026-09-18: 24 commits2026-09-19: 3 commits2026-09-20: 1 commit2026-09-21: 11 commits2026-09-22: 17 commits2026-09-23: 33 commits2026-09-24: 27 commits2026-09-25: 17 commits2026-09-26: 10 commits2026-09-27: 6 commits2026-09-28: 14 commits2026-09-29: 7 commits2026-09-30: 6 commits2026-10-01: 25 commits2026-10-02: 10 commits2026-10-03: 4 commits2026-10-04: 0 commits2026-10-05: 12 commits2026-10-06: 21 commits2026-10-07: 16 commits2026-10-08: 15 commits2026-10-09: 6 commits2026-10-10: 1 commit2026-10-11: 1 commit2026-10-12: 5 commits2026-10-13: 21 commits2026-10-14: 26 commits2026-10-15: 23 commits2026-10-16: 11 commits2026-10-17: 2 commits2026-10-18: 4 commits2026-10-19: 23 commits2026-10-20: 33 commits2026-10-21: 30 commits2026-10-22: 30 commits2026-10-23: 16 commits2026-10-24: 6 commits2026-10-25: 5 commits2026-10-26: 23 commits2026-10-27: 16 commits2026-10-28: 24 commits2026-10-29: 11 commits2026-10-30: 11 commits2026-10-31: 4 commits2026-11-01: 12 commits2026-11-02: 28 commits2026-11-03: 34 commits2026-11-04: 42 commits2026-11-05: 32 commits2026-11-06: 7 commits2026-11-07: 0 commits
5,850 commits in the last yearLessMore

Signals and awards

derived from tracked data
  • Landmark project

    50,502 stars

  • Very active

    5,850 commits in 52 weeks

  • Community-driven

    ~1,009 contributors

  • Well documented

    High community health score

  • Permissive license

    MIT

  • Continuous integration

    Automated checks passing

README

main branch

Ruff

Ruff image image image Actions status Discord

Docs | Playground

An extremely fast Python linter and code formatter, written in Rust.

Shows a bar chart with benchmark results.

Linting the CPython codebase from scratch.

  • ⚡️ 10-100x faster than existing linters (like Flake8) and formatters (like Black)
  • 🐍 Installable via pip
  • 🛠️ pyproject.toml support
  • 🤝 Python 3.15 compatibility
  • ⚖️ Drop-in parity with Flake8, isort, and Black
  • 📦 Built-in caching, to avoid re-analyzing unchanged files
  • 🔧 Fix support, for automatic error correction (e.g., automatically remove unused imports)
  • 📏 Over 900 built-in rules, with native re-implementations of popular Flake8 plugins, like flake8-bugbear
  • ⌨️ First-party editor integrations for VS Code and more
  • 🌎 Monorepo-friendly, with hierarchical and cascading configuration

Ruff aims to be orders of magnitude faster than alternative tools while integrating more functionality behind a single, common interface.

Ruff can be used to replace Flake8 (plus dozens of plugins), Black, isort, pydocstyle, pyupgrade, autoflake, and more, all while executing tens or hundreds of times faster than any individual tool.

Ruff is actively developed and used in major open-source projects like:

Ruff is backed by Astral, the creators of uv and ty.

Read the launch post, or the original project announcement.

Testimonials

Sebastián Ramírez, creator of FastAPI:

Ruff is so fast that sometimes I add an intentional bug in the code just to confirm it's actually running and checking the code.

Nick Schrock, founder of Elementl, co-creator of GraphQL:

Why is Ruff a gamechanger? Primarily because it is nearly 1000x faster. Literally. Not a typo. On our largest module (dagster itself, 250k LOC) pylint takes about 2.5 minutes, parallelized across 4 cores on my M1. Running ruff against our entire codebase takes .4 seconds.

Bryan Van de Ven, co-creator of Bokeh, original author of Conda:

Ruff is ~150-200x faster than flake8 on my machine, scanning the whole repo takes ~0.2s instead of ~20s. This is an enormous quality of life improvement for local dev. It's fast enough that I added it as an actual commit hook, which is terrific.

Timothy Crosley, creator of isort:

Just switched my first project to Ruff. Only one downside so far: it's so fast I couldn't believe it was working till I intentionally introduced some errors.

Tim Abbott, lead developer of Zulip (also here):

This is just ridiculously fast... ruff is amazing.

Table of Contents

For more, see the documentation.

  1. Getting Started
  2. Configuration
  3. Rules
  4. Contributing
  5. Support
  6. Acknowledgements
  7. Show Your Support
  8. License

Getting Started

For more, see the documentation.

Installation

Ruff is available as ruff on PyPI.

Invoke Ruff directly with uvx:

uvx [email protected] check   # Lint all files in the current directory.
uvx [email protected] format  # Format all files in the current directory.

Or install Ruff with uv (recommended), pip, or pipx:

# With uv.
uv tool install ruff@latest  # Install Ruff globally.
uv add --dev ruff            # Or add Ruff to your project.

# With pip.
pip install ruff

# With pipx.
pipx install ruff

Starting with version 0.5.0, Ruff can be installed with our standalone installers:

# On macOS and Linux.
curl -LsSf https://astral.sh/ruff/install.sh | sh

# On Windows.
powershell -c "irm https://astral.sh/ruff/install.ps1 | iex"

# For a specific version.
curl -LsSf https://astral.sh/ruff/0.17.4/install.sh | sh
powershell -c "irm https://astral.sh/ruff/0.17.4/install.ps1 | iex"

You can also install Ruff via Homebrew, Conda, and with a variety of other package managers.

Usage

To run Ruff as a linter, try any of the following:

ruff check                          # Lint all files in the current directory (and any subdirectories).
ruff check path/to/code/            # Lint all files in `/path/to/code` (and any subdirectories).
ruff check path/to/code/*.py        # Lint all `.py` files in `/path/to/code`.
ruff check path/to/code/to/file.py  # Lint `file.py`.
ruff check @arguments.txt           # Lint using an input file, treating its contents as newline-delimited command-line arguments.

Or, to run Ruff as a formatter:

ruff format                          # Format all files in the current directory (and any subdirectories).
ruff format path/to/code/            # Format all files in `/path/to/code` (and any subdirectories).
ruff format path/to/code/*.py        # Format all `.py` files in `/path/to/code`.
ruff format path/to/code/to/file.py  # Format `file.py`.
ruff format @arguments.txt           # Format using an input file, treating its contents as newline-delimited command-line arguments.

Ruff can also be used as a pre-commit hook via ruff-pre-commit:

- repo: https://github.com/astral-sh/ruff-pre-commit
  # Ruff version.
  rev: v0.17.4
  hooks:
    # Run the linter.
    - id: ruff-check
      args: [ --fix ]
    # Run the formatter.
    - id: ruff-format

Ruff can also be used as a VS Code extension or with various other editors.

Ruff can also be used as a GitHub Action via ruff-action:

name: Ruff
on: [ push, pull_request ]
jobs:
  ruff:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: astral-sh/ruff-action@v3

Configuration

Ruff can be configured through a pyproject.toml, ruff.toml, or .ruff.toml file (see: Configuration, or Settings for a complete list of all configuration options).

For the complete list of enabled rules, see Default Rules.

If left unspecified, Ruff's default configuration is equivalent to the following ruff.toml file:

# Exclude a variety of commonly ignored directories.
exclude = [
    ".bzr",
    ".direnv",
    ".eggs",
    ".git",
    ".git-rewrite",
    ".hg",
    ".ipynb_checkpoints",
    ".mypy_cache",
    ".nox",
    ".pants.d",
    ".pyenv",
    ".pytest_cache",
    ".pytype",
    ".ruff_cache",
    ".svn",
    ".tox",
    ".venv",
    ".vscode",
    "__pypackages__",
    "_build",
    "buck-out",
    "build",
    "dist",
    "node_modules",
    "site-packages",
    "venv",
]

# Same as Black.
line-length = 88
indent-width = 4

# Assume Python 3.11
target-version = "py311"

[lint]
# select = [...]  # See the Default Rules page for the full listing.
ignore = []

# Allow fix for all enabled rules (when `--fix`) is provided.
fixable = ["ALL"]
unfixable = []

# Allow unused variables when underscore-prefixed.
dummy-variable-rgx = "^(_+|(_+[\\p{XID_Continue}]*[\\p{XID_Continue}--_]+?))$"

[format]
# Like Black, use double quotes for strings.
quote-style = "double"

# Like Black, indent with spaces, rather than tabs.
indent-style = "space"

# Like Black, respect magic trailing commas.
skip-magic-trailing-comma = false

# Like Black, automatically detect the appropriate line ending.
line-ending = "auto"

Note that, in a pyproject.toml, each section header should be prefixed with tool.ruff. For example, [lint] should be replaced with [tool.ruff.lint].

Some configuration options can be provided via dedicated command-line arguments, such as those related to rule enablement and disablement, file discovery, and logging level:

ruff check --select F401 --select F403 --quiet

The remaining configuration options can be provided through a catch-all --config argument:

ruff check --config "lint.per-file-ignores = {'some_file.py' = ['F841']}"

To opt in to the latest lint rules, formatter style changes, interface updates, and more, enable preview mode by setting preview = true in your configuration file or passing --preview on the command line. Preview mode enables a collection of unstable features that may change prior to stabilization.

See ruff help for more on Ruff's top-level commands, or ruff help check and ruff help format for more on the linting and formatting commands, respectively.

Rules

Ruff supports over 900 lint rules, many of which are inspired by popular tools like Flake8, isort, pyupgrade, and others. Regardless of the rule's origin, Ruff re-implements every rule in Rust as a first-party feature.

By default, Ruff enables rules from the F, E, B, UP, and RUF categories, as well as many more, omitting any stylistic rules that overlap with the use of a formatter, like ruff format or Black.

If you're just getting started with Ruff, the default rule set is a great place to start: it catches a wide variety of common errors (like unused imports) with zero configuration. See Default Rules for the complete list.

Beyond the defaults, Ruff re-implements some of the most popular Flake8 plugins and related code quality tools, including:

For the complete list of supported rules, see Rules.

Contributing

Contributions are welcome and highly appreciated. To get started, check out the contributing guidelines.

You can also join us on Discord.

Support

Having trouble? Check out the existing issues on GitHub, or feel free to open a new one.

You can also ask for help on Discord.

Acknowledgements

Ruff's linter draws on both the APIs and implementation details of many other tools in the Python ecosystem, especially Flake8, Pyflakes, pycodestyle, pydocstyle, pyupgrade, and isort.

In some cases, Ruff includes a "direct" Rust port of the corresponding tool. We're grateful to the maintainers of these tools for their work, and for all the value they've provided to the Python community.

Ruff's formatter is built on a fork of Rome's rome_formatter, and again draws on both API and implementation details from Rome, Prettier, and Black.

Ruff's import resolver is based on the import resolution algorithm from Pyright.

Ruff is also influenced by a number of tools outside the Python ecosystem, like Clippy and ESLint.

Ruff is the beneficiary of a large number of contributors.

Ruff is released under the MIT license.

Show Your Support

If you're using Ruff, consider adding the Ruff badge to your project's README.md:

[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)

...or README.rst:

.. image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json
    :target: https://github.com/astral-sh/ruff
    :alt: Ruff

...or, as HTML:

<a href="https://github.com/astral-sh/ruff"><img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json" alt="Ruff" style="max-width:100%;"></a>

License

This repository is licensed under the MIT License

View on GitHub

Recent activity

commits and pull requests

Releases and announcements

435 total
  1. 0.17.40.17.4Nov 5, 202623.9K downloads

    ## Release Notes Released on 2026-11-05. ### Preview features - \[`flake8-logging-format`\] Avoid behavior changes and syntax errors in fixes (`G004`) ([#27419](https://github.com/astral-sh/ruff/pull/27419)) - \[`security`\] Implement `tarfile-ignore-zeros-true` ([#28680](https://github.com/astral-sh/ruff/pull/28680)) ### Bug fixes - Accept a bare raise before a semicolon ([#29761](https://github.com/astral-sh/ruff/pull/29761)) - Allow match identifiers after a semicolon ([#29760](https://github.com/astral-sh/ruff/pull/29760)) - Fix panic on BOM-prefixed files in diagnostic renderer ([#30017](https://github.com/astral-sh/ruff/pull/30017)) - \[`flake8-simplify`\] Report collapsible `elif` clauses after a multi-statement `if` branch (`SIM102`) ([#29814](https://github.com/astral-sh/ruff/pull/29814)) ### Rule changes - Show more nonprinting characters in diagnostic fix diffs ([#30062](https://github.com/astral-sh/ruff/pull/30062)) ### Performance - Coalesce source slices when formatting attributes ([#29841](https://github.com/astral-sh/ruff/pull/29841)) - Collect return statements with a statement-only visitor ([#29911](https://github.com/astral-sh/ruff/pull/29911)) - \[`pyfl

  2. 0.17.30.17.3Oct 27, 2026381.8K downloads

    ## Release Notes Released on 2026-10-26. ### Preview features - \[`suspicious`\] Add `shared-clock-mock` ([#29074](https://github.com/astral-sh/ruff/pull/29074)) ### Bug fixes - \[`pyupgrade`\] Avoid incorrect conversions to f-strings (`UP032`) ([#25485](https://github.com/astral-sh/ruff/pull/25485)) ### Performance - Buffer stdout in `ruff format` ([#29631](https://github.com/astral-sh/ruff/pull/29631)) - Specialize ASCII identifier lexing ([#29503](https://github.com/astral-sh/ruff/pull/29503)) - Speed up identifier and keyword lexing ([#29463](https://github.com/astral-sh/ruff/pull/29463)) ### Documentation - \[`flake8-bandit`\] Describe what the rule actually checks for `httpx` (`S113`) ([#27936](https://github.com/astral-sh/ruff/pull/27936)) ### Contributors - [@itsvedantkumar](https://github.com/itsvedantkumar) - [@charliermarsh](https://github.com/charliermarsh) - [@anishgirianish](https://github.com/anishgirianish) ## Install ruff 0.17.3 ### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.17.3/ruff-installer.sh | sh ``` ### Install prebuilt binaries via powershel

  3. 0.17.20.17.2Oct 22, 2026228.7K downloads

    ## Release Notes Released on 2026-10-22. ### Preview features - \[`complexity`\] Add `unnecessary-regular-expression-compile` ([#25533](https://github.com/astral-sh/ruff/pull/25533)) ### Bug fixes - Avoid syntax errors for type variables with starred constraints (`UP040`, `UP046`, `UP047`, `RUF053`) ([#28362](https://github.com/astral-sh/ruff/pull/28362)) - \[`pydocstyle`\] Treat backslash-escaped `*args` and `**kwargs` as documented (`D417`) ([#29536](https://github.com/astral-sh/ruff/pull/29536)) - \[`pylint`\] Avoid false positive on starred elements (`PLE0643`) ([#29483](https://github.com/astral-sh/ruff/pull/29483)) - \[`pylint`\] Mark fixes unsafe when deleting comments (`PLR5501`, `PLW0120`) ([#29414](https://github.com/astral-sh/ruff/pull/29414)) - \[`pyupgrade`\] Mark fix unsafe when deleting comments (`UP035`) ([#29413](https://github.com/astral-sh/ruff/pull/29413)) ### Performance - Avoid intermediate names in lint name resolution ([#29506](https://github.com/astral-sh/ruff/pull/29506)) - Prefilter bidirectional Unicode checks by UTF-8 leading bytes ([#29561](https://github.com/astral-sh/ruff/pull/29561)) - Share postfix parsing and reduce expression copies ([#294

  4. 0.17.10.17.1Oct 15, 2026385.1K downloads

    ## Release Notes Released on 2026-10-15. ### Preview features - \[`pycodestyle`\] Don't treat `None`, `True`, or `False` as keywords (`E271`-`E274`) ([#29322](https://github.com/astral-sh/ruff/pull/29322)) ### Bug fixes - Fix dedent with multiple leading comments ([#29382](https://github.com/astral-sh/ruff/pull/29382)) - \[`flake8-pyi`\] Detect legacy positional-only parameters in `__new__` methods (`PYI063`) ([#28502](https://github.com/astral-sh/ruff/pull/28502)) - \[`flake8-pyi`\] Fix false positives on quoted annotations (`PYI036`) ([#29274](https://github.com/astral-sh/ruff/pull/29274)) - \[`perflint`\] Avoid invalid comprehension suggestions (`PERF401`, `PERF403`) ([#29366](https://github.com/astral-sh/ruff/pull/29366)) ### Rule changes - Treat more `collections` and `weakref` containers as mutable ([#29213](https://github.com/astral-sh/ruff/pull/29213)) ### Documentation - \[`flake8-import-conventions`\] Update default and example `aliases` ([#29333](https://github.com/astral-sh/ruff/pull/29333)) ### Contributors - [@fixfon](https://github.com/fixfon) - [@mmaxjr](https://github.com/mmaxjr) - [@joshuavetos](https://github.com/joshuavetos) - [@nekomario28](https://g

  5. 0.17.00.17.0Oct 9, 2026306.3K downloads

    ## Release Notes Released on 2026-10-09. The executables in our macOS and Windows release archives and `ruff` wheels are now code-signed. macOS executables are signed with an Apple Developer ID certificate and notarized by Apple. Windows executables have timestamped Authenticode signatures from Azure Artifact Signing. This enables verification of the release publisher and binary integrity, supports publisher-based allowlisting, and should reduce security warnings and antivirus false positives. ### Breaking changes - Update the default and latest Python versions for 3.15 ([#28792](https://github.com/astral-sh/ruff/pull/28792)) Ruff now defaults to Python 3.11 instead of 3.10 when no Python version is configured through [`target-version`](https://docs.astral.sh/ruff/settings/#target-version) or [`requires-python`](https://docs.astral.sh/ruff/configuration/#inferring-the-python-version). When checking for syntax errors without a configured Python version, Ruff now defaults to Python 3.15 instead of 3.14. - Update the default rule set ([#28786](https://github.com/astral-sh/ruff/pull/28786)) Several of the `flake8-datetimez` rules ([`DTZ001`](https://docs.as

Commits per week

last 52 weeks
1910Week of 2025-11-09: 112 commitsWeek of 2025-11-16: 101 commitsWeek of 2025-11-23: 85 commitsWeek of 2025-11-30: 106 commitsWeek of 2025-12-07: 117 commitsWeek of 2025-12-14: 105 commitsWeek of 2025-12-21: 73 commitsWeek of 2025-12-28: 96 commitsWeek of 2026-01-04: 113 commitsWeek of 2026-01-11: 136 commitsWeek of 2026-01-18: 140 commitsWeek of 2026-01-25: 141 commitsWeek of 2026-02-01: 115 commitsWeek of 2026-02-08: 137 commitsWeek of 2026-02-15: 109 commitsWeek of 2026-02-22: 140 commitsWeek of 2026-03-01: 127 commitsWeek of 2026-03-08: 119 commitsWeek of 2026-03-15: 90 commitsWeek of 2026-03-22: 112 commitsWeek of 2026-03-29: 101 commitsWeek of 2026-04-05: 96 commitsWeek of 2026-04-12: 105 commitsWeek of 2026-04-19: 91 commitsWeek of 2026-04-26: 77 commitsWeek of 2026-05-03: 53 commitsWeek of 2026-05-10: 83 commitsWeek of 2026-05-17: 96 commitsWeek of 2026-05-24: 76 commitsWeek of 2026-05-31: 144 commitsWeek of 2026-06-07: 108 commitsWeek of 2026-06-14: 154 commitsWeek of 2026-06-21: 191 commitsWeek of 2026-06-28: 52 commitsWeek of 2026-07-05: 132 commitsWeek of 2026-07-12: 127 commitsWeek of 2026-07-19: 168 commitsWeek of 2026-07-26: 167 commitsWeek of 2026-08-02: 109 commitsWeek of 2026-08-09: 132 commitsWeek of 2026-08-16: 117 commitsWeek of 2026-08-23: 115 commitsWeek of 2026-08-30: 91 commitsWeek of 2026-09-06: 120 commitsWeek of 2026-09-13: 132 commitsWeek of 2026-09-20: 116 commitsWeek of 2026-09-27: 72 commitsWeek of 2026-10-04: 71 commitsWeek of 2026-10-11: 89 commitsWeek of 2026-10-18: 142 commitsWeek of 2026-10-25: 94 commitsWeek of 2026-11-01: 155 commitsNov 9, 2025Nov 1, 2026
5.9K commits in the last 52 weeks.

When work happens

weekday and hour
SunMonTueWedThuFriSat036912151821Sun 0:00 — 27 commitsSun 1:00 — 24 commitsSun 2:00 — 16 commitsSun 3:00 — 16 commitsSun 4:00 — 11 commitsSun 5:00 — 9 commitsSun 6:00 — 16 commitsSun 7:00 — 16 commitsSun 8:00 — 16 commitsSun 9:00 — 35 commitsSun 10:00 — 52 commitsSun 11:00 — 55 commitsSun 12:00 — 44 commitsSun 13:00 — 61 commitsSun 14:00 — 59 commitsSun 15:00 — 61 commitsSun 16:00 — 59 commitsSun 17:00 — 81 commitsSun 18:00 — 72 commitsSun 19:00 — 73 commitsSun 20:00 — 139 commitsSun 21:00 — 223 commitsSun 22:00 — 214 commitsSun 23:00 — 61 commitsMon 0:00 — 76 commitsMon 1:00 — 104 commitsMon 2:00 — 54 commitsMon 3:00 — 48 commitsMon 4:00 — 27 commitsMon 5:00 — 31 commitsMon 6:00 — 59 commitsMon 7:00 — 132 commitsMon 8:00 — 365 commitsMon 9:00 — 292 commitsMon 10:00 — 282 commitsMon 11:00 — 240 commitsMon 12:00 — 201 commitsMon 13:00 — 218 commitsMon 14:00 — 224 commitsMon 15:00 — 226 commitsMon 16:00 — 211 commitsMon 17:00 — 190 commitsMon 18:00 — 178 commitsMon 19:00 — 117 commitsMon 20:00 — 127 commitsMon 21:00 — 156 commitsMon 22:00 — 119 commitsMon 23:00 — 98 commitsTue 0:00 — 61 commitsTue 1:00 — 33 commitsTue 2:00 — 34 commitsTue 3:00 — 23 commitsTue 4:00 — 19 commitsTue 5:00 — 24 commitsTue 6:00 — 34 commitsTue 7:00 — 68 commitsTue 8:00 — 143 commitsTue 9:00 — 183 commitsTue 10:00 — 174 commitsTue 11:00 — 197 commitsTue 12:00 — 213 commitsTue 13:00 — 194 commitsTue 14:00 — 225 commitsTue 15:00 — 170 commitsTue 16:00 — 185 commitsTue 17:00 — 156 commitsTue 18:00 — 124 commitsTue 19:00 — 146 commitsTue 20:00 — 160 commitsTue 21:00 — 154 commitsTue 22:00 — 128 commitsTue 23:00 — 77 commitsWed 0:00 — 96 commitsWed 1:00 — 51 commitsWed 2:00 — 37 commitsWed 3:00 — 21 commitsWed 4:00 — 36 commitsWed 5:00 — 36 commitsWed 6:00 — 44 commitsWed 7:00 — 93 commitsWed 8:00 — 213 commitsWed 9:00 — 210 commitsWed 10:00 — 203 commitsWed 11:00 — 196 commitsWed 12:00 — 219 commitsWed 13:00 — 178 commitsWed 14:00 — 204 commitsWed 15:00 — 210 commitsWed 16:00 — 177 commitsWed 17:00 — 194 commitsWed 18:00 — 147 commitsWed 19:00 — 133 commitsWed 20:00 — 127 commitsWed 21:00 — 124 commitsWed 22:00 — 144 commitsWed 23:00 — 72 commitsThu 0:00 — 61 commitsThu 1:00 — 42 commitsThu 2:00 — 26 commitsThu 3:00 — 34 commitsThu 4:00 — 23 commitsThu 5:00 — 15 commitsThu 6:00 — 28 commitsThu 7:00 — 64 commitsThu 8:00 — 117 commitsThu 9:00 — 180 commitsThu 10:00 — 171 commitsThu 11:00 — 188 commitsThu 12:00 — 215 commitsThu 13:00 — 202 commitsThu 14:00 — 216 commitsThu 15:00 — 174 commitsThu 16:00 — 158 commitsThu 17:00 — 167 commitsThu 18:00 — 114 commitsThu 19:00 — 120 commitsThu 20:00 — 114 commitsThu 21:00 — 116 commitsThu 22:00 — 143 commitsThu 23:00 — 104 commitsFri 0:00 — 68 commitsFri 1:00 — 45 commitsFri 2:00 — 30 commitsFri 3:00 — 43 commitsFri 4:00 — 27 commitsFri 5:00 — 24 commitsFri 6:00 — 39 commitsFri 7:00 — 51 commitsFri 8:00 — 127 commitsFri 9:00 — 196 commitsFri 10:00 — 183 commitsFri 11:00 — 168 commitsFri 12:00 — 186 commitsFri 13:00 — 184 commitsFri 14:00 — 208 commitsFri 15:00 — 161 commitsFri 16:00 — 147 commitsFri 17:00 — 164 commitsFri 18:00 — 129 commitsFri 19:00 — 115 commitsFri 20:00 — 97 commitsFri 21:00 — 95 commitsFri 22:00 — 109 commitsFri 23:00 — 79 commitsSat 0:00 — 50 commitsSat 1:00 — 36 commitsSat 2:00 — 25 commitsSat 3:00 — 18 commitsSat 4:00 — 25 commitsSat 5:00 — 10 commitsSat 6:00 — 23 commitsSat 7:00 — 29 commitsSat 8:00 — 47 commitsSat 9:00 — 32 commitsSat 10:00 — 49 commitsSat 11:00 — 55 commitsSat 12:00 — 80 commitsSat 13:00 — 73 commitsSat 14:00 — 79 commitsSat 15:00 — 87 commitsSat 16:00 — 84 commitsSat 17:00 — 90 commitsSat 18:00 — 73 commitsSat 19:00 — 50 commitsSat 20:00 — 63 commitsSat 21:00 — 62 commitsSat 22:00 — 58 commitsSat 23:00 — 35 commits
Commit volume by weekday and hour (UTC). Larger dots mean more commits.
DateListRankStars gained
Nov 6, 2026daily#15+107
  • morluto/rea

    Reverse engineer anything with agents, from app behavior down to native binaries.

    436.4K stars · TypeScript

  • donnemartin/system-design-primer

    Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards.

    377K stars · Python

  • practical-tutorials/project-based-learning

    Curated list of project-based tutorials

    289.2K stars · Python

  • yt-dlp/yt-dlp

    A feature-rich command-line audio/video downloader

    205.7K stars · Python

  • tensorflow/tensorflow

    An Open Source Machine Learning Framework for Everyone

    201.3K stars · C++

  • ultraworkers/claw-code

    An agent-managed museum exhibit, built in Rust with Gajae-Code / LazyCodex — developed and maintained with no human intervention.

    194.9K stars · Rust