Reposition awesome-python as a shortlist, not a catalog - #3288
Merged
Conversation
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>
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
Data
website/data/pypi_downloads.tsv), pepy and BigQuery for cross-checks.website/data/pypi_name_overrides.jsonmaps README names to real PyPI packages. Without it, some rows silently measure squatters (PyPI'spytorchis nottorch) or dead predecessors (PyPI'sjinjais Jinja1).Website
Maintainer tooling
audit-the-listskill: re-verifies every entry's verdict with live data.preview-verdictsskill: 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.