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>
Removed: dogpile.cache (about 1.9M downloads/month on ClickPy, 2026-10-16, down from 2.67M a year earlier): falling demand, and its slot goes to django-redis in the next commit.
Co-Authored-By: Claude <noreply@anthropic.com>