Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
110 commits
Select commit Hold shift + click to select a range
c102649
feat: serve redirect stubs for renamed and dissolved category slugs
vinta Sep 26, 2026
a74ca52
feat: render per-category intro text above the entry list
vinta Sep 26, 2026
5b9bc45
docs: require a redirect entry when an audit renames or dissolves a c…
vinta Sep 26, 2026
8ea48cb
build: add Claude Code launch config for website preview
vinta Sep 26, 2026
fd300c4
docs: add Testing category intro
vinta Sep 26, 2026
7d19f84
docs: add Data Validation category intro
vinta Sep 26, 2026
ec54348
docs: add CLI Development category intro
vinta Sep 26, 2026
b71151a
docs: add Computer Vision category intro
vinta Sep 26, 2026
3870b0a
docs: add Audio & Video Processing category intro
vinta Sep 26, 2026
1dfa958
docs: add GUI Development category intro
vinta Sep 26, 2026
17bb627
docs: add AI and Agents category intro
vinta Sep 26, 2026
4d2c990
docs: rewrite GUI Development category intro
vinta Sep 26, 2026
2cc1bb4
docs: rewrite ORM category intro
vinta Sep 26, 2026
00915b0
docs: trim ai-and-agents how-to-choose list to 12 items
vinta Sep 26, 2026
eaddf94
docs: drop links from gui-development how-to-choose list
vinta Sep 26, 2026
eb51124
refactor: extract category table row markup into entry_rows macro
vinta Sep 26, 2026
b3fe53b
fix: stop tracking .claude/launch.json
vinta Sep 26, 2026
9cc721f
fix: match category meta titles to search query word order
vinta Sep 26, 2026
528f9ed
fix: expose entry description rows to screen readers
vinta Sep 26, 2026
2b9469c
feat: group category page rows by use case, restructure intro
vinta Sep 26, 2026
d5febbe
docs: document category page group rows and guide band
vinta Sep 26, 2026
4813374
Merge branch 'feature/category-redesign' into feature/seo-redesign
vinta Sep 26, 2026
2930319
docs: add CMS category intro
vinta Sep 26, 2026
5216fb3
docs: add Image Processing category intro
vinta Sep 26, 2026
a9bb827
docs: add Code Analysis category intro
vinta Sep 26, 2026
88cfcf6
docs: rewrite Computer Vision category intro
vinta Sep 26, 2026
3c2afa1
docs: rewrite Audio & Video Processing category intro
vinta Sep 26, 2026
ee2874a
docs: rewrite Testing category intro
vinta Sep 26, 2026
c52f21f
docs: rewrite CLI Development category intro
vinta Sep 26, 2026
e5088a6
docs: rewrite Data Validation category intro
vinta Sep 26, 2026
62a4e7c
fix: make tags link to category pages instead of filtering in place
vinta Sep 26, 2026
5291591
feat: link section use-case headings to their subcategory pages
vinta Sep 26, 2026
f684507
Merge branch 'feature/tag-navigation' into feature/seo-redesign
vinta Sep 26, 2026
ef00fe3
fix: restore hidden group headings when navigating to a jump link
vinta Sep 26, 2026
77b1b70
fix: hide use-case and page tags that repeat the group heading
vinta Sep 26, 2026
eddc053
Merge branch 'feature/hide-repeated-tags' into feature/seo-redesign
vinta Sep 26, 2026
adea599
docs: add file format processing category intro
vinta Sep 26, 2026
fd40096
docs: add text processing category intro
vinta Sep 26, 2026
9e8e38e
docs: add web scraping category intro
vinta Sep 26, 2026
432a25e
docs: add Game Development category intro
vinta Sep 26, 2026
e2308c0
docs: add Date and Time category intro
vinta Sep 26, 2026
4d09bcb
docs: add Implementations category intro
vinta Sep 26, 2026
80958eb
docs: add deep learning category intro
vinta Sep 26, 2026
579ea6b
docs: add machine learning category intro
vinta Sep 26, 2026
7451333
docs: add natural language processing category intro
vinta Sep 26, 2026
3c05cd6
docs: add web frameworks category intro
vinta Sep 26, 2026
d450705
docs: add web APIs category intro
vinta Sep 26, 2026
10a7f12
docs: add web servers category intro
vinta Sep 26, 2026
cabd05e
docs: add WebSocket category intro
vinta Sep 26, 2026
d7c7093
docs: add template engines category intro
vinta Sep 26, 2026
8b04838
docs: add web asset management category intro
vinta Sep 26, 2026
f511780
docs: add website design conventions to project instructions
vinta Sep 26, 2026
2e7816c
docs: require read-only checks for listed-project admission
vinta Sep 26, 2026
557e91d
Merge branch 'docs/promote-memory-rules' into feature/seo-redesign
vinta Sep 26, 2026
12e4fc4
docs: add Data Visualization category intro
vinta Sep 26, 2026
08f0718
docs: add Data Ingestion / ETL category intro
vinta Sep 26, 2026
06c39e9
docs: add HTTP Clients category intro
vinta Sep 26, 2026
bc590c6
docs: add Admin Panels category intro
vinta Sep 26, 2026
2d9b988
docs: add Package Management category intro
vinta Sep 26, 2026
da7c0b7
docs: add Distributed Computing category intro
vinta Sep 26, 2026
4e02070
docs: add Task Queues category intro
vinta Sep 27, 2026
d7f7fe0
docs: add Cryptography category intro
vinta Sep 27, 2026
b5846d7
docs: add Database Drivers category intro
vinta Sep 27, 2026
6348d5f
docs: add Static Site Generators category intro
vinta Sep 27, 2026
1ac5fdc
add Quantum Computing category intro
vinta Sep 27, 2026
2f9a8d4
add Build Tools category intro
vinta Sep 27, 2026
e54c721
docs: add Asynchronous Programming category intro
vinta Sep 27, 2026
5cb69a9
docs: add Functional Programming category intro
vinta Sep 27, 2026
0d72391
docs: add Email category intro
vinta Sep 27, 2026
14cfa54
docs: add Geolocation category intro
vinta Sep 27, 2026
c0190bd
docs: add Debugging Tools category intro
vinta Sep 27, 2026
9236dde
docs: add Package Repositories category intro
vinta Sep 27, 2026
7ecaa4f
docs: add Science category intro
vinta Sep 27, 2026
25bf3d6
docs: add Caching category intro
vinta Sep 27, 2026
646d3f3
docs: add Data Analysis category intro
vinta Sep 27, 2026
a942b13
docs: drop closing Package Management link from build-tools intro
vinta Sep 27, 2026
ffcdff3
docs: name Mem0's license by family in ai-and-agents intro
vinta Sep 27, 2026
ae6d0ac
docs: name Mutagen's license by family in audio-video-processing intro
vinta Sep 27, 2026
5b80c4e
fix: point description cross-reference links at category pages
vinta Sep 27, 2026
8d6109a
Merge branch 'fix/description-category-links' into feature/seo-redesign
vinta Sep 27, 2026
7fa334e
sync rules
vinta Sep 27, 2026
06d53f6
docs: restore Build Tools guide's closing pointer to Package Management
vinta Sep 27, 2026
c358eb5
docs: add Database category intro
vinta Sep 27, 2026
f22f7ff
docs: add Logging category intro
vinta Sep 27, 2026
c6c6684
docs: add Authentication category intro
vinta Sep 27, 2026
dfe5052
docs: add Interactive Interpreter category intro
vinta Sep 27, 2026
f560c19
docs: add Configuration Files category intro
vinta Sep 27, 2026
1ad8d9d
docs: add Job Schedulers category intro
vinta Sep 27, 2026
a548436
docs: add CLI Tools category intro
vinta Sep 27, 2026
03d5199
docs: add Hardware category intro
vinta Sep 27, 2026
494092e
docs: add Serialization category intro
vinta Sep 27, 2026
fa22df7
docs: add Messaging category intro
vinta Sep 27, 2026
219fb43
docs: add Recommender Systems category intro
vinta Sep 27, 2026
35b5a50
docs: add Search category intro
vinta Sep 27, 2026
cac4828
docs: add Documentation category intro
vinta Sep 27, 2026
7846e7a
docs: add HTML Manipulation category intro
vinta Sep 27, 2026
e9dbd87
docs: add Environment Management category intro
vinta Sep 27, 2026
03604c4
docs: add DevOps Tools category intro
vinta Sep 27, 2026
7d74a36
docs: add File Manipulation category intro
vinta Sep 27, 2026
a1a1f01
docs: add ERP category intro
vinta Sep 27, 2026
28fb6af
docs: add Penetration Testing category intro
vinta Sep 27, 2026
eca97d8
docs: add Algorithms and Design Patterns category intro
vinta Sep 27, 2026
b7e68cd
docs: add Microsoft Windows category intro
vinta Sep 27, 2026
64d74fa
docs: add Distribution category intro
vinta Sep 27, 2026
046c75a
docs: add Web Security category intro
vinta Sep 27, 2026
8977f4c
docs: add Miscellaneous category intro
vinta Sep 27, 2026
9627a14
docs: add Network Virtualization category intro
vinta Sep 27, 2026
5516521
docs: add Supply Chain Security category intro
vinta Sep 27, 2026
79f7390
docs: add Built-in Classes Enhancement category intro
vinta Sep 27, 2026
ae3e309
Merge branch 'feature/category-page-redesign'
vinta Sep 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude/skills/audit-the-list/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ Run the `preview-verdicts` skill: it generates the interactive review page and d

## 5. Execute

One commit per section: body lists each removal with its reason and downloads figure; restructures, tier moves, and reorders ride the same commit. Format-only outcomes (no removals) are a single style commit. `make test` before every commit, `make build` after the last one. Generic commit helpers tend to split a section audit into structural and per-subcategory commits — if that happens, squash back to one commit per section. Done when the tree is clean, tests passed before each commit, and the build count reconciles with the adjudicated changes.
One commit per section: body lists each removal with its reason and downloads figure; restructures, tier moves, and reorders ride the same commit. A restructure that renames or dissolves a category or subcategory adds `"old path": "new path"` to `website/data/redirects.json` in that commit, so the old URL keeps its search ranking; the build fails when a redirect target no longer exists, so a later rename also updates the entries pointing at the renamed path. Format-only outcomes (no removals) are a single style commit. `make test` before every commit, `make build` after the last one. Generic commit helpers tend to split a section audit into structural and per-subcategory commits — if that happens, squash back to one commit per section. Done when the tree is clean, tests passed before each commit, and the build count reconciles with the adjudicated changes.

## 6. Record

Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ __pycache__/
website/output/
website/data/*
!website/data/pypi_name_overrides.json
!website/data/redirects.json
!website/data/category_intros/

# agents
.playwright-cli/
Expand Down
8 changes: 8 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,15 @@ An opinionated guide to the best Python frameworks, libraries, and tools.
[CONTRIBUTING.md](CONTRIBUTING.md) holds the admission rules, quality requirements, rejection rules, entry format, and ordering. Apply it whenever adding or removing an entry — direct commits included, not only PR reviews.

- Every keep/drop reason must be verified against current online data at decision time — download counts, repo activity and archived status, PyPI metadata, project docs. Judging tiers — obvious choice vs challenger — also requires WebSearch evidence (adoption trajectory, community sentiment), not download counts alone. Training-data recollections are not evidence; label anything unverifiable as a judgment call.
- Checks stay read-only: judge whether a listed project installs or works from its PyPI metadata (`requires_python`, classifiers, wheel tags) and issue tracker, never by installing or running it, since that runs untrusted code.
- A download count is not automatically independent demand. When one listed entry depends on another, check `requires_dist` on PyPI before citing the depended-on entry's count: mkdocs-material hard-depends on mkdocs, so mkdocs' figure exceeded mkdocs-material's by only about one percent and nearly all of it was mkdocs-material pulling it in.
- One entry per commit when adding or deleting entries. Exceptions: a prune sweep is one commit per section, its body listing each removal with its reason; format, wording, or categorization changes may be bundled. Cross-section re-homes ride the originating audit's commit (both sides of the move in one diff).
- Resources sections are not project entries: out of audit scope, and the website never parses them.
- Sponsor placement never influences which projects get listed — see [SPONSORSHIP.md](SPONSORSHIP.md).

## Website

- Model the layout on https://www.placestoread.xyz: the whole list on one page, dense rows, a row that expands inline with its content aligned to the Name column, sorting by column headers, full-text search, tags that filter, a divider under the header row instead of a strong top border, a solid dark footer, and minimal decoration. Keep that model (no card grid, modal details, or pagination) unless the maintainer asks, and keep green out of the palette.
- `.section-shell` (`--shell-max: 84rem`) is the only width cap: sections, tables, rows, CTAs, and paragraphs stay uncapped, since the maintainer reads on wide screens and prose-width advice like 65-75ch doesn't apply. Remove inner `max-width` rules you come across, and ask with a concrete reason before adding one.
- Pick font sizes one step larger than feels right (`--text-base` over `--text-sm`, 1.75rem over 1.5rem for a heading), and shrink an existing size only when the maintainer asks: they asked for bigger type 11 times across 8 sessions and never for smaller.
- When you style one link, tag, or label, give its peers the same style in the same change: hero, nav, footer, project, and sponsor links share hover styles, and tag variants build on `.tag`.
8 changes: 8 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,15 @@ An opinionated guide to the best Python frameworks, libraries, and tools.
[CONTRIBUTING.md](CONTRIBUTING.md) holds the admission rules, quality requirements, rejection rules, entry format, and ordering. Apply it whenever adding or removing an entry — direct commits included, not only PR reviews.

- Every keep/drop reason must be verified against current online data at decision time — download counts, repo activity and archived status, PyPI metadata, project docs. Judging tiers — obvious choice vs challenger — also requires WebSearch evidence (adoption trajectory, community sentiment), not download counts alone. Training-data recollections are not evidence; label anything unverifiable as a judgment call.
- Checks stay read-only: judge whether a listed project installs or works from its PyPI metadata (`requires_python`, classifiers, wheel tags) and issue tracker, never by installing or running it, since that runs untrusted code.
- A download count is not automatically independent demand. When one listed entry depends on another, check `requires_dist` on PyPI before citing the depended-on entry's count: mkdocs-material hard-depends on mkdocs, so mkdocs' figure exceeded mkdocs-material's by only about one percent and nearly all of it was mkdocs-material pulling it in.
- One entry per commit when adding or deleting entries. Exceptions: a prune sweep is one commit per section, its body listing each removal with its reason; format, wording, or categorization changes may be bundled. Cross-section re-homes ride the originating audit's commit (both sides of the move in one diff).
- Resources sections are not project entries: out of audit scope, and the website never parses them.
- Sponsor placement never influences which projects get listed — see [SPONSORSHIP.md](SPONSORSHIP.md).

## Website

- Model the layout on https://www.placestoread.xyz: the whole list on one page, dense rows, a row that expands inline with its content aligned to the Name column, sorting by column headers, full-text search, tags that filter, a divider under the header row instead of a strong top border, a solid dark footer, and minimal decoration. Keep that model (no card grid, modal details, or pagination) unless the maintainer asks, and keep green out of the palette.
- `.section-shell` (`--shell-max: 84rem`) is the only width cap: sections, tables, rows, CTAs, and paragraphs stay uncapped, since the maintainer reads on wide screens and prose-width advice like 65-75ch doesn't apply. Remove inner `max-width` rules you come across, and ask with a concrete reason before adding one.
- Pick font sizes one step larger than feels right (`--text-base` over `--text-sm`, 1.75rem over 1.5rem for a heading), and shrink an existing size only when the maintainer asks: they asked for bigger type 11 times across 8 sessions and never for smaller.
- When you style one link, tag, or label, give its peers the same style in the same change: hero, nav, footer, project, and sponsor links share hover styles, and tag variants build on `.tag`.
5 changes: 4 additions & 1 deletion DESIGN.md
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ Hard-won sizing rules (do not relax):
Depth comes from **tonal layers**, not heavy shadows.

- The page is a quiet warm canvas (`--bg-page`). The content shell is slightly brighter paper (`--bg-paper`). The sponsor band, CTA backgrounds, and inline decorative blocks step up to `--bg-paper-strong`.
- The hero is the one place that uses real atmosphere: subtle grid, slow sheen, warm radial gradients on a dark earthy ground (`--hero-bg-start` → `--hero-bg-mid` → `--hero-bg-end`). The sheen and any other motion respect `prefers-reduced-motion`.
- The hero and the category guide band are the only places with real atmosphere: warm gradients on a dark earthy ground (`--hero-bg-start` → `--hero-bg-mid` → `--hero-bg-end`). Only the hero adds the subtle grid and slow sheen. The sheen and any other motion respect `prefers-reduced-motion`.
- The footer is a single tonal block in `--footer-bg`, no internal gradients.
- Two depth treatments are allowed and only these two. The search input combines a 1px inset highlight (`--search-inset`) with a soft warm drop shadow (`--search-shadow`, intensified by `--search-focus-shadow` on focus). The primary CTA button (`.hero-action-primary`) carries a warm drop shadow for press affordance. Both shadows are soft, warm-tinted, and tied to interactive elements. No new drop shadows on cards, panels, rows, or static decoration.
- No glassmorphism as default decoration.
Expand All @@ -160,8 +160,11 @@ The shape language is overwhelmingly **pill on small, zero radius on large**.
The component vocabulary is small and table-led. Source of truth: `website/static/style.css`.

- **Table-driven index** (the hero of the page). Sticky header, sortable columns, click-to-expand rows that indent under the Name column. Modeled on placestoread.xyz. Not a card grid.
- **Group rows**. Section, subcategory, and group pages list rows in README order. Section pages add one H2 row per use case; group pages add one per section, linking to that section's page. A note replaces the sort arrow until someone sorts a column, which flattens the list and hides the group rows.
- **Filter tags** (`.tag`). `--accent-soft` background with `--accent-deep` text. Pill shape. Hover swaps to `--highlight` background with `--tag-hover-border` border and ink text. Active state uses the warm `--tag-active-start` → `--tag-active-end` gradient with hero-ink text. Tag variants (`tag-group`, `tag-source`) inherit the base `.tag` style today and differ only at narrow widths (`tag-group` hides under 960px). Add a new variant only when a real visual difference is needed.
- **Hero**. Magazine-cover headline, dark earthy ground, kicker and proof microcopy, primary CTA button using `--hero-btn-start` / `--hero-btn-end`. Subtle grid plus slow sheen. Respects `prefers-reduced-motion`.
- **Jump links**. One per use case in a category hero, plus one for the guide. Underlined like the intro's links, with a trailing ↓. Never tag-styled: tags filter the table or open another page, jump links only scroll.
- **Guide band**. Everything in a category intro after its "How to choose" list. It sits below the table on the hero's dark gradient, with its H2 above the text.
- **Sponsor band**. Sits in the README header on `--bg-paper-strong`. Editorial layout, not a logo wall. Sponsor links share the global accent treatment.
- **CTA**. Warm `--cta-bg`, full-bleed within shell. The button itself uses accent tokens.
- **Footer**. Dark warm charcoal, part of the same system. Footer links share the global hover and focus treatment.
Expand Down
Loading
Loading