Python Ecosystem Tool and Build Backend Statistics

Last refreshed: 2026-04-16

Aggregating data on the usage of tools and build backends over time, using the grep.app search, the source distributions of the top PyPI packages, and the PyPI Linehaul BigQuery data.

Datasets

Linehaul: Each PyPI simple API access and file download is logged to BigQuery through linehaul. The metadata includes package name/version, installer info, subcommand, and CI status. The data is reliably available since 2019, with CI tracking being added in 2024 (via CI=1). Poetry doesn't report CI info. We use 7-day and 90-day rolling averages to smooth daily fluctuations.

Build backends: Analysis of the top 15k PyPI packages by downloads. Build backend info is extracted from pyproject.toml and setup.py in source distributions. The setup.py category tracks packages without a [build-system] table. 1 of 15,000 packages failed to analyze and was excluded.

grep.app: Uses search hits for different tools on grep.app, which indexes public code repositories. While smaller than GitHub, it accurately reports hit counts. According to a Vercel blog post, grep.app includes "1M+ pre-indexed repos". Search hits are captured daily.

Minimum Python Version

Figure 1: Minimum Python version (bars) from requires-python in the latest version of the top 15,000 PyPI packages by downloads in the last 30 days. The orange line shows the cumulative distribution among packages, which is the share of packages can be installed with the given Python patch version.

Build System Distribution

Figure 2: Build backend distribution among the top 15k PyPI packages by downloads, comparing all packages vs. those with uploads in the last 365 days.

Code Search Statistics

Figure 3: Search hits for the main commands for pip (top) and non-pip package managers (bottom) in grep.app, recorded daily.
Figure 4: Growth in the search hits for package managers in grep.app, recorded daily, relative to start of the recording. The dotted lines are idealized projections from linear fits.

PyPI Downloads

Figure 5: Daily wheel and source distribution downloads by tool as tracked by linehaul, in absolute numbers (top) and relative fractions by tool (bottom). Only tools with >0.1% usage and only tools reporting linehaul data are shown.

Astral Static Tools

Figure 6: Daily search hits for the main ruff and ty subcommands in grep.app. Linear fits for each tool are shown as dotted lines.

uv subcommands

Figure 7: Wheel and source distribution downloads by uv subcommand in the last 7 days, split by CI vs. non-CI usage. No subcommand generally means an old version that doesn't report the subcommand.
Figure 8: Simple API requests by uv subcommand in the last seven days, split by CI vs. non-CI usage. No subcommand generally means an old version that doesn't report the subcommand.
Figure 9: Wheel and source distribution downloads by uv version last 7 days, split by CI vs. non-CI usage. Only the 20 most used versions are shown.
Figure 10: Cumulative distribution of downloads by uv version age, split by CI vs. non-CI usage, using downloads in the last 7 days. This is approximately the time since the last version update, discounting the time since the latest release.
Figure 11: Cumulative distribution of downloads by version age, comparing uv, pip, and poetry, using downloads in the last 7 days. This is approximately the time since the last version update, discounting the time since the latest release. For poetry, data is only reported since linehaul support was added.

Figures not shown

Two figures were excluded from this page for lack of signal.

  • CI vs. non-CI downloads from PyPI don't show a clear trend in the short timespan they cover, ranging between 20% and 35% CI downloads (Figure).
  • The downloads of the most popular PyPI segmented by tool have a high variance with no discernible pattern (Figure).

(Intermediate) Data

The intermediate data aggregated data used to generate plots.