Open-source project
vinta/awesome-python avatar
vinta/awesome-python

Awesome Python is a Markdown file with a build pipeline attached

The definitive list that answers "I want to do X in Python, which tool should I use?"

334,739 stars29,103 forksPythonNOASSERTION

At a glance

What is it?
Awesome Python curates Python frameworks, libraries, and tools across fourteen top level groups, and the website at awesome-python.com is generated from README.md by a uv managed build. It is opinionated by name, and each entry carries a name, a URL, and one clause, so the last mile of your decision is still yours.
Who is it for?
Use Awesome Python when you want to narrow a search to a subsection and confirm you are in the right neighborhood. Do not use it as evidence that an entry is maintained, current, or safe, because no version, license, or release data is recorded per project and there are no releases to pin.
Can I use it commercially?
Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
Is it still maintained?
Yes. The repository received new commits within the last day.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.

From daily snapshots

Star history

  • vinta/awesome-python334,739 ★ · +20,084
Star history
Repository2026-08-182026-11-14
vinta/awesome-python314.7k334.7k

20,084 Stars in the last 88 days, measured from the daily GitHub snapshot. Compare with other projects

Editorial analysis

README.md is the database and website/ is the renderer

There is no library to import here. The product is a Markdown file plus a static site generator that reads it, and the Makefile confirms the shape. `make install` runs `uv sync --locked`, `make build` runs `uv run python website/build.py`, and `make test` runs `uv run pytest website/tests/ -v`. The tree is laid out accordingly, with website/ holding the build script, templates, static assets, and a data directory, and tests sitting under website/tests.

What that means for a reader is that the value is entirely in the curation and nothing executable comes with it. You get a sorted opinion about where to look, and you install the answer yourself from that project's own repository. The site cannot answer a follow-up question, cannot tell you whether an entry still installs on your Python version, and is not exposed as anything queryable. If you were hoping for a resolver that maps a task to a maintained library, this is a page to read. The search and filter interface at awesome-python.com is the only tooling layered on top of the Markdown.

dependencies = [] and a Python 3.14 floor

The manifest declares almost nothing, which is correct for a document, and then adds a floor that only affects contributors:

toml
requires-python = ">=3.14"
dependencies = []

Everything the build needs lives in dependency groups instead:

toml
[dependency-groups]
build = ["httpx2>=2.16.0", "jinja2>=3.1.6", "markdown-it-py>=4.2.0"]
lint = ["ruff>=0.16.10", "ty>=0.0.85"]
test = ["pytest>=9.1.1"]
preview = ["watchfiles>=1.3.0"]

For someone reading the list none of this applies, because you need nothing installed. For someone opening a pull request the 3.14 floor is a real gate, and the type checker is configured against the same version. The gap worth naming is that a list this broad gets read on machines it will never build on, and there is no compatibility matrix and no per entry version data to compensate. An entry is a name, a URL, and one clause of description. Nothing about the Python versions, license, release cadence, or open issues of the listed project is in the record, so the list cannot warn you that an entry has gone stale.

uv.lock and a three day resolution cutoff

Reproducibility is handled tightly, and one setting inside it will surprise you:

toml
[tool.uv]
exclude-newer = "3 days"
no-build = true

`exclude-newer` tells the resolver to ignore anything published in the last three days, which keeps a fresh release from landing mid resolution, and `no-build` stops the toolchain from building packages from source. The lock file is committed, so `uv sync --locked` fails rather than re-resolving, and pip is configured with `only-binary = [":all:"]` to match.

The consequence is a build environment that is deliberately behind the ecosystem. A release published today will not appear in the resolution window, so the build you get is the one approved three days ago rather than the one you just read about on the web. That is the right trade for a site build and the wrong trade if you intended to use this repository as a way to test or track current versions, because a project published this morning can already sit in the README while the tooling still resolves to the previous pin. Nothing in the tree warns you which entries arrived inside that window.

Star counts and download counts come from two different fetchers

Popularity signals are not free, and the Makefile shows they arrive by two separate routes. `make fetch_github_stars` runs `uv run python website/fetch_github_stars.py`, and `make fetch_pypi_downloads` runs `uv run python website/fetch_pypi_downloads_via_clickpy.py`. Two scripts, two sources, and the second one routes PyPI numbers through clickpy rather than querying the index directly.

This is the detail that should shape how much weight you put on the numbers. A star count and a download count are not the same measure, they are not collected at the same moment, and one of them is proxied. Neither number says whether a project is still maintained, so a popular abandoned project and a quiet healthy one can look alike. The README calls itself the #10 most-starred repo on GitHub and advertises sponsor slots from $99/month with a pitch to put your product in front of Python developers. Sponsors appear in their own Sponsors section at the top of the README.

The preview loop watches four paths and serves loopback only

Local development is a watch loop over a small explicit set of inputs. `make preview` depends on `build`, then runs watchfiles against README.md, website/templates, website/static, and website/data, rebuilding with `uv run python website/build.py` on every change, and finally serves the result with `python -m http.server -b 127.0.0.1 -d website/output/ 8000`.

Two consequences follow from those exact paths. The content source is README.md alone, so the Markdown is the only place an edit can go and hand changes to generated HTML in website/output are overwritten on the next rebuild. And the server is bound to 127.0.0.1 on port 8000 with no proxy and no authentication, which is correct for a local loop and means the preview is not something you hand to a colleague or expose on a shared network. Note also what the watch list does cover: templates and the data directory are both in it, so editing a Jinja template or a file in website/data does trigger a rebuild. What is not covered is any new build dependency, which has to be run rather than watched.

Five ty rules promoted to error, and only website/ is checked

Type checking is configured to be unforgiving on purpose, and the rule list is the interesting part:

toml
[tool.ty.rules]
division-by-zero = "error"
possibly-missing-attribute = "error"
possibly-missing-import = "error"
possibly-unresolved-reference = "error"
unused-ignore-comment = "error"

`error-on-warning` is true in the terminal settings, so a warning fails the check, and `make typecheck` scopes it to `uv run ty check website`. Linting is `make lint` running `uv run ruff check .`, formatting is `make format` running `uv run ruff format .`, and the ruff line-length is 200.

What this buys is a build script that cannot silently divide by zero or carry a dead import suppression, which matters for a job that fetches remote data and renders it. What it does not buy is confidence about the list. The checker sees Python inside website/, not the projects described in the Markdown, so a broken URL, a renamed category anchor, or an entry that no longer resolves is outside what the type checker covers. The strictness is inward facing.

No releases, version 0.1.0, and no state you can pin

The repository has no GitHub releases, the version in pyproject.toml is 0.1.0, and the default branch is master. The last push was 2026-11-02, so the list is edited continuously, and that combination removes the one thing people tend to assume an awesome list has: a version you can point at.

For a reader the effect is mild, since you are after the current opinion and six months of staleness is not the failure mode anyone fears from a link list. For anyone building on top of it the absence is concrete. There is no tagged snapshot to archive, no changelog of what was recommended and when, and no way to diff two points in time to see which entries were added, dropped, or quietly re-pointed. If a tool you adopted vanishes from the list you cannot tell whether it was abandoned, superseded, or removed as a duplicate, because there is no changelog among the top-level files. They include docs/, CONTRIBUTING.md, CODE_OF_CONDUCT.md, DESIGN.md, AGENTS.md, CLAUDE.md, and SPONSORSHIP.md.

Fourteen groups, and the taxonomy is descriptive not comparative

Structure is a two level taxonomy, and the group names do most of the navigation work on a page this long. AI and ML splits into AI and Agents, Deep Learning, Machine Learning, Natural Language Processing, Computer Vision, and Recommender Systems. Web Development carries eleven subsections running from Web Frameworks through Static Site Generators. Data and Science puts Quantum Computing next to Data Analysis and Geolocation, and Security covers Cryptography, Penetration Testing, Supply Chain Security, and Web Security. Under AI and Agents, entries break down further into Agent Skills, Orchestration, Vendor Agent SDKs, Model Context Protocol, Personal Assistants, Prompt Optimization, and Data Layer, among others.

The taxonomy is descriptive rather than comparative, and that is its limit. There is no compatibility matrix, no benchmark column, and no guidance on which of two entries in one subsection you should pick. langgraph is a low level orchestration framework for stateful long running LLM agents and crewAI is a framework for orchestrating role playing autonomous agents, which tells you what each one is and not which one your problem needs. The categories narrow the search and a single clause confirms you are in the right place, and the choice is still yours to make from each project's own documentation.

Editorial conclusion

Use Awesome Python when you want to narrow a search to a subsection and confirm you are in the right neighborhood. Do not use it as evidence that an entry is maintained, current, or safe, because no version, license, or release data is recorded per project and there are no releases to pin. Before you commit to a dependency it points at, check that project's own repository, its last release, and its issue tracker, and read SPONSORSHIP.md so you know placement in the list is something that can be bought.

Frequently asked questions

what is awesome python

It is an opinionated guide to the best Python frameworks, libraries, and tools, kept by Vinta Chen and browsable at awesome-python.com, where you can search and filter more easily. The README groups entries under top level categories and named subsections, from AI and Agents through Security and Miscellaneous.

Is Awesome Python free to use?

The package manifest declares the license as MIT, and the deliverable is a public static site plus a Markdown file rather than a paid service. Sponsorship is handled separately: the README advertises sponsor slots from $99/month and invites companies to put a product in front of Python developers.

How do I build the Awesome Python website locally?

Run `uv sync --locked` to install the toolchain, `uv run python website/build.py` to build, and `make preview` to rebuild on change while serving website/output on 127.0.0.1 port 8000. The preview watches README.md, website/templates, website/static, and website/data.

Does Awesome Python publish releases I can pin to?

The repository has no GitHub releases, and the version in pyproject.toml is 0.1.0 on a master default branch. The last push was 2026-11-02, so there is no tagged list state to archive or diff against.

How many projects does Awesome Python list?

Entries appear as a name, a URL, and a short description, grouped by subsection. Popularity figures are fetched separately for GitHub stars and PyPI downloads by two distinct scripts.

Official sources

  1. Official documentation
  2. Official README
  3. Project repository
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/vinta-awesome-python.svg)](https://hysenlabs.com/projects/vinta-awesome-python)

Star history chart for your README

markdown
[![Star history](https://hysenlabs.com/chart/vinta-awesome-python.svg)](https://hysenlabs.com/projects/vinta-awesome-python)

Was this useful?