Sponsorship tier prices rendered in Cormorant Garamond's default old-style figures, so zeros sat at x-height and the 5 dropped below the baseline, making "$500" hard to read.
Co-Authored-By: Claude <noreply@anthropic.com>
The sponsor band rendered only on the homepage, so visitors who entered on a category page and never opened the homepage saw no sponsors. Category, subcategory, group, and Stdlib pages now show the same band between the hero and the table.
Co-Authored-By: Claude <noreply@anthropic.com>
The sponsor band markup lived inline in index.html, so another page could show it only by copying the markup. The rendered homepage is byte-identical.
Co-Authored-By: Claude <noreply@anthropic.com>
Featured cost $200/month, about twice Indie Dev's $99, yet offered the same text-only README entry and website link, leaving little visible reason to pick it over Indie Dev. Featured now includes a small logo next to its README entry and a logo on the website, and the Get Started content list asks Featured sponsors for a logo.
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>
Mailto clicks on the sponsorship page leave no page view, so the sponsor funnel ended at the sponsorship page and never showed who went on to email. Each click now sends a sponsor_contact event with a short tier value (headline, featured, indie, or general) rather than the link URL, since GA4 caps event parameter values at 100 characters and the Indie Dev mailto href is 101.
Co-Authored-By: Claude <noreply@anthropic.com>
The test ran git init/add/commit with the inherited environment, so under a git hook or `git rebase --exec` (which set GIT_DIR) it committed fixture commits into the real repository and flipped its core.bare to true.
Co-Authored-By: Claude <noreply@anthropic.com>
Picks in a "How to choose" list were plain text, so a reader had to hunt for the tool's row in the table.
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>
Parking a project during a full review left its previous screen-out or rejection active, so incremental scans hid it instead of revisiting it.
Co-Authored-By: Codex <noreply@openai.com>
Seeding an uncertain addition or listed entry as park erased its row kind, so review offered structure actions and exported the wrong verdict.
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>
The guide claimed DiskCache required less effort than every other Python caching library without comparative evidence.
Co-Authored-By: Codex <noreply@openai.com>
The guide claimed Magika never loads a complete file into memory, but the documented guarantee applies to large files.
Co-Authored-By: Codex <noreply@openai.com>
Calling report() and should_prune() alone did not stop an unpromising trial because should_prune() only returns a boolean.
Co-Authored-By: Codex <noreply@openai.com>
The intro recommended jev-ultrafast, which was removed from the list, and missed Scrapling, which took its slot.
Co-Authored-By: Claude <noreply@anthropic.com>
The README split LLM Inference and Serving into Local LLM Inference and LLM Serving, but the intro still grouped MLX LM with vLLM and SGLang and said nothing about Ollama or llama-cpp-python.
Co-Authored-By: Claude <noreply@anthropic.com>
The intro's lead and guide recommended dogpile.cache, which the list no longer carries, and never covered django-redis, which replaced it.
Co-Authored-By: Claude <noreply@anthropic.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>
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>
Local runners (ollama, llama-cpp-python, mlx-lm) and production serving engines (vllm, sglang) answer different needs, and one use case could not hold both at the cap. The old page redirects to LLM Serving.
Co-Authored-By: Claude <noreply@anthropic.com>
The hero-rise fade-in started .hero-copy, which holds the LCP <h1>, at opacity 0, and Chrome ignores opacity-0 paints for LCP, delaying it by about 455 ms.
Co-Authored-By: Claude <noreply@anthropic.com>
`.results-note` carried an inner `max-width: 28rem`, which breaks the rule that `.section-shell` is the only width cap.
Co-Authored-By: Claude <noreply@anthropic.com>
Ruff 0.16 enables 413 default rules (up from 59), so make lint failed with 11 findings, and it treated website/ modules as third-party.
Co-Authored-By: Claude <noreply@anthropic.com>
Redirect stubs for renamed category URLs carried a robots noindex meta, so Search Console filed them under "Excluded by 'noindex' tag" instead of treating the instant meta refresh as a permanent redirect, and the old URLs' ranking was not passed to the new pages.
Co-Authored-By: Claude <noreply@anthropic.com>
The subcategory nearly repeated its section's name, so its page could compete with the section page for the same searches, as Code Analysis did.
Co-Authored-By: Claude <noreply@anthropic.com>
The subcategory shared its section's name, so its page could compete with the section page for the same searches, as Code Analysis did.
Co-Authored-By: Claude <noreply@anthropic.com>
Subcategory titles such as "JWT for Authentication" lacked searchable words, and their boilerplate descriptions never named the listed projects and said "1 projects".
Co-Authored-By: Claude <noreply@anthropic.com>
Every sitemap URL got the build date as lastmod, so all pages claimed a change on each daily deploy, and the sponsorship page used file mtime, which on CI's fresh checkout is also build time.
Co-Authored-By: Claude <noreply@anthropic.com>
The catch-all subcategory shared its section's name, so its page ("Code Analysis for Code Analysis") split the "python code analysis" query with the section page in Search Console.
Co-Authored-By: Claude <noreply@anthropic.com>
Group pages showed only tables, so visitors arriving from broad searches like "python ml library" got none of the which-one-to-pick guidance that each section's intro already gives.
Co-Authored-By: Claude <noreply@anthropic.com>
The NLP intro left gensim out entirely, so readers wanting topic models or word embeddings got no pick even though the README lists it.
Co-Authored-By: Claude <noreply@anthropic.com>