Skip to content

Reposition awesome-python as a shortlist, not a catalog - #3288

Merged
vinta merged 168 commits into
masterfrom
refactor/shortlist-reform
Aug 16, 2026
Merged

Reposition awesome-python as a shortlist, not a catalog#3288
vinta merged 168 commits into
masterfrom
refactor/shortlist-reform

Conversation

@vinta

@vinta vinta commented Aug 16, 2026

Copy link
Copy Markdown
Owner

awesome-python is now a shortlist, not a catalog. Each use case lists at most 3 obvious choices plus 2 challengers, hard maximum 5. Full rules in CONTRIBUTING.md, rationale in docs/adr/0001-shortlist-not-catalog.md.

Rules

  • The scope test is now "serves Python developers", replacing "primarily written in Python". uv and ty are Rust, yet Python developers use them daily.
  • Admission is maintainer editorial judgment, informed primarily by PyPI download counts rather than GitHub stars.
  • Once a use case is full, the only way in is displacement: name the entry you replace and argue yours does the job better.
  • The existing stock got the same test retroactively: worst-first sweeps, one commit per section. Removed entries are deleted outright, git history is the archive.

Data

  • 3 PyPI download fetchers: ClickPy for full sweeps (writes website/data/pypi_downloads.tsv), pepy and BigQuery for cross-checks.
  • website/data/pypi_name_overrides.json maps README names to real PyPI packages. Without it, some rows silently measure squatters (PyPI's pytorch is not torch) or dead predecessors (PyPI's jinja is Jinja1).

Website

  • New PyPI Downloads column, now the default sort. GitHub stars are one click away.
  • Entries not on PyPI show a "Not on PyPI" badge instead of a number.
  • The deploy workflow fetches fresh download counts daily.

Maintainer tooling

  • audit-the-list skill: re-verifies every entry's verdict with live data.
  • preview-verdicts skill: interactive keep/drop preview pages for batch review.

The list went from 576 entries to 487 so far. Most future PRs will be rejected for fullness, not badness.

vinta and others added 30 commits August 15, 2026 13:00
Records the outcome of a grilling session with the maintainer that
settled the redesign of awesome-python from a catalog into a curated
shortlist of Obvious Choices per Use Case. Execution is held pending
maintainer go-ahead, so these files let a fresh agent resume without
re-litigating settled decisions:

- CONTEXT.md: glossary of the editorial vocabulary (Use Case, Obvious
  Choice, Challenger, Displacement, Split, etc).
- docs/adr/0001-shortlist-not-catalog.md: the ADR recording the
  decision, considered options, and consequences (status: proposed).
- .gitignore: docs/ was wholesale-ignored; carve out docs/adr/ so the
  ADR can be tracked.

Co-Authored-By: Claude <noreply@anthropic.com>
Cap changed to 3 obvious choices + up to 2 challengers (hard max 5)
during review, but the ADR still described the old cap of 3 with at
most one challenger.

Co-Authored-By: Claude <noreply@anthropic.com>
ADR review found three stale claims: an unreviewed Testing dry-run cited as
evidence for the projected list size, the Challenger path missing from the
lane-rejection rationale, and no mention of judgment overriding known
failure modes of the download-signal (CI/dependency-inflated counts, model
weights vs. pip installs, large-but-specific audiences misread as niche).

Co-Authored-By: Claude <noreply@anthropic.com>
Per maintainer choice, the new scope test replaces the old primarily-written-in-Python (>50%) requirement: implementation language and packaging no longer matter as long as Python developers use the thing in their Python work (e.g. uv and ty are Rust; agent skill packs are markdown), while pure-Python projects nobody uses in Python work still don't qualify. Folded into the existing ADR rather than filed as a separate one.

Co-Authored-By: Claude <noreply@anthropic.com>
CONTEXT.md review found several definitions had drifted from the
settled shortlist-reform decisions:
- Entry: pypi-name placeholder contradicted the serves-Python-developers
  scope test, which explicitly treats implementation language and
  packaging as irrelevant; now named by PyPI package name when one
  exists, else repository name
- Subcategory: example referenced a name that no longer matches the
  current README structure (Mock, not Mocking)
- Thematic Group: referenced elsewhere in the doc but never defined;
  added
- Use Case, Obvious Choice, Split: updated to match the settled
  cap/evidence/restructure decisions (maintainer-only structure
  changes, PyPI-download judgment with known failure modes noted,
  Split considered before trimming)

Co-Authored-By: Claude <noreply@anthropic.com>
A 2026-08-15 grilling round replaced the Challenger marking
convention: within a Use Case, Obvious Choices are listed first
(alphabetically), then Challengers (alphabetically), with no marker
in the entry text. Update the Challenger definition in CONTEXT.md.

Co-Authored-By: Claude <noreply@anthropic.com>
Land the shortlist-reform rules approved by the maintainer (rules
first; entry sweeps are not authorized yet).

- CONTRIBUTING.md: replace the Industry Standard / Rising Star / Hidden
  Gem lanes with a single admission rule per use case (up to 3 obvious
  choices + up to 2 challengers, hard max 5), add Displacement, the
  stdlib rule, and editorial-judgment-as-final evidence guidance; scope
  test becomes Serves Python Developers; document entry ordering
  (obvious choices then challengers, each alphabetical).
- README.md: add the shortlist promise paragraph pointing rejected
  contributors to linked awesome-* catalogs and to CONTRIBUTING.md.
- CLAUDE.md: sync Key Rules with the new ordering and shortlist cap,
  and add the prune-sweep one-commit-per-section exception.
- docs/adr/0001-shortlist-not-catalog.md: flip status from proposed to
  accepted.

Co-Authored-By: Claude <noreply@anthropic.com>
Per ADR-0001, restructure first: split Pre-trained Models and Inference
into Pre-trained Models, LLM Inference and Serving, and LLM Gateways;
mint Vendor Agent SDKs, Personal Assistants, Prompt Optimization, Image
and Video Generation, and Fine-tuning subcategories. Re-home
openai-agents (Vendor Agent SDKs), hermes-agent (Personal Assistants,
description reworded to personal assistant), dspy (Prompt Optimization),
diffusers (Image and Video Generation), unsloth (Fine-tuning), and
graphify (Data Visualization > Specialized). Then cap.

Removed (downloads are PyPI last-month via pypistats, 2026-08-14/15):

- nuwa-skill: persona prompts, not engineering
- crewai (19.4M/month): buzz peaked; no longer named unprompted
- autogen (1.1M/month): fork war with ag2 split its community
- ag2 (441K/month): other half of the same fork war
- smolagents (651K/month): Hugging Face ecosystem niche
- TradingAgents (11.9K/month): vertical trading app, not general
  orchestration
- bub (5.6K/month): no adoption
- bindu (210/month): no adoption
- livetalking: no PyPI presence, no adoption evidence
- bernstein: no PyPI presence, no adoption evidence
- promptise: no PyPI presence, no adoption evidence
- OpenChronicle: no PyPI presence, no adoption evidence
- outlines (2.5M/month): same job as instructor, which holds the slot
- entroly (3.1K/month): no adoption
- lumen (1.8K/month): no adoption
- liter-llm (3.5K/month): xberg-io coordinated self-promotion plant
- SenseVoice: whisper wins the use case
- voxcpm (101K/month): no track record

Co-Authored-By: Claude <noreply@anthropic.com>
Anthropic's Python SDK for building AI agents on Claude Code's harness.
~32.6M downloads/month (pepy, 2026-08-15; approximate, includes
mirrors — pypistats was rate-limited). Lands beside openai-agents in
the Vendor Agent SDKs use case minted in the AI and Agents sweep.

Co-Authored-By: Claude <noreply@anthropic.com>
Per ADR-0001, restructure first: split MS Office into Excel, Word, and
PowerPoint; mint File Conversion (docling re-homed from General,
markitdown re-homed from Markdown) and HTML-to-PDF (weasyprint re-homed
from PDF). Then cap. xlsxwriter and weasyprint keep their slots via the
Splits (decision reversing their earlier drop verdicts).

Removed (downloads are PyPI last-month via pypistats, 2026-08-14/15):

- xberg (26K/month): xberg-io coordinated self-promotion plant
- xlwings (941K/month): different job (calling Python from Excel), not
  the Excel file-format use case
- docxtpl: templating layer over python-docx, which holds the Word slot
- pyexcel (2.2M/month): abstraction over the per-format libraries that
  hold the slots
- pikepdf (10.6M/month): PDF use case at cap; pypdf, reportlab, and
  pdfminer.six are the obvious choices
- pdf_oxide (142K/month): no adoption evidence against the incumbents
- csvkit (506K/month): not the obvious choice for CSV work

Co-Authored-By: Claude <noreply@anthropic.com>
Per ADR-0001. No restructure needed: Plotting caps to matplotlib,
plotly, seaborn plus altair as Challenger (listed last per the
Challenger-ordering rule); Specialized (cartopy, graphify, pygraphviz)
and Dashboards and Apps (gradio, streamlit) already fit.

Removed (downloads are PyPI last-month via pypistats, 2026-08-14/15):

- bokeh (8.4M/month): Plotting at cap; interactive plotting job covered
  by plotly
- plotnine (3.1M/month): below the shortlist bar
- vispy (1.4M/month): below the shortlist bar
- pyqtgraph (1.0M/month): below the shortlist bar
- bqplot (381K/month): below the shortlist bar
- pygal: legacy; downloads fetch failed
- ultraplot (3.9K/month): no adoption

Co-Authored-By: Claude <noreply@anthropic.com>
Per ADR-0001, restructure first: split GUI / Web Testing into Browser
Automation (playwright-python, selenium), Load Testing (locust), and
API Testing (schemathesis). Then cap. Maintainer-adjudicated 2026-08-15
at the preview review: robotframework, schemathesis, respx, vcrpy, and
mimesis keep against the old dry-run verdicts; respx and vcrpy take the
two Mock Challenger slots, nox stays the Test Runners Challenger
(listed after tox per the Challenger-ordering rule).

Removed (downloads are PyPI last-month, fetched 2026-08-15):

- scanapi (3.3K/month): near-zero usage
- unittest: stdlib rule - a stdlib module survives only where it is
  itself the Obvious Choice; for test frameworks that is pytest
- pyautogui (2.5M/month): desktop GUI automation, not web testing; no
  Use Case slot after the Split
- mocket (273K/month): socket-level mocking; small audience next to
  responses

Co-Authored-By: Claude <noreply@anthropic.com>
Adds a reusable skill that generates the interactive keep/drop review page (seeded verdicts + reasons, maintainer Keep/Drop toggles and reason fields, JSON feedback export) and processes the pasted feedback, so every future prune sweep or batch entry edit reuses the pattern proven in the shortlist-reform reviews. Removes .claude/skills/ and the dead .agents/ line from .gitignore so the skill is tracked, per maintainer direction.

Co-Authored-By: Claude <noreply@anthropic.com>
Provides per-sitting download evidence for prune sweeps, per the
shortlist-reform tooling plan. Shells out to the bq CLI against
bigquery-public-data.pypi.file_downloads, parses entry names from
README.md via readme_parser, and supports --dry-run and --names-file.
Merges results into the gitignored cache at
website/data/pypi_downloads.tsv.

The table is clustered on file.project, so scanned bytes grow with the
IN-list size: a dry run against the full README (~530 names) scanned
1.21 TB, past the 1 TB/month free tier. Per-sitting --names-file
fetches are used instead of one big query.

Co-Authored-By: Claude <noreply@anthropic.com>
Qualitative keep/drop reasoning previously relied on training-data
recollections that went unverified while only download numbers were
checked live, as happened in the Data & Science preview. Key Rules now
require every keep/drop reason to be verified against current online
data at decision time.

Co-Authored-By: Claude <noreply@anthropic.com>
Re-added as a Challenger alongside pydantic-ai. The maintainer reviewed the committed-drops audit (all 36 removals re-verified against live data 2026-08-15) and flipped crewai back: 19.4M downloads/month, 57.1K stars, repo active same-day. The original 'buzz peaked' drop was judgment the audit data did not support.

Co-Authored-By: Claude <noreply@anthropic.com>
The maintainer re-verified all 36 removals from the committed-drops audit against live data on 2026-08-15 and flipped bokeh back: 8.4M downloads/month, 20.4K stars, repo pushed the same day, the healthiest project among all audited drops. Placed as the second Challenger after altair, bringing Plotting to the hard max of 5 entries.

Co-Authored-By: Claude <noreply@anthropic.com>
Per ADR-0001, maintainer-adjudicated at the Data & Science preview
review (2026-08-15, all rows live-verified). Keeps: pandas and polars
as Obvious Choices, ibis as Challenger — renamed to ibis-framework per
the PyPI-name convention (maintainer-confirmed; bare 'ibis' on PyPI is
an unrelated template engine). aws-sdk-pandas returns as a sub-item
under pandas per maintainer direction (sub-items sit outside the cap,
awesome-pytest pattern).

Removed (downloads are PyPI last-30-days via BigQuery, 2026-08-15):

- data-profiling (18.2K/month under fg-data-profiling): YData's
  profiler, but the listed name is not on PyPI and a profiling layer is
  not an obvious choice for this use case
- datasette (178.6K/month): data publishing and exploration tool, a
  different job
- desbordante (3.4K/month): no adoption
- modin (1.6M/month): the pandas-at-scale job moved to polars and dask;
  repo quiet since 2026-02
- pathway (16.5K/month): stars far ahead of usage (62.5K stars); ETL
  job, mis-homed here
- percentify (182.2K/month): personal project, 11-month-old repo, 418
  stars — count not credible against the footprint

Co-Authored-By: Claude <noreply@anthropic.com>
Per ADR-0001, maintainer-adjudicated at the Data & Science preview
review (2026-08-15, all rows live-verified). General keeps dlt (sole
entry). Financial Data keeps akshare and yfinance as Obvious Choices
with edgartools and openbb as Challengers (openbb on the platform
judgment: 71.9K stars against 132K pip installs).

Removed (downloads are PyPI last-30-days via BigQuery, 2026-08-15):

- lumibot (168.2K/month): algorithmic trading and backtesting framework
  with broker execution — not financial data; vertical app
  (TradingAgents precedent)

Co-Authored-By: Claude <noreply@anthropic.com>
Per ADR-0001, maintainer-adjudicated at the Data & Science preview
review (2026-08-15, all rows live-verified). Keeps jsonschema, pandera,
and pydantic as Obvious Choices for their distinct validation jobs.

Removed (downloads are PyPI last-30-days via BigQuery, 2026-08-15):

- cerberus (6.7M/month): pre-pydantic era passed; repo alive but slow
- voluptuous (8.0M/month): pre-pydantic era passed; repo description
  opens with "CONTRIBUTIONS ONLY" (maintenance mode)

Co-Authored-By: Claude <noreply@anthropic.com>
Per ADR-0001, maintainer-adjudicated at the Data & Science preview
review (2026-08-15, all rows live-verified). Keeps geojson, geopandas,
and geopy as Obvious Choices; geodjango kept by maintainer flip and
listed last as Challenger (the cap allows three obvious choices).

Removed (downloads are PyPI last-30-days via BigQuery, 2026-08-15):

- django-countries (2.3M/month): country choices for Django forms and
  models — Django form tooling, not geolocation work

Co-Authored-By: Claude <noreply@anthropic.com>
Per ADR-0001, maintainer-adjudicated at the Data & Science preview
review (2026-08-15, all rows live-verified). Restructure first: Core
narrows to numba, numpy, scipy; mint Symbolic Mathematics (sympy),
Statistics (statsmodels), Graphs and Networks (networkx), and
Computational Geometry (shapely) — five co-obvious tools doing five
different jobs, the decision-13 pattern. Other shrinks to a two-entry
grab-bag; colour renamed to colour-science per the PyPI-name convention
(bare 'colour' on PyPI is an unrelated color-conversion library). Then
cap.

Removed (downloads are PyPI last-30-days via BigQuery, 2026-08-15):

- cclib (29.7K/month): computational-chemistry log parsing, small
  audience
- openbabel (54.9K/month pip; conda-forge adds only 1.8M all-time):
  legacy toolbox next to rdkit
- pydy (1.2K/month): near-zero usage
- PythonRobotics: educational algorithm compilation ("sample codes and
  textbook" per its own description), not a library; not on PyPI
- pathsim (6.3K/month): no adoption

Co-Authored-By: Claude <noreply@anthropic.com>
Per ADR-0001, maintainer-adjudicated at the Data & Science preview
review (2026-08-15). No removals — all four entries keep: qiskit and
qutip as Obvious Choices (circuit SDK and quantum physics simulation,
distinct jobs), cirq and pennylane as Challengers, ordered per the
Challenger-ordering rule. Format fixes bundled per the Key Rules
bundling exception: three em-dash separators normalized to hyphens,
Cirq lowercased to its PyPI name.

Co-Authored-By: Claude <noreply@anthropic.com>
Maintainer decision 2026-08-16, amending the ordering half of the
Challenger-marking rule: within a use case, obvious choices still come
first and challengers still follow (position stays the marker), but
each tier now orders by PyPI downloads per month descending instead of
alphabetically. Entries without a download signal (stdlib modules,
agent skill packs) sort last within their tier, alphabetically.
Updated in CONTRIBUTING.md (Entry Ordering), CONTEXT.md (Challenger),
and CLAUDE.md (Key Rules).

Co-Authored-By: Claude <noreply@anthropic.com>
Apply the new ordering rule (downloads/month descending within each
tier, no-signal entries last alphabetically) to all ten swept sections.
Sixteen use cases change order: Vendor Agent SDKs, LLM Inference and
Serving, Speech, File Conversion, PDF, Markdown, Data Visualization
Specialized and Dashboards, Testing Frameworks and Mock, Financial
Data, Data Validation, Geolocation, Science Core and Simulation and
Modeling, Quantum Computing challengers. Unswept sections keep their
current order until their own sweeps. Bundled as a single
categorization commit per the Key Rules bundling exception.

Co-Authored-By: Claude <noreply@anthropic.com>
AGENTS.md still carried pre-reform Key Rules (mandatory alphabetical
ordering, "quality over quantity" lanes-era language, no prune-sweep
commit exception, no live-verification rule). Bring it in line with
CLAUDE.md and CONTRIBUTING.md: downloads-descending tier ordering,
3+2 cap, sweep-commit exception, verification rule. Also record the
UV_PYTHON=3.13 workaround for Python-3.14-only machines in both files'
Makefile notes, and complete CLAUDE.md's Makefile target list.

Co-Authored-By: Claude <noreply@anthropic.com>
Packages the audit process proven across the shortlist-reform sweeps
as a reusable skill: resolve scope from the arguments (AskUserQuestion
when ambiguous or absent), fetch live evidence for every entry
(BigQuery downloads, repo state, PyPI metadata), draft verdicts with
restructure-before-cap and tier promotions/demotions, review through
the verdict-preview page, execute one commit per section on explicit
go, and record durable conclusions into CONTRIBUTING.md, CLAUDE.md,
AGENTS.md, and CONTEXT.md. CONTEXT.md gains the Audit glossary term
(the reform sweeps were the first Audits). Rules stay single-sourced in
CONTRIBUTING.md — the skill carries process only.

Co-Authored-By: Claude <noreply@anthropic.com>
Verb-first naming per maintainer preference. Directory, frontmatter
name, and the audit-the-list reference updated together; template.html
moves with the directory unchanged.

Co-Authored-By: Claude <noreply@anthropic.com>
Live bq show verified the pypi.file_downloads table clusters on the
top-level project column, not file.project as the docstring claimed.
Filtering on project (values verified identical to file.project across
408M rows, zero mismatches) gets cluster pruning and cuts the
full-README scan estimate from >1.2TB to ~275GB upper bound, with
actual billed bytes lower still (33.7GB measured for a single name) -
so full sweeps now fit the 1 TiB/month free tier.

Also adds --maximum_bytes_billed=400GB as a safety cap, enforced by
BigQuery pre-run against the dry-run upper-bound estimate.

Co-Authored-By: Claude <noreply@anthropic.com>
vinta and others added 28 commits August 16, 2026 15:57
Git history already archives every removal's reason via commit body,
but it can't be scanned at a glance. docs/audit-logs.md is the
at-a-glance register of overrides (naming exceptions, mature-stable
keeps) allowed by CONTRIBUTING.md. Drop the docs/* gitignore exclusion
(and stale .superpowers/ and skills-lock.json entries) so the file and
future doc additions outside docs/adr/ can be tracked.

Co-Authored-By: Claude <noreply@anthropic.com>
Cross-section re-homes now ride the originating audit's commit instead
of needing a separate one, since both sides of the move land in one
diff. Also note that Resources sections are out of audit scope and
never parsed by the website, so they're not project entries subject
to the one-entry-per-commit rule.

Co-Authored-By: Claude <noreply@anthropic.com>
Extend the known failure-mode list for PyPI download counts beyond
model weights to any project consumed outside pip (SDK downloads like
renpy, deployed services like thumbor). Also clarify that the per-Use-
Case Cap is a ceiling, not a floor: a freshly minted Use Case may hold
a single entry.

Co-Authored-By: Claude <noreply@anthropic.com>
Note that data/github_stars.json is gitignored and fetched by CI at
deploy time, so local runs are preview-only and should never be
committed; entries removed from README.md just leave harmless orphan
keys behind.

Co-Authored-By: Claude <noreply@anthropic.com>
Capture parser quirks worth knowing before editing README.md:
everything above  is ignored, new subcategories need no
parser change, a standalone all-bold paragraph becomes a Thematic
Group marker, prose after  leaks into llms.txt, and the
build's "Total entries" figure counts sub-items rather than just
entries.

Co-Authored-By: Claude <noreply@anthropic.com>
The maintainer decided how duplicate entries across categories should
be handled (e.g. uv listed in both Environment Management and Package
Management): each slot must earn its place independently, entries are
listed in full with identical lines rather than a cross-reference,
description edits update every copy in the same commit, and each slot
is audited on its own.

Co-Authored-By: Claude <noreply@anthropic.com>
The old template used a stars-based tier system (Industry Standard /
Rising Star / Hidden Gem) that contradicted the current CONTRIBUTING.md,
which judges entries by obvious-choice/challenger tiers, favors PyPI
downloads over stars, and requires Displacement when a use case is at
its cap. The new template reflects those rules and adds a checklist
item pointing contributors to CONTRIBUTING.md.

Co-Authored-By: Claude <noreply@anthropic.com>
Reuses CONTRIBUTING.md's plainer 'would name when asked' phrasing instead of 'unprompted', per maintainer feedback that 'unprompted' didn't sound right.

Co-Authored-By: Claude <noreply@anthropic.com>
Sub-item policy reserves sub-items for awesome-* links. aws-sdk-pandas
promoted out as awswrangler in Data Ingestion / ETL > General
(85.3M downloads/mo, 10x dlt, active).

Co-Authored-By: Claude <noreply@anthropic.com>
Not a tool readers install: type checkers bundle it automatically as a
stub collection, it has no PyPI package, and no standalone use case.
The Type Checkers subcategory label already links to
awesome-python-typing for ecosystem depth.

Co-Authored-By: Claude <noreply@anthropic.com>
Was a sub-item under mkdocs. By downloads it ranks second in the
section at 17.6M/mo (ClickPy), above mkdocs' 17.4M, and it powers
FastAPI, Pydantic, and Ruff/Polars docs (27,269 stars, pushed
2026-08-09). Documentation now sits at its 5-entry cap.

Co-Authored-By: Claude <noreply@anthropic.com>
…ng entry

Flower isn't a task queue, so nesting it under celery misclassified it; Task Queues is also at its entry cap. Monitoring and Processes is its honest home, ranking fourth by downloads (12.35M/mo ClickPy, between supervisor 17.0M and sh 11.8M), and Celery's own docs name it the recommended monitor. Repo pushed 2026-08-16 with 7,232 stars. This fills Monitoring and Processes to its 5-entry cap.

Co-Authored-By: Claude <noreply@anthropic.com>
Re-homed pyenv-win from a pyenv sub-item (Environment Management) to a full entry in Microsoft Windows, placed before winpython by downloads (25.8k/mo vs 172). Actively maintained, pushed 2026-08-14, 7,360 stars. Maintainer preference is to move sub-items to a fitting category rather than delete.

Co-Authored-By: Claude <noreply@anthropic.com>
Removed the companion-project clause from the Sub-item definition in
CONTEXT.md's vocabulary. Its examples (aws-sdk-pandas under pandas,
flower under celery) went stale this sitting: those companions were
promoted, re-homed, or deleted. Per the maintainer's 2026-08-16 policy
decision, sub-items are now reserved for awesome-* also-see links only
- a companion project must earn a full Entry in its proper Use Case or
not be listed.

Co-Authored-By: Claude <noreply@anthropic.com>
watchdog 6.0.0 (last release 2024-11-01) ships no cp314 macOS wheel,
and uv has no per-package build allowlist under no-build = true, so
the preview file watcher moves to watchfiles, which ships cp314
wheels. watchfiles now lives in its own preview dependency group.
UV_PYTHON=3.13 is no longer needed on machines that only have 3.14.

Co-Authored-By: Claude <noreply@anthropic.com>
Exact reproducibility already lives in uv.lock via 'uv sync --locked',
so == in pyproject.toml only duplicates the lockfile and blocks
'uv lock --upgrade'. Locked versions are unchanged.

Co-Authored-By: Claude <noreply@anthropic.com>
The entry linked hydra-ecosystem/hydra, an unrelated W3C Hydra API
toolkit, while the entry name and description describe
facebookresearch's Hydra configuration framework, mixing the wrong
repo's stars with the right package's identity. Found during the
downloads-column identity sweep.

Co-Authored-By: Claude <noreply@anthropic.com>
A pypi.org identity sweep of all 438 cached rows (project_urls/home_page
vs entry GitHub URL) found download counts were looked up by README
display name, so entries whose name differs from the canonical package
silently measured squatters or dead predecessors: pytorch measured a
squatter (169,737/mo vs torch's 94M), jinja measured Jinja1 (3,168 vs
jinja2's 736M), django-rest-framework a dead alias package (real:
djangorestframework), django-rules an abandoned fork (real: rules),
strawberry an unrelated bookmarking service (real: strawberry-graphql),
devpi a deprecated metapackage (mapped to devpi-server).

New curated website/data/pypi_name_overrides.json maps normalized
README name to the real package, or null for projects not
pip-installable whose name is squatted or a relic (cpython, pyenv,
renpy, python-patterns, winpython); also maps mem0 to mem0ai, fasthtml
to python-fasthtml, and playwright-python to playwright.

All three fetch scripts resolve names through it; the clickpy TSV
cache gains a package column recording what each row actually
measured. .gitignore switches website/data/ to website/data/* with a
negation so the curated overrides file is tracked while caches stay
ignored.

Co-Authored-By: Claude <noreply@anthropic.com>
Sourced from website/data/pypi_downloads.tsv the same way
github_stars.json feeds the stars column. The new sortable column
sits between GitHub Stars and Last Commit on the homepage and
category pages, formatted with thousands separators like stars, with
an em dash when no PyPI data exists. Rows are matched by normalized
README display name; Built-in entries never show counts since
same-named PyPI packages are stdlib backports (e.g. the asyncio
package).

Below 960px the column hides and the count moves into the expand
row, mirroring the existing Last Commit treatment. main.js gains the
downloads sort branch and URL param.

The deploy workflow fetches the TSV via the new
make fetch_pypi_downloads target with a daily actions/cache
fallback, mirroring the stars fetch, but non-fatal: the column
degrades to dashes when the fetch fails, unlike stars which the
build requires.

Co-Authored-By: Claude <noreply@anthropic.com>
autobahn-python publishes as autobahn (7.1M/mo), pangu-py as pangu, and
strawberry-django as strawberry-graphql-django (1.5M/mo). httpx.URL is
left unmapped deliberately since it's a class within the httpx package,
not a package of its own.

Co-Authored-By: Claude <noreply@anthropic.com>
Every queried name now resolves 447/447. Adds 23 explicit null
overrides so squatters can never silently attach a PyPI number to
these names later: stdlib-named entries (concurrent-futures, difflib,
mimetypes, sqlite3, tkinter, tomllib, zoneinfo), interpreters
(micropython, pypy), monorepo umbrellas (azure-sdk-for-python,
google-cloud-python), self-hosted or distro-installed projects (odoo,
cloud-init, warehouse), GitHub-only projects (thealgorithms,
geodjango, django-db-models, django-ai-plugins, graphify,
sentry-skills, social-engineer-toolkit, trailofbits-skills), and
httpx-url (a class within httpx, not a package).

Caveat: graphify and django-ai-plugins are young projects that may
legitimately publish to PyPI later — flip their null to a remap
during a future audit if they do.

Co-Authored-By: Claude <noreply@anthropic.com>
Every entry is now {"package": str|null, "reason": str|null} instead of
a bare string/null. Reasons are required for null packages, explaining
why the name must never be queried (squatted name, stdlib module,
monorepo umbrella, GitHub-only project, and so on). Reasons are
optional for remaps and kept only on the six non-obvious ones: pytorch
(squatter), jinja (jinja is Jinja1), strawberry (unrelated bookmarking
service), django-rules (abandoned fork), django-rest-framework (dead
alias), and devpi (deprecated metapackage); plain publishes-as-X
remaps get a null reason.

load_overrides() in the clickpy fetcher now extracts the package field
from each entry; resolve() and the pepy/bigquery cross-check scripts
are unchanged since they consume load_overrides()'s output.

Co-Authored-By: Claude <noreply@anthropic.com>
Entries with a download count now sort first (descending), with
stars, then Built-in, then name as fallback tiers for entries that
lack a count. main.js mirrors this in its default activeSort, clean
URL check, and third-click reset target. Sorting by stars remains one
header click away.

Co-Authored-By: Claude <noreply@anthropic.com>
The header no longer carries the per-month unit; expand-row text keeps
its 'downloads/month' wording.

Co-Authored-By: Claude <noreply@anthropic.com>
Downloads is now the default sort, so it sits directly after the
project name in both the index and category table templates. The
source-type badge stays in the stars cell.

Co-Authored-By: Claude <noreply@anthropic.com>
Replaces the em dash in the PyPI Downloads column with a source-badge
pill labeled "Not on PyPI", reusing the existing badge style used by
the stars column for visual consistency. Sorting is unaffected since
non-numeric cells already parse as missing.

Co-Authored-By: Claude <noreply@anthropic.com>
@vinta
vinta merged commit b7e12cf into master Aug 16, 2026
5 checks passed
@vinta
vinta deleted the refactor/shortlist-reform branch August 16, 2026 11:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant