Mints the Compression use case. zstd joined the standard library in Python 3.14, and urllib3 and aiohttp now depend on its backport for older Pythons. The null override keeps the downloads sweep from querying a same-named PyPI package.
Co-Authored-By: Claude <noreply@anthropic.com>
pgmpy does causal and probabilistic reasoning with graphical models, closer to statistics than to the scikit-learn ecosystem in General, so it moves to Science > Statistics after statsmodels.
Co-Authored-By: Claude <noreply@anthropic.com>
General held two jobs, so it splits into Servers and Clients (websockets, autobahn-python) and Framework Integrations (channels, flask-socketio), next to WebRTC.
Co-Authored-By: Claude <noreply@anthropic.com>
CORS for Flask at 39,864,140 downloads/month, twice django-cors-headers; placed first by downloads, which moves secure to challenger.
Co-Authored-By: Claude <noreply@anthropic.com>
Mints a Code Sandboxes use case for running AI-written code locally; 4,353,276 downloads/month, 1.0.0 and Production/Stable. Hosted-sandbox clients stay out as vendor clients.
Co-Authored-By: Claude <noreply@anthropic.com>
Splits the flat section into General and WebRTC, since a subcategory can't repeat the section name; aiortc is the WebRTC/ORTC stack for asyncio at 1,647,618 downloads/month, nearly all direct.
Co-Authored-By: Claude <noreply@anthropic.com>
The unified filesystem interface that torch, huggingface-hub, and datasets build on, placed first in Remote Files by downloads (556.9M/month, mostly pulled in by those libraries).
Co-Authored-By: Claude <noreply@anthropic.com>
Mints a Remote Files use case for streaming files from cloud and remote storage; about 35.9M of smart-open's 57.5M downloads/month is its own after weasel and gensim.
Co-Authored-By: Claude <noreply@anthropic.com>
Mints an Experiment Tracking use case, since General holds modeling libraries; mlflow is its obvious choice at 19,887,934 downloads/month.
Co-Authored-By: Claude <noreply@anthropic.com>
General becomes Argument Parsing for argparse, click, typer, and cyclopts, and prompt_toolkit moves to TUI Frameworks after textual. Redirects the old General URL.
Co-Authored-By: Claude <noreply@anthropic.com>
General held two unrelated tools. tablib moves to Data Formats, and General becomes Binary Formats for pyelftools. Redirects the old General URL.
Co-Authored-By: Claude <noreply@anthropic.com>
General held two unrelated tools. pyfiglet moves to CLI Development > Terminal Rendering as a challenger, and the rest becomes Diffs for difflib. Redirects the old General URL.
Co-Authored-By: Claude <noreply@anthropic.com>
Others mixed three jobs. pdb-like Debugger becomes Debuggers and takes debugpy, a new Web Framework Toolbars holds django-debug-toolbar, django-silk, and flask-debugtoolbar, and icecream joins Tracing. Redirects the two old subcategory URLs.
Co-Authored-By: Claude <noreply@anthropic.com>
18,834,120 downloads/month on pypistats (fetched 2026-11-08), 9x secure; Django REST framework's docs name it as the way to handle CORS.
Co-Authored-By: Claude <noreply@anthropic.com>
78,662,693 downloads/month on pypistats (fetched 2026-11-08), about 24.0M of it its own after subtracting ipykernel, which requires it; VS Code's Python debugging docs tell users to pip install it for remote and attach debugging.
Co-Authored-By: Claude <noreply@anthropic.com>
Comparisons treat dataclasses as the default for class boilerplate and attrs as the upgrade for validators, converters, and slots.
Co-Authored-By: Claude <noreply@anthropic.com>
Split the flat list by job, since demoting bidict left 1 obvious choice and 3 challengers, over the 2-challenger cap. Class Boilerplate: attrs. Mappings: python-box promoted to obvious (5,756,670 downloads/month); bidict demoted to Second Tier, since python-socketio hard-depends on it and accounts for 21.4M of its 23.0M on pypistats, leaving about 1.6M of its own. UUID: uuid-utils, kept on judgment (most of its count comes from langsmith and langchain-core depending on it). Description fixes for attrs, bidict, and python-box. No removals. Figures: ClickPy fetched 2026-11-08 unless marked pypistats (same date).
Co-Authored-By: Claude <noreply@anthropic.com>
Challenger after pyright: 15.7% share in the 2026 Python Typing Survey (up from 10.9% in 2025) and 16.7M downloads/month via ClickPy vs pyrefly's 10.4M. Its only dependency is nodejs-wheel-binaries, so the count is independent demand, and the repo is active (last push 2026-10-28).
Co-Authored-By: Claude <noreply@anthropic.com>
The loguru description broke the Description Style grammar: it lacked an article, used "which" on a restrictive clause, and said "bring ... in" instead of "to".
Co-Authored-By: Claude <noreply@anthropic.com>
The Static Site Generators description used "a software", funcy's entry put "A" before plural "tools", and pyarmor's entry lacked an article.
Co-Authored-By: Claude <noreply@anthropic.com>
The sponsor copy bolded two phrases in the README call to action, repeated tier prices already in the tier headings, repeated one phrase across three Content tiers, and had a double "or" in the Duration line.
Co-Authored-By: Claude <noreply@anthropic.com>
Sponsor links carried no UTM tags, so sponsors saw awesome-python clicks at best as generic referral traffic and could not tell README clicks from website clicks. README sponsor entries now carry utm_source=awesome-python&utm_medium=sponsorship&utm_campaign=sponsor&utm_content=readme, and the website build rewrites utm_content to website for the sponsor band. New sponsor entries in README.md need the same UTM suffix.
Co-Authored-By: Claude <noreply@anthropic.com>
The README sponsor CTA linked to SPONSORSHIP.md, so sponsor-page visits from the README never reached GA4.
Co-Authored-By: Claude <noreply@anthropic.com>
22 entry descriptions ran past the width at which GitHub's README wraps a rendered line onto a second line.
Co-Authored-By: Claude <noreply@anthropic.com>
Replacing framework-independent dogpile.cache with Django-only django-redis removed the shared Redis and Memcached cache use case, and a single Caching group conflated distinct jobs.
Co-Authored-By: Codex <noreply@openai.com>
Faiss indexes vectors and integer IDs rather than storing documents and metadata, so its Database placement contradicted the category definition.
Co-Authored-By: Codex <noreply@openai.com>
Leaked secrets are a supply chain risk that dependency audits don't cover, so Supply Chain Security splits into Dependency Audits and Secret Scanning.
Co-Authored-By: Claude <noreply@anthropic.com>
Pickling arbitrary Python objects is a different job from data formats, so Serialization splits into Data Formats and Object Pickling.
Co-Authored-By: Claude <noreply@anthropic.com>
File type detection is a different job from paths and file watching, and splitting them leaves room for a challenger in each without passing the cap.
Co-Authored-By: Claude <noreply@anthropic.com>
Removed: jev-ultrafast (no PyPI download signal; not published on PyPI): its README calls it an MVP and it needs a hosted API key, so the challenger slot goes to scrapling in the next commit. This overrides the Challenger Exception recorded 2026-10-02.
Co-Authored-By: Claude <noreply@anthropic.com>