Skip to content
Latchkey

Ruff vs Black: Which Python Formatter for CI?

Ruff’s formatter is fast and aims for Black-compatible output, and it also lints in the same binary.

Black is the widely-adopted, opinionated Python code formatter. Ruff (from Astral) includes a formatter designed to be highly Black-compatible while running much faster and pairing with Ruff’s linter in one tool.

BlackRuff (format)
ImplementationPythonRust
SpeedSlowerVery fast
Black compatibilityn/a (the reference)High by design
LintingNo (format only)Yes (lint + format)
AdoptionUbiquitousGrowing fast

In CI

A format --check step runs on every push; Ruff makes it noticeably faster and can replace Black plus your linter with one binary. Ruff’s formatter targets Black-compatible output, so for most codebases the formatting diff on switching is minimal. Black remains the reference formatter with the broadest ecosystem familiarity and editor support.

Migration effort

Run ruff format across the repo in one commit to absorb any small diffs, then enforce it in CI. Because output is Black-compatible by design, churn is usually low. Keep Black only if a specific tool or workflow requires it explicitly.

The verdict

Want fast formatting (plus linting) in one tool with Black-compatible output: Ruff. Want the reference formatter with maximum ecosystem familiarity: Black. Switching is low-churn - reformat in one commit.

Related guides

Run this faster and cheaper on Latchkey managed runners. Start free →