Honestkit — small, honest tools.
No tracking, no signup. Browser extensions that ask for as little access as possible, free converters that run entirely in your browser, and pay-per-result data tools.
Chrome extensions
- PlainHeaders — Add, change or remove HTTP request & response headers. Open source, no tracking, access only to sites you choose.
- PlainTables — Copy any web table to Excel, Google Sheets, CSV or Markdown in one click. No row limits, no account, no tracking.
- MDGrab — Turn any article or selection into clean Markdown for Obsidian, notes or LLM prompts. No signup, no limits, no tracking.
- PlainLinks — Extract every link on a page or selection: dedupe, filter by text or regex, copy or export to CSV/XLSX. No tracking.
- PlainInspect — Hover any text to see its font, size, weight and colors. See every font and color a page uses. No tracking.
Free in-browser tools
- DNS lookup + SPF, DMARC & MX checker — Look up a domain's A, AAAA, CNAME, MX, NS, TXT, CAA and SOA records and check its email setup: MX present, one valid SPF record, DMARC policy. Paste a domain, URL or email address.
- HTML table to CSV / TSV / Markdown — Paste HTML and convert every table to CSV, TSV (for Excel / Google Sheets), Markdown or XLSX. Handles colspan and rowspan. Runs entirely in your browser.
- Markdown table to Excel / CSV — Paste a Markdown table (or a whole README) and get CSV, TSV to paste into Excel or Google Sheets, or a real .xlsx file. Strips **bold**, `code` and link syntax, unescapes \|. Runs entirely in your browser.
- Excel / CSV to JSON converter — Paste cells from Excel or Google Sheets (or CSV) and get a JSON array of objects, with numbers and TRUE/FALSE typed, empty cells as null, and optional nesting of address.city-style headers. Runs entirely in your browser.
- robots.txt tester — Paste a robots.txt and a list of URLs: see which are allowed or blocked for any user agent, and which rule decides, using Google's matching rules (longest match, Allow wins ties, * and $). Runs in your browser.
- hreflang checker — Paste a page's HTML (or its hreflang link tags, or sitemap xhtml:link entries) and check every hreflang: valid language and country codes, absolute URLs, x-default, self-reference and duplicates. Runs entirely in your browser.
- CSV to SQL INSERT converter — Paste CSV or cells from Excel and get a CREATE TABLE plus batched INSERT statements with inferred column types, NULLs for empty cells and correct quoting per database. Runs entirely in your browser.
- XML to CSV / Excel converter — Paste XML (an export, RSS feed, sitemap or API response) and get one row per repeating element as CSV, TSV, Markdown or .xlsx. Attributes, nested and repeated elements become columns. Runs entirely in your browser.
- Compare two lists — Paste two lists (emails, SKUs, names, URLs, a column from Excel) and see what is only in the first, only in the second, and in both. Ignores case and spaces if you want. Runs entirely in your browser.
- JWT decoder (local) — Decode a JSON Web Token's header and payload in your browser, with iat / nbf / exp shown as UTC dates and an expiry check. The token never leaves the page: no server, no analytics. Accepts a pasted Authorization: Bearer header.
- Transpose CSV — Swap the rows and columns of a CSV or TSV: the first column becomes the header row. Quoted fields with commas or line breaks are kept intact and short rows are padded. Copy, or download CSV / .xlsx. Runs in your browser.
- Split CSV file — Split a large CSV into smaller files: every N rows, or one file per value of a column (e.g. one per region). Each part keeps the header row; download all parts as one .zip. Runs entirely in your browser.
- Merge CSV files — Combine several CSV files into one: columns are matched by header name even when the order differs, missing columns stay empty, and a source_file column records where each row came from. Runs entirely in your browser.
- CSP & security headers generator — Build a strict Content-Security-Policy plus HSTS, X-Frame-Options, Referrer-Policy, Permissions-Policy and nosniff, and export as raw headers, nginx, Apache, Netlify/Cloudflare _headers, Express or a meta tag.
- curl to fetch / Python / axios — Paste a curl command (e.g. from DevTools “Copy as cURL”) and get equivalent JavaScript fetch(), Python requests or Node axios code. Headers, JSON and form bodies, -G query data, multipart -F uploads, basic auth and cookies handled.
- JSON to Markdown table — Paste a JSON array or API response and get a GitHub-flavored Markdown table. Nested objects become dot-notation columns; missing keys are left blank. Runs entirely in your browser.
- JSON to CSV / Excel — Paste a JSON array (or an API response) and convert it to CSV, TSV, Markdown or XLSX. Nested objects become dot-notation columns. Runs entirely in your browser.
- Excel / Google Sheets to Markdown table — Copy cells in Excel or Google Sheets, paste them here and get a GitHub-flavored Markdown table (or HTML table). Pipes and line breaks in cells are handled. Runs entirely in your browser.
- Markdown table formatter — Paste a messy Markdown table (or a whole Markdown file) and get evenly padded, aligned columns. Keeps :--- / :---: / ---: alignment, escaped pipes and inline code. Runs entirely in your browser.
- CSV to Markdown table — Paste CSV, TSV or semicolon-separated data and get a GitHub-flavored Markdown table or a clean HTML table. Quotes, commas and line breaks inside cells are handled. Runs entirely in your browser.
- HTML to Markdown converter — Convert HTML to clean Markdown: headings, paragraphs, links, lists, code blocks, bold/italic and GitHub-flavoured tables. Runs locally in your browser.
- Markdown to HTML converter — Convert Markdown to clean HTML: headings, lists (nested), links, images, code blocks, blockquotes, GitHub tables and strikethrough. Raw HTML is escaped by default. Runs in your browser.
- Extract links from HTML — Paste HTML and extract every link with its anchor text, rel and target. Dedupe, filter by text or regex, resolve relative URLs and export CSV. Runs in your browser.
- UTM link builder (single & bulk) — Add utm_source, utm_medium, utm_campaign, utm_term and utm_content to one link or a whole list. Keeps existing query parameters and #fragments, replaces old UTM values, exports CSV. Runs in your browser.
- URL parser, encoder & decoder — Paste a URL to see protocol, user, host (punycode and Unicode), port, path, every query parameter (duplicates kept) and the #fragment. Percent-encode or decode text three ways, with clear errors for bad escapes.
- Sitemap.xml generator from URL list — Paste a list of URLs and get a valid sitemap.xml: duplicates removed, invalid and relative URLs flagged, special characters XML-escaped, optional lastmod, changefreq and priority, auto-split over 50,000 URLs.
- HTTP header parser & converter — Paste raw HTTP request headers (or a curl command, or JSON) and convert them to a JSON object, curl -H flags, a fetch() headers object or a Python requests dict.
- Color contrast checker (WCAG) — Check the WCAG 2.x contrast ratio of a text and background color, see AA / AAA pass or fail for normal text, large text and UI components, and get the nearest passing color. Hex, rgb() and hsl().
- Color palette to CSS variables / Tailwind — Paste a list of hex colors (optionally named) and get CSS custom properties, SCSS variables, a Tailwind v4 @theme block, a Tailwind v3 config or JSON tokens.
Guides
- How to check every URL in a sitemap for errors — Find broken (404), redirected and erroring URLs in your sitemap.xml with a short shell loop, what to fix for each status code, and how to check large or nested sitemaps.
- How to check a domain's age and expiry date (free WHOIS / RDAP API) — Find when a domain was registered, when it expires and who the registrar is, for free with RDAP, the JSON successor of WHOIS: curl and Python examples, bulk lookups, and the TLDs that publish no dates.
- How to take a full-page screenshot of a website — Capture an entire scrolling web page as one image: Chrome and Edge DevTools' built-in full-size screenshot, Firefox's Save full page, a one-line Playwright command, and bulk screenshots of many URLs.
- How to extract text from PDFs (command line, Python and API) — Turn PDFs into plain text for search, analysis or LLM pipelines: pdftotext on the command line, pypdf in Python, page ranges and layout mode, reading metadata, and why scanned PDFs return nothing without OCR.
- How to find broken links on a website (free) — Check a whole website for broken links for free: a one-line wget spider, a tested Python script that also shows which page links to each broken URL, and how to handle 404s, redirects and false alarms.
- How to find all pages on a website — List every page of a website for free: read its sitemap.xml, crawl its links with wget, and compare the two lists to find pages missing from the sitemap and orphan pages. Why one method alone misses pages, with a tested example.
- How to check if a page is noindex (meta robots, X-Robots-Tag, robots.txt) — Find out why a page is not indexed: check the meta robots tag, the X-Robots-Tag header and robots.txt with two tested scripts, plus the robots.txt + noindex trap and a Python robotparser pitfall that reports every URL as blocked.
- How to check the meta tags of any website — See a page's title, meta description, canonical, robots, Open Graph and Twitter card tags in seconds: a tested browser-console snippet, a curl check of what social previews see, and what to fix.
- How to check Core Web Vitals (one page or many) — Check Core Web Vitals for free: what PageSpeed Insights shows, lab vs real-user data, the passing thresholds, and a tested Lighthouse script that writes LCP, CLS and blocking time for a list of URLs to CSV.
- How to convert an HTML table to CSV in Python — A dependency-free Python script that downloads a page, finds every table and writes the one you pick as CSV, with the output from a real Wikipedia table, its limits, and no-code alternatives.
- How to check a website's HTTP status code — Get the HTTP status code of a URL with one curl command, check a whole list into a spreadsheet-ready TSV, and read what 000, 3xx, 4xx and 5xx mean.
- How to convert JSON to CSV in Python — A standard-library Python script that turns a JSON array (or an API response) into CSV, flattens nested objects into address.city-style columns, and handles missing keys, with real output and its limits.
- How to export App Store reviews to CSV — Download up to 500 recent reviews per country for any iPhone app into a CSV file with a dependency-free Python script, including the retry Apple's review feed needs, tested on a real app.
- How to convert CSV to JSON in Python — A standard-library Python script that converts CSV to a JSON array of objects, auto-detects comma/semicolon/tab, types numbers and true/false, keeps ids with leading zeros as text and rebuilds nested objects from address.city headers.
- How to convert HTML to Markdown in Python — Which Python library converts HTML to Markdown best? markdownify and html2text compared on MDN and Wikipedia pages (code blocks, tables, links), plus a ready script that keeps only the article and fixes relative links.
- How to block AI crawlers (GPTBot, ClaudeBot, …) with robots.txt — Copy-paste robots.txt rules that block AI training and AI search crawlers (OpenAI, Anthropic, Google-Extended, Apple, Common Crawl, Perplexity, ByteDance, Meta, Amazon) while Google and Bing keep crawling, verified with two parsers.
- How to convert XML to CSV in Python — A standard-library Python script that turns repeating XML elements (RSS items, sitemap URLs, export records) into CSV rows, with attributes, nested and repeated elements as columns and namespaces handled. Tested on real feeds.
- How to import a CSV into SQLite with Python — Load a CSV file into an SQLite table with Python's built-in sqlite3 and csv modules: column types inferred from the data, empty cells as NULL, leading-zero ids kept as text, parameterized inserts. Tested on real data.
- How to split a CSV into multiple files in Python — A standard-library Python script that splits a CSV every N rows or into one file per value of a column, keeps the header in every part, never cuts a quoted line break, and makes safe file names.
- How to merge CSV files in Python — A standard-library Python script that merges many CSV files into one, matches columns by header name even when the order or case differs, keeps columns only some files have, and adds a source_file column.
- How to compare two lists in Excel — Two COUNTIF formulas that mark which items of one Excel list are missing from another and which appear in both, how to filter or highlight them, the case-insensitivity catch, and a no-formula alternative.
- How to remove duplicate lines (Linux, bash, Python) — Remove duplicate lines from a text file on Linux or macOS: sort -u, the order-preserving awk one-liner, case- and space-insensitive dedupe, counting and listing duplicates with uniq, and a Python one-liner, with real outputs.
- Content-Security-Policy header examples (nginx, Apache, HTML) — A working Content-Security-Policy example for nginx, Apache and an HTML meta tag, verified on real servers, plus how to check it with curl and roll it out in report-only mode first.
- How to check a redirect chain — See every hop of a redirect chain with one curl command, check a list of URLs for hops and final destination, avoid the HEAD-request pitfall, and fix chains so each old URL redirects in one step.
- How to get a company name from a domain — Turn a list of domains into company names for free: read the name a site publishes about itself (schema.org Organization, og:site_name, title) with a tested Python script, and why WHOIS rarely helps.
- How to check SPF and DMARC records (command line) — Check a domain's SPF and DMARC records from the command line with dig or nslookup, read what each part means, and count SPF DNS lookups against the limit of 10 with a tested Python script.
- How to export Bluesky posts to CSV (any public profile) — Download all posts of any public Bluesky profile as CSV with the free public API (no account, no app password): a tested Python script with likes, reposts, replies and links, reply threads, and a full account backup.
- How to get Steam reviews as JSON (appreviews API) — Download Steam user reviews for any game with Steam's public appreviews endpoint: no API key, cursor paging, language and filter options, review score totals, and the fields you get (playtime, votes, thumbs up/down).
- How to verify an email list (free checks first) — Clean an email list before you send: what free checks catch (bad syntax, dead domains, null MX, disposable and role addresses, typos like gmial.com), a shell script for MX checks, and why mailbox (SMTP) checks are unreliable.
- How to find out what technology a website uses — Find out which CMS, JavaScript framework, hosting, CDN and analytics a website uses: read the HTTP headers and page source yourself, use a detector extension or lookup site, or check a whole list of sites at once.
- How to check when an SSL certificate expires — Find the expiry date of any site's SSL/TLS certificate in the browser or with openssl and curl, script a days-left check for a list of domains, and tell certificate expiry apart from domain (registration) expiry.
- How to get App Store reviews as JSON (API and export) — Get Apple App Store reviews for any iPhone app as JSON with Apple's public customer-reviews feed: URL format, fields, paging, the 500-review limit per country, finding the app ID, and the App Store Connect API for your own apps.
- How to get job postings from Greenhouse, Lever and Workday — Pull a company's open jobs as JSON from its applicant tracking system: the public Greenhouse Job Board API, the Lever Postings API, and the endpoint Workday career sites use. Working curl examples, fields and limits.
- How to extract all links from a web page — Get every URL on a web page as a list, CSV or Excel file: a one-line DevTools console snippet, a link-extractor extension, an online HTML link extractor, Python with BeautifulSoup, or a full-site crawl.
- How to convert a web page to Markdown (for notes and LLMs) — Save any article or web page as clean Markdown for Obsidian, notes or LLM prompts: a one-click browser extension, an in-browser HTML to Markdown converter, the trafilatura command line, or a hosted tool for many URLs.
- How to modify HTTP request and response headers in Chrome and Firefox — Change request headers (Authorization, User-Agent, Origin) and response headers (CORS, CSP) in your browser: Chrome DevTools overrides, Firefox Edit and Resend, curl, and header-editor extensions. What each one can and cannot do.
- How to change the Referer, User-Agent or X-Forwarded-For header in Chrome — Set or remove the Referer, User-Agent, X-Forwarded-For, Origin and Authorization request headers in Chrome, and what the server still sees: navigator.userAgent, Sec-CH-UA client hints and your real IP.
- How to hide or remove the Server header in nginx and Apache — Stop nginx and Apache from sending their version number in the Server response header: server_tokens off, ServerTokens Prod, why 'Header unset Server' does nothing in Apache, and how to check the result with curl.
- How to allow multiple origins in Access-Control-Allow-Origin (CORS) — Access-Control-Allow-Origin takes one origin, not a list. Echo the request's Origin from an allow-list instead: a tested nginx map config, preflight handling, Vary: Origin, and the mistakes browsers reject.
- How to get the color palette of any website — Extract a website's colors as hex codes, sorted by how often they're used, with a short DevTools console snippet, plus a second snippet that lists the site's CSS color variables (design tokens). Tested on Wikipedia, GitHub and Stripe.
- How to export an HTML table to Excel with JavaScript — Add an 'Export to Excel' button to your page: a dependency-free CSV download (UTF-8 BOM, quoting, formula guard) and a real .xlsx with SheetJS table_to_book, including the raw option that keeps leading zeros.
- Bearer token Authorization header: format and examples — The exact format of the Authorization: Bearer header, with tested examples for curl, Python (requests and urllib) and JavaScript fetch, and what each one does with your token when the server redirects to another host.
- X-Forwarded-For in nginx: log the real client IP without trusting forged headers — Behind a reverse proxy or load balancer, nginx logs the proxy's IP. Use set_real_ip_from and real_ip_header to get the visitor's IP, and see the config that lets anyone forge their IP with one header.
- HTTP header size limits: nginx 400 and Node 431 errors, measured — How big can request headers be? Measured limits for nginx (about 8 KB per header line by default) and Node.js (16 KB in total), the errors you get (400 Request Header Or Cookie Too Large, 431) and the settings that raise them.
- 400 Bad Request: Request Header Or Cookie Too Large (nginx), fixed and tested — Why nginx answers 400 Request Header Or Cookie Too Large, measured: an 8 KB limit per header line (the whole Cookie line counts), 32 KB in total. How to fix it in Chrome by clearing one site's cookies, and on the server with large_client_header_buffers.
- Sec-Fetch-Site, Sec-Fetch-Mode, Sec-Fetch-Dest and Sec-Fetch-User explained (tested in Chromium) — What Chrome actually sends in Sec-Fetch-Site (none, same-origin, same-site, cross-site), Sec-Fetch-Mode (navigate, cors, no-cors), Sec-Fetch-Dest and Sec-Fetch-User for links, fetch, img, script, iframe, forms and window.open, plus a tested resource isolation policy.
- Reporting-Endpoints, Report-To and CSP report-to vs report-uri (tested in Chromium) — How to send CSP violation reports with Reporting-Endpoints and report-to, measured in Chrome 153: the exact application/reports+json payload versus report-uri's application/csp-report, why report-uri is ignored when both are set, the CORS preflight, and why an http:// endpoint or the old Report-To header got no reports.
- X-Frame-Options DENY vs SAMEORIGIN vs CSP frame-ancestors (tested in Chrome) — Which header stops other sites from framing your pages? Results from real Chrome tests: DENY, SAMEORIGIN, the ignored ALLOW-FROM, CSP frame-ancestors, and what happens when both headers disagree.
- Content-Disposition header: attachment vs inline and file names (tested in Chrome) — How the Content-Disposition header decides between showing a file and downloading it, and which file name the browser uses: attachment, inline, filename, UTF-8 filename*, spaces and unsafe paths, with results from Chrome.
- Strict-Transport-Security header 'not set' in nginx: the two traps — Added HSTS to nginx but scanners still report 'Strict-Transport-Security header not set'? Tested: add_header skips error responses unless you add 'always', and a nested location with its own add_header drops it.
- X-Content-Type-Options: nosniff, what it blocks (tested in Chrome) — What X-Content-Type-Options: nosniff actually does: Chrome test results for scripts served with the wrong or a missing Content-Type, the exact console error, and how to add it in nginx and Apache.
- Referrer-Policy header values, compared (tested in Chrome) — What each Referrer-Policy value sends in the Referer header, measured in Chrome for same-origin and cross-origin requests: the default, what leaks the full URL with query string, meta tag vs header, and nginx/Apache lines.
- SameSite cookies: Lax vs Strict vs None, tested in Chrome — Which cookies Chrome sends on cross-site links, forms, iframes, images and fetch() for SameSite=Lax, Strict, None and no attribute, measured in Chromium; why SameSite=None needs Secure and the 2-minute POST exception.
- Retry-After header on 429 and 503: seconds vs date, and what curl and Python do — How Retry-After works on 429 Too Many Requests and 503 responses, seconds vs HTTP-date, and measured retry timing for curl --retry and Python requests/urllib3 Retry, including the huge Retry-After that hangs a script.
- Permissions-Policy header: syntax, examples and mistakes (tested in Chrome) — A working Permissions-Policy header example and what Chrome did with common mistakes: old Feature-Policy syntax drops the whole header, =none without parentheses, unknown features, and why iframes also need the allow attribute.
- Content-Type: application/json, what curl, Python and fetch actually send — Send JSON with the right Content-Type header: what curl -d, curl --json, Python requests data= vs json=, and fetch with JSON.stringify actually send, measured against a logging server.
- ETag header explained: format, 304 responses and the gzip W/ prefix (tested on nginx) — What an ETag is and how If-None-Match turns it into 304 Not Modified, measured on nginx with curl: the ETag format, why gzip adds W/, why a deploy that only touches files changes every ETag, and how to turn ETags off.
- Vary: Origin, why CORS breaks behind a cache without it (tested) — What the Vary header does and why Vary: Origin matters for CORS: measured with an nginx cache, a response cached for one origin was served to another with the wrong Access-Control-Allow-Origin until Vary: Origin was added.
- PHP header('Location') redirect not working: causes, tested — Why PHP header('Location: ...') doesn't redirect: output before header() (spaces, a UTF-8 BOM, echo), output_buffering hiding the bug, missing exit, 301 vs 302, and passing variables safely, each tested on PHP 8.5.
- Accept-Language header: format, q values, real examples and a parser — What the Accept-Language header looks like in a real Chrome request, how q values rank languages, what headless browsers send, and a tested Python parser that picks the best supported language.
- Cache-Control no-cache vs no-store, what Chrome actually does (tested) — no-cache does not mean 'don't cache'. Measured in Chrome: which Cache-Control values revalidate with a 304, which download again, which make no request at all, and why a response with no Cache-Control still gets cached.
- X-Robots-Tag header: noindex PDFs and files in nginx and Apache (tested) — Add X-Robots-Tag noindex, nofollow to PDFs and other files in nginx and Apache with configs tested in containers, plus the nginx regex-location trap that turned a folder's PDFs into 404s.
- Set-Cookie HttpOnly: what it blocks in JavaScript (tested in Chrome) — What the HttpOnly cookie flag does, measured in Chrome: invisible to document.cookie, cannot be overwritten or created from JavaScript, still sent on every request. Node and Python examples that set it.
- Access-Control-Max-Age: default, 600 vs 86400, measured in Chrome — How long Chrome caches a CORS preflight for each Access-Control-Max-Age value, measured by counting OPTIONS requests: the 5-second default, 0 and -1, 600, and why 86400 doesn't give you a day.
- Host header injection: tested in nginx, and the default_server fix — What the HTTP Host header is and how Host header injection works, reproduced with curl against nginx: poisoned reset links and redirects to an attacker's domain, then the default_server 444 fix, $host vs $http_host, and the missing-Host 400.
- Access-Control-Allow-Credentials: true, and why * fails (tested in Chrome) — Access-Control-Allow-Credentials: true cannot be combined with Access-Control-Allow-Origin: *. A Chrome test matrix of credentials modes and CORS headers, the exact console errors, and the surprise: the cookie reaches your server even when the response is blocked.
- Content-Security-Policy-Report-Only: test a CSP without breaking your site (tested) — How Content-Security-Policy-Report-Only works, measured in Chrome: the script still runs, the violation is logged and POSTed to report-uri as application/csp-report, and the meta-tag version is ignored. Example header and nginx line.
- If-Modified-Since header: format, example and nginx's exact-match default (tested) — How If-Modified-Since works with Last-Modified and 304 Not Modified, the exact date format, a curl example, and the nginx default that only answers 304 to an exact date match, measured.
- X-Requested-With header: who sends it, and why it's missing (tested) — Who sends X-Requested-With: XMLHttpRequest (not fetch, not plain XHR, measured in Chrome), why servers that expect it fail with 'X-Requested-With header is missing', and why adding it cross-origin triggers a CORS preflight.
- Content-Encoding gzip vs br in nginx: what stock nginx sends (tested) — What Content-Encoding: gzip means, how nginx picks gzip vs br from Accept-Encoding, measured with curl on the official nginx image (no brotli module: 'unknown directive'), plus the gzip config and how to check compression.
- Access-Control-Expose-Headers: why response.headers.get() returns null (tested) — Why fetch() returns null for Content-Disposition, Retry-After or X-Total-Count on cross-origin responses, which headers are visible by default (measured in Chrome), and how Access-Control-Expose-Headers and '*' change it. Not the same as Allow-Headers.
- Cross-Origin-Resource-Policy values: same-origin vs same-site vs cross-origin (tested) — What each Cross-Origin-Resource-Policy value allows, measured in Chrome by loading an image from the same origin, the same site on another port, and another site, plus when you need CORP at all.
- Clear-Site-Data header: example values and what Chrome actually cleared (tested) — What Clear-Site-Data "cookies", "storage", "cache" and "*" removed in a Chrome test, why unquoted values do nothing, and how to send it on logout.
- Upgrade-Insecure-Requests: the request header vs the CSP directive (tested) — What the Upgrade-Insecure-Requests: 1 request header means, what CSP upgrade-insecure-requests actually rewrites on HTTP and HTTPS pages, and when it breaks images and scripts, measured in Chrome.
- WWW-Authenticate header: Basic auth in nginx, Bearer, and why the login prompt doesn't appear (tested) — What nginx auth_basic sends in WWW-Authenticate, every 401 case measured with curl, the 'return' directive that silently skips auth_basic, and when Chrome does (and doesn't) send credentials.
- Cross-Origin-Opener-Policy: same-origin vs same-origin-allow-popups vs unsafe-none (tested) — Which COOP combinations keep window.opener and popup.closed working, measured in Chrome across 36 opener/popup pairs, and why OAuth and payment popups break under COOP same-origin.
- Cross-Origin-Embedder-Policy: require-corp vs credentialless (tested) — Which COOP + COEP combinations made crossOriginIsolated true in Chrome, which cross-origin images and iframes require-corp and credentialless blocked, and the exact console errors.
- X-Forwarded-Proto in nginx: $scheme vs passing it through (tested) — What a backend behind nginx actually received as X-Forwarded-Proto with no setting, with $scheme and with $http_x_forwarded_proto, how that produced http:// redirects and an endless https redirect, and which config fixed it.
- When does the browser send the Origin header? (tested) — Which requests carried an Origin header in Chromium 153: same-origin and cross-origin fetch, form POST and GET, img with and without crossorigin, link clicks, Referrer-Policy: no-referrer and sandboxed iframes, plus why curl can send any Origin.
- Access-Control-Allow-Methods (tested) — What Chromium 153 did with Access-Control-Allow-Methods absent, GET, POST, PUT, lowercase put, *, * with credentials and PUT, DELETE for GET, POST, PUT, DELETE, PATCH and lowercase patch fetches, with the exact console error.
- Range header and 206 Partial Content (tested with nginx and curl) — What nginx 1.31 returned for Range: bytes=0-99, suffix ranges, open-ended ranges, multiple ranges, out-of-range and malformed ranges, If-Range with a matching or stale ETag, and Range on a gzipped response.
- Server-Timing header (tested in Chromium 153) — What Chromium 153 returned in performance serverTiming for dur, desc, multiple metrics, two header lines, malformed entries and cross-origin fetches with and without Timing-Allow-Origin. Node and nginx examples.
- Content-Length mismatch errors (tested) — Measured results when Content-Length is smaller or larger than the body, duplicated, conflicting, sent with Transfer-Encoding, negative or non-numeric. Exact error strings from curl 8.14, Node fetch, Python requests and Chromium 153.
- Expect: 100-continue in curl (tested) — Tested with curl 8.14.1: curl adds Expect: 100-continue only for bodies over 1 MiB, waits 1 second if the server ignores it, and -H 'Expect:' removes it. Python requests and Node fetch never send it.
- Accept-Encoding: gzip, deflate, br, zstd (tested) — Tested: Chromium 153 sends 'gzip, deflate, br, zstd' on https and localhost but only 'gzip, deflate' on plain http, and br it did not ask for fails with ERR_CONTENT_DECODING_FAILED. curl, Python requests and Node fetch compared, plus measured Brotli vs gzip vs zstd sizes.
- HSTS preload list requirements (tested) — What hstspreload.org requires (max-age of at least 31536000, includeSubDomains, preload, http to https on the same host first), the exact API error codes we got back, proof that Chromium 153 upgrades preloaded domains with a 307 Internal Redirect, and why removal takes months.
- Sec-CH-UA and User-Agent Client Hints explained (tested in Chromium) — What Chromium 153 actually sends in sec-ch-ua, sec-ch-ua-mobile and sec-ch-ua-platform, the Not_A Brand GREASE entry, what Accept-CH and Critical-CH change (and when), getHighEntropyValues output, and why plain-http hosts get no client hints.
- Vary header: Accept-Encoding, User-Agent and * (tested) — What Chromium 153's HTTP cache actually does with Vary: Accept-Encoding, Vary: User-Agent, Vary: * and a custom Vary header: server hit counts for repeated, changed and switched-back request headers, back/forward and reload, plus Node and nginx snippets.
- 431 Request Header Fields Too Large (tested) — Why you get HTTP 431 on localhost: Node.js 24 rejects requests whose header names plus values exceed 16,384 bytes, and cookies set on localhost by any other dev app on any port are sent along. Exact cutoff, curl output, what Chrome shows, and the fixes.
- Access-Control-Allow-Headers (tested) — What Chromium 153 did with Access-Control-Allow-Headers absent, content-type, Content-Type, x-api-key, *, * with credentials, authorization and '*, authorization' for JSON, X-Api-Key, Bearer and text/plain POSTs, with the exact console error.
- Transfer-Encoding: chunked vs Content-Length: when servers use which (tested in Node and nginx) — When Node.js and nginx send Content-Length and when they switch to Transfer-Encoding: chunked, what chunks look like on the wire, and what happens when a request carries both headers.
- stale-while-revalidate and Cache-Control immutable: what Chrome actually does (tested) — What max-age=1, stale-while-revalidate=60 did in Chrome compared with plain max-age (a 20 ms vs 2,024 ms load when revalidation was slow), and why immutable changed nothing on reload in Chrome.
- How to find out what font a website uses — Identify the font, size, weight and color of any text on a web page with Chrome DevTools, Firefox's Fonts panel, Safari Web Inspector or a one-click extension, and learn why the declared font is not always the one you see.
- How to copy a table from a website to Excel or Google Sheets — Five ways to get a table from a web page into Excel or Google Sheets: copy-paste, Excel's From Web, IMPORTHTML, a browser extension and Python pandas. Which one works when, and how to fix broken pastes.
- 413 Request Entity Too Large (tested) — Express 5.2.1 express.json() accepted 102,400 bytes and returned 413 at 102,401: PayloadTooLargeError, type entity.too.large. Plain Node.js took 200 MB with no limit. Gzip and chunked bodies counted too, and in Chromium a 413 without CORS headers became 'Failed to fetch'.
- 406 Not Acceptable (tested) — We logged the default Accept header of curl, Node fetch, Python requests and Chromium, then made Express 5.2.1 res.format return 406. application/xml, text/plain or json;q=0 got 406; */* and no Accept got 200. Fixes: a default handler or Accept: application/json.
- 415 Unsupported Media Type (tested) — fetch with a JSON.stringify body sent text/plain;charset=UTF-8, curl -d sent form-urlencoded, requests data= sent none. Flask 3.1 answered 415, Express 5 gave req.body undefined with 200, FastAPI gave 422. Measured fixes for each.
- Forwarded vs X-Forwarded-For (tested) — Express 5.2.1 and Werkzeug 3.1.9 ignored the standard Forwarded header completely and read only X-Forwarded-For/Proto/Host. With trust proxy true, a client-sent X-Forwarded-For: 6.6.6.6 became req.ip. Hop counts, syntax and fixes.
- X-XSS-Protection header: deprecated, what to set (tested) — We served a reflected-XSS page with X-XSS-Protection 0, 1, 1; mode=block and no header. The script ran every time in Chromium 153 and Firefox 156. A CSP blocked it. helmet 8.3.0 sends 0; Django 6.1.1 sends nothing.
- Connection: keep-alive and the Keep-Alive header (tested) — Node.js 24 sends Keep-Alive: timeout=5 but closed idle sockets at 6.0 s. requests.get opened 5 connections for 5 calls; a Session opened 1. A keep-alive pool that outlived the server's timeout threw ECONNRESET, reproduced here.
- Cache-Control: private vs public (tested) — Chromium 153 cached private, max-age=60 exactly like public: 1 server hit for 2 navigations, even with Set-Cookie or an Authorization header. private only stops shared caches. Express 5 sends public, max-age=0 by default.
- Last-Modified header explained (tested) — Chromium 153 cached a page with only Last-Modified (10 days old) and no Cache-Control: zero server hits on revisits. A 1-minute-old date went stale in seconds and revalidated with a 304. Express 5 sends Last-Modified and ETag by default.
- CSP nonce: script-src 'nonce-...' (tested) — Chromium 153: an inline script with the matching nonce ran; wrong or missing nonce was blocked; 'unsafe-inline' was ignored next to a nonce; onclick stayed blocked; getAttribute('nonce') returned "". Express 5 + helmet 8 setup.
- 408 Request Timeout (tested) — Node.js 24 with requestTimeout 3000 sent 408 plus Connection: close at 3,012 ms to a client trickling a 100-byte body. curl, fetch and Chromium did not retry a 408; curl --retry 3 sent 4 requests. 408 vs 504 vs client timeouts.
- 103 Early Hints (tested) — Node.js 24 writeEarlyHints sent a 103 with a Link preload, then the 200 a second later. curl shows both, http.get fires an 'information' event, fetch hides it. Chromium 153 fetched the CSS early over HTTP/2 but not HTTP/1.1.
- Via header (tested) — We checked 8 big sites on 2026-10-02: only aws.amazon.com and d1.awsstatic.com (CloudFront) and reddit.com (varnish) returned Via. curl 8.14.1 and Node 24 fetch never send Via. Syntax, loop detection and how to hide it.
- Pragma: no-cache header (tested) — We tested Pragma: no-cache in Chromium 153 on 2026-10-02: as a response header it stopped caching even next to max-age=60. Hard reload and fetch(cache:'reload') send Pragma plus Cache-Control: no-cache. curl just sends the header.
- Proxy-Authorization header (tested) — We ran a forward proxy that needs Basic auth and logged every header. curl 8.14.1 and Python requests send Proxy-Authorization on the first request, a password with @ must be written %40 in the -x URL, and the proxy strips it.
- 502 Bad Gateway (tested) — We built a reverse proxy and broke its upstream four ways: refused connection, reset socket, mid-response crash and garbage reply. Here is what curl and fetch() showed, and how to fix each cause.
- 504 Gateway Timeout (tested) — We put a 2 s proxy in front of a 5 s upstream: 504 after 2.01 s, while the upstream kept working for 3 more seconds. Plus 504 vs 408 vs curl error 28, and the default timeouts of nginx, Cloudflare and AWS.
- 405 Method Not Allowed (tested) — We sent POST, HEAD and OPTIONS to Express, Flask and python -m http.server. Express said 404, http.server said 501, only Flask said 405. Here is what each returns, how redirects drop POST, and how to fix it.
- 503 Service Unavailable (tested) — We built a maintenance switch and a load-shedding server that return 503, then checked which clients retry. curl --retry waits for Retry-After. Python urllib and Node fetch do not retry at all.
- 401 vs 403: Unauthorized vs Forbidden (tested) — 401 means we don't know who you are. 403 means we know, and the answer is no. We ran a real API with curl, fetch() and headless Chromium to show the headers, the retries and a 404 that hides a 403.
- 409 Conflict (tested) — We built a small API that returns 409 for duplicate emails and stale versions, then raced two updates. Exactly one won each time. We also show 409 vs 412, what fetch() and curl do, and when to use 400 or 422.
- 304 Not Modified (tested) — We served files with Express and sent conditional requests from curl, Node fetch and headless Chromium. When a 304 happens, what the 304 keeps, why JS sees 200, and why Node fetch with If-None-Match got a 200.
- 422 Unprocessable Content (tested) — We sent missing fields, wrong types, extra fields, bad JSON and form bodies to FastAPI and Express. Here is what returns 422, what returns 400, the exact error JSON, and how to read it with fetch.
- 301 vs 302 vs 307 vs 308 redirects (tested) — We POSTed JSON to 301, 302, 303, 307 and 308 redirects with curl, Node fetch, Python urllib and Chromium. 301/302/303 turned the POST into a GET and dropped the body; 307/308 kept both. Chromium cached 301 and 308.
- ERR_TOO_MANY_REDIRECTS (tested) — We built redirect loops on purpose: a plain /a to /b loop, a proxy that hides HTTPS, a cookie the app never sees and a cached 301. Here is what Chromium, curl, Node and Python did, and how each loop was fixed.
- 410 Gone vs 404 Not Found (tested) — We served 410 and 404 from Node.js and Flask, then tested curl --fail, curl --retry, fetch() and Chromium caching. One surprise: Chromium cached a 410 with no Cache-Control, but not a 404.
- ERR_CONNECTION_RESET / ECONNRESET (tested) — We made a server reset the connection and recorded the exact error from Chrome, curl, Node.js fetch and Python. RST vs FIN, reset before and after headers, and the usual causes.
- 500 Internal Server Error (tested) — We threw uncaught errors in Express, plain Node, Flask and FastAPI and logged what each one sent. The 500 body hides the cause. The real error is in the server log. Here is where to find it.
- 400 Bad Request (tested) — We sent broken requests to Node.js, Express and Flask and recorded the exact 400 responses: bad request lines, bad header names, missing Host, spaces in URLs and malformed JSON. Plus the fixes.
- net::ERR_HTTP2_PROTOCOL_ERROR (tested) — We made a Node.js HTTP/2 server break streams on purpose and recorded what Chromium 153 and curl 8.14.1 report. What triggers ERR_HTTP2_PROTOCOL_ERROR, and how to find the real cause.
- 499 Client Closed Request (tested) — nginx logs 499 when the client hangs up before the answer. We made curl, fetch, Chromium and Python give up after 1 s on a 5 s Node handler and timed what the server sees.
- Age header (tested) — We read Age from five big sites twice, 5 seconds apart, and ran Chromium against a server that sent Age: 50 and Age: 100 with max-age=60. Age eats into max-age, and Age above max-age means no caching at all.
- Unexpected end of JSON input (tested) — We triggered every common cause in Chromium 153, Node 24 and Python: empty 204, HEAD, truncated body, HTML error page. Exact messages and the fix.
- CORS error messages explained (tested) — We triggered 16 CORS failures in Chromium 153 and copied the exact console message for each. Match your error, see the cause, and copy the Express fix.
- ERR_CONNECTION_REFUSED / ECONNREFUSED (tested) — We bound a server to 127.0.0.1, ::1, 0.0.0.0 and :: and hit it as localhost, 127.0.0.1 and [::1] from Chromium, curl, Node and Python. Full matrix and fixes.
- TypeError: Failed to fetch (tested) — We broke fetch 15 ways in Chromium 153: CORS, DNS, refused, cert, mixed content, ad block, reset. Each gave the same message. Here is how to tell them apart.
- ERR_SSL_PROTOCOL_ERROR (tested) — We broke TLS 8 ways and recorded what Chrome 153, curl and Node fetch said. ERR_SSL_PROTOCOL_ERROR mostly means https:// hit a port that does not speak TLS.
- Error: socket hang up in Node.js (tested) — We triggered socket hang up 7 ways in Node 24 and logged the exact error from http.request, fetch and axios. The cause, the code, and the fix for each.
- NET::ERR_CERT_AUTHORITY_INVALID (tested) — We served 8 broken certificates to Chromium 153, curl, Node fetch and Python. What each one reports, why expired certs can show this error, and fixes.
- ERR_NAME_NOT_RESOLVED / ENOTFOUND (tested) — We looked up typo, .invalid, TXT-only, underscore and 64-char hostnames in Chromium 153, Node 24, curl and Python. Exact errors per client and how to fix each.
- CORS preflight request (OPTIONS), tested — We counted OPTIONS hits from Chromium 153 for 23 request types: which trigger a CORS preflight, what the OPTIONS carries, and how long it is cached.
- Express "Cannot GET /" (tested) — "Cannot GET /" is Express's default 404. We reproduced each cause in Express 5 and 4: missing route, router prefix, static path, SPA refresh, '*' crash.
- net::ERR_BLOCKED_BY_CLIENT and net::ERR_ABORTED (tested) — We blocked /ads.js and /analytics with a real MV3 extension in Chromium 153 and recorded what console, fetch and onerror see. Plus 5 measured ERR_ABORTED cases.
- ERR_CACHE_MISS / Confirm Form Resubmission (tested) — We POSTed a form in Chromium 153, then went back and reloaded. no-store gives ERR_CACHE_MISS; reload re-POSTs. A 303 redirect (PRG) fixes both. Counts inside.
- Mixed Content blocked on HTTPS (tested) — We loaded 9 kinds of http:// resource from an HTTPS page in Chromium 153. Which are blocked, which are auto-upgraded, the exact console text, and the fixes.
- ERR_CONNECTION_TIMED_OUT / ETIMEDOUT (tested) — We connected Chromium, curl, Node and Python to a blackholed IP and timed each error. Linux gave up at 134.7 s, Node fetch at 10 s. Exact errors and fixes.
- ERR_HTTP_HEADERS_SENT: Cannot set headers after they are sent (tested) — We triggered ERR_HTTP_HEADERS_SENT 7 ways in Express 5.2.1: what the log shows, what the client gets, when the process crashes, and the fix for each.
- EADDRINUSE: address already in use (tested) — We reproduced listen EADDRINUSE in Node 24: what holds the port, IPv4 vs IPv6 binds, TIME_WAIT, Ctrl+Z, and how to find and kill the owner by PID.
- ERR_EMPTY_RESPONSE / curl (52) Empty reply (tested) — Chrome's ERR_EMPTY_RESPONSE and curl's (52) Empty reply mean the server closed without sending a byte. We reproduced 8 causes and logged what each client says.
- WebSocket connection to 'ws://...' failed (tested) — We triggered common WebSocket failures in Chromium 153 and Node 24: refused, 404, 200, 400, 403, mixed content, wss to a ws port, a proxy that drops Upgrade.
- NET::ERR_CERT_COMMON_NAME_INVALID and ERR_CERT_DATE_INVALID (tested) — We served 9 test certificates to Chromium, curl, Node fetch and Python. Exact error per client, why CN-only certs fail, wildcard traps, and openssl checks.
- net::ERR_UNSAFE_PORT (tested) — Chrome refuses ports like 6000, 6667 and 10080 with ERR_UNSAFE_PORT. We tested 20 ports in Chromium 153, Node fetch and curl, plus the flag that unblocks them.
- Self-signed certificate in certificate chain (tested) — We served four broken TLS chains and logged the exact errors from Node, npm, curl, Python and git, then verified each safe fix (NODE_EXTRA_CA_CERTS, cafile).
- net::ERR_INVALID_RESPONSE (tested) — We sent 60 broken HTTP responses to Chromium 153, curl, Node fetch and Python. Which ones give ERR_INVALID_HTTP_RESPONSE, which load fine, and how to fix each.
- axios Network Error (ERR_NETWORK) (tested) — CORS, refused, DNS and mixed content all give axios the same 'Network Error' with no response. We tested each in Chromium 153 and show how to find the cause.
- Python requests: Max retries exceeded (tested) — We triggered every common requests ConnectionError: refused, DNS, self-signed SSL, ReadTimeout, RemoteDisconnected. Exact messages, causes and a tested Retry setup.
- Could not resolve host (tested) — We reproduced git's DNS-resolution error over https and ssh, compared it to connection-refused, and tested proxy and ssh config fixes.
- upstream prematurely closed connection (tested) — nginx logs this when the upstream dies before sending full headers. We reproduced it with a Node proxy and measured the causes and the fix.
- git RPC failed; curl 56 Connection reset by peer (tested) — We built a local git server and forced four real connection failures to show exactly what error text each produces, and what http.postBuffer changes.
- npm ECONNRESET / ETIMEDOUT network errors (tested) — We made npm fail 3 ways against the registry: ECONNRESET, ETIMEDOUT, ECONNREFUSED. Measured npm's real error text, retry count, and timing for each.
- nginx "no live upstreams" error (tested) — nginx logs this when every upstream server is marked down. We rebuilt its max_fails logic in Node and measured the exact moment it stops trying to connect.
- jwt malformed, invalid signature, jwt expired (tested) — Tested jsonwebtoken 9.0.3 verify() against bad, tampered and expired tokens: exact error names/messages, expiredAt, clockTolerance, and decode() vs verify().
- JWT: TokenExpiredError vs invalid signature (tested) — We tested Node's jsonwebtoken: TokenExpiredError vs JsonWebTokenError 'invalid signature', clockTolerance, and why a tampered payload often throws neither.
- Postgres connection refused (tested) — We measured the exact Node pg driver errors for a closed port, a stopped server, wrong password and a bad hostname, so you can match the message to the fix.
- Redis Connection Refused (ECONNREFUSED) (tested) — ECONNREFUSED means nothing is listening on that port. We tested ioredis, node-redis and redis-cli on a closed port and a container we stopped and restarted.
- MongoDB connection refused (tested) — The mongodb driver doesn't fail fast: by default it waits 30s before reporting ECONNREFUSED. We measured the exact error, the real wait, and mongoose's wrapper.
- Cannot Connect to the Docker Daemon (tested) — We pointed docker at a missing socket and dead TCP ports and recorded the exact errors. Unix-socket and TCP wording differ; compose copies the CLI's error.
- SSH Permission denied (publickey) (tested) — We measured real causes of SSH's Permission denied (publickey): missing keys, bad AuthorizedKeysFile paths, writable dirs, and sshd_config error wording.
- SSH Host Key Verification Failed (tested) — We measured SSH's REMOTE HOST IDENTIFICATION HAS CHANGED error, the ssh-keygen -R fix, and why StrictHostKeyChecking=no is unsafe compared to accept-new.
- npm ERESOLVE unable to resolve dependency tree (tested) — We reproduced npm's ERESOLVE error with a real peer-dependency conflict and measured --legacy-peer-deps, --force, and overrides side by side.
- npm error code ETARGET (tested) — We reproduced npm's ETARGET error 4 ways (exact version, range, package.json, bad string) and measured the real fix for each.
- ModuleNotFoundError vs ImportError (tested) — We triggered both errors on Python 3.13.5: a missing module, a bad name import, a circular import, and a shadowed stdlib file. Exact tracebacks included.
- TS2307 Cannot find module (tested) — We reproduced TS2307 four ways in TypeScript 7: missing package, untyped package, wrong relative path, and a CSS import. Exact errors and fixes for each.
- React Hydration Error (tested) — We reproduced React's hydration mismatch in a browser: random output and typeof window checks both break it. Exact console errors, plus the useEffect fix.
- Vite "Failed to resolve import" (tested) — We measured Vite 5.4.21's exact wording for a missing package, an unconfigured alias, and a typo'd filename, in both dev server and build mode.
- Webpack Module Not Found (tested) — We reproduced webpack's "Can't resolve" error for a missing package, a typo'd file, a missing loader, and a bad resolve.extensions, with exact output.
- TS2322 Type is not assignable to type (tested) — We reproduced TS2322 four ways in TypeScript 7: strictNullChecks on/off, a missing interface property, undefined props, and the as-unknown-as escape hatch.
- Git Merge Conflict: How to Resolve (Tested) — We triggered a real git merge conflict and captured the exact <<<<<<< ======= >>>>>>> markers, git status wording, and how to resolve, abort, and inspect it.
- docker compose up error (tested) — We reproduced 4 real docker compose up errors on Docker 29.8.1 and captured the exact error text, so you can match yours and fix it fast.
- pip install Failed (tested) — We reproduced pip's externally-managed-environment, build-wheel, and connection errors on Debian 13 (plus the real causes of SSL errors) with the fix for each.
- docker build failed (tested) — We reproduced real docker build / BuildKit failures on Docker 29.8.1: a missing COPY file, a failing RUN, and a bad FROM image, with exact error text.
- Too Many Open Files / EMFILE (tested) — We hit the real file descriptor limit on Linux and captured the exact EMFILE/Errno 24 errors from Python and Node, then fixed it with ulimit.
- Out of Memory: Killed Process (tested) — We reproduced a real OOM kill with a memory cgroup, captured the exit code and systemd's log line, and show why it's different from a Python MemoryError.
- Exit Code 137 (tested) — We killed real processes and Docker containers to show what exit code 137 means, why it's always a kill signal, and how to tell an OOM kill from a manual one.
- JavaScript Heap Out of Memory (tested) — We crashed Node for real to show the exact 'JavaScript heap out of memory' error, why it can't be caught with try/catch, and the --max-old-space-size fix.
- Maximum Call Stack Size Exceeded (tested) — We measured this RangeError in Node 24 and headless Chromium: it's catchable, caused by deep/infinite recursion, and --stack-size can even crash the process.
- Cannot Read Properties of Undefined (tested) — We reproduced 'Cannot read properties of undefined (reading X)' in Node 24 and Chromium 153, and tested the optional-chaining and destructuring fixes.
- UnhandledPromiseRejectionWarning / Uncaught (in promise) (tested) — We measured what Node 24 and headless Chromium actually do with a rejected promise and no .catch(). Node crashes; the browser just logs and moves on.
- WebSocket Closed With Code 1006 (tested) — Code 1006 means no close frame arrived. We killed a server and cut a socket to reproduce it, and compared it to clean 1000 and server-error 1011 closes.
- Segmentation fault (core dumped) (tested) — We crashed a real C program on Linux and captured the exact shell text, exit code 139, and when "(core dumped)" appears vs. when it doesn't.
- jwt malformed (tested) — We fed broken JWT strings to jsonwebtoken 9.0.3 and PyJWT 2.15.1 and recorded the exact error text each one throws, segment by segment.
- JWT expired vs invalid signature (tested) — We measured jsonwebtoken 9.0.3: TokenExpiredError's exact fields, 'invalid signature', and the precise clockTolerance boundary that decides pass or fail.
- error: RPC failed; curl 56 / HTTP 400 on git push (tested) — git push over HTTPS fails on large commits with RPC failed or HTTP 400. We reproduced the real cause on a live git-http-backend and tested the postBuffer fix.
- Cannot Connect to the Docker Daemon (tested) — We pointed Docker's CLI at a wrong socket and an unreachable TCP port and captured the exact error text for each, next to the normal working case for contrast.
- require is not defined in ES module scope (tested) — We reproduced this error and 3 related ones on Node.js 24 and found Node's own behaviour has quietly changed: require() of ESM now works in most cases.
- Git detached HEAD (tested) — We reproduced detached HEAD, lost a commit in it on purpose, and recovered it with reflog — exact git 2.47.3 output included.
- Git cannot lock ref (tested) — We reproduced git's cannot-lock-ref error two real ways: a stale .lock file and a branch name collision, with exact output and fixes for each.
- npm EACCES permission denied (tested) — We reproduced npm's EACCES error with a real locked-down directory and measured the one fix that doesn't need sudo.
- AttributeError: 'NoneType' object has no attribute (tested) — We reproduced 6 real causes on Python 3.13.5: list.append(), dict.get(), re.match(), missing-return functions. Exact tracebacks and fixes for each.
- Python KeyError (tested) — We reproduced 7 real KeyError cases on Python 3.13.5: missing dict keys, dict.pop(), counters, and row-style lookups. Exact tracebacks and the fix for each.
- KeyError when the key looks present (tested) — KeyError even though the key is right there in the dict? We reproduced 5 causes: type mismatch, whitespace, case, wrong dict object, Unicode normalization.
- IndentationError and TabError (tested) — We reproduced 4 real IndentationError/TabError variants on Python 3.13.5: unexpected indent, missing block, bad dedent, mixed tabs. Exact text and fixes.
- IndexError: list index out of range (tested) — We reproduced 9 real causes on Python 3.13.5: off-by-one loops, empty lists, negative indices, pop(), sys.argv. Exact tracebacks and the fix for each.
- Python ZeroDivisionError (tested) — We reproduced 8 ZeroDivisionError variants on Python 3.13.5: /, //, %, divmod(), Decimal, Fraction. Exact messages and fixes, plus why 0.0/0.0 still raises.
- RecursionError: maximum recursion depth exceeded (tested) — We reproduced RecursionError 5 ways on Python 3.13.5: no base case, mutual recursion, comparison/repr recursion. Exact messages and fixes for each.
- TypeError: 'NoneType' object is not subscriptable (tested) — We reproduced 8 TypeError variants caused by None on Python 3.13.5: subscript, iterate, call, int(), len(), +, in. Exact messages and the fix for each.
- Python ValueError (tested) — We reproduced 8 real ValueError cases on Python 3.13.5: int()/float() parsing, math domain error, unpacking mismatches, and more. Exact messages and fixes.
- Python UnicodeDecodeError (tested) — We reproduced UnicodeDecodeError 4 ways on Python 3.13.5: Latin-1 bytes, truncated UTF-8, ASCII decoding, UTF-16 read as UTF-8. Exact messages and fixes.
- SQL "column reference is ambiguous" (tested) — We reproduced PostgreSQL's "column reference is ambiguous" error 4 ways (JOIN, WHERE, GROUP BY, USING) and tested the exact fixes with real queries.
- SQL "duplicate key value violates unique constraint" (tested) — We reproduced PostgreSQL's duplicate key error from INSERT and UPDATE, then tested ON CONFLICT DO NOTHING and DO UPDATE (upsert) as real fixes.
- SQL "column does not exist" (tested) — We reproduced PostgreSQL's "column does not exist" error across SELECT, WHERE, INSERT, UPDATE, ORDER BY, plus the typo hint and the ADD COLUMN fix.
- SQL Foreign Key Constraint Fails (tested) — We reproduced PostgreSQL's foreign key violation from both directions (bad insert, blocked delete) and tested ON DELETE CASCADE and SET NULL as real fixes.
- MySQL Error 1045: Access Denied for User (tested) — We reproduced MySQL error 1045 four ways: wrong password, no password, unknown user, and an unauthenticated root login. Each exact message and the fix.
- MySQL Error 1064: SQL Syntax Error (tested) — We reproduced MySQL's error 1064 four ways: a typo'd keyword, an unquoted reserved word, a trailing comma, and an unterminated string. Each exact message.
- SQL Deadlock Detected (tested) — We triggered a real deadlock with two concurrent transactions, captured PostgreSQL's exact error and server log, and tested the fix.
- Docker: Port Is Already Allocated (tested) — We reproduced Docker's port conflict error, found exactly which container held the port, and tested both real fixes end to end.
- Docker: Container Name Already in Use (tested) — We reproduced Docker's name-conflict error and tested both real fixes: removing the old container, and reusing it without creating a new one.
- Docker Exit Code 137 (tested) — We deliberately OOM-killed a container, confirmed it in docker inspect, and tested the fix of raising its memory limit, with real output.
- Docker Pull Access Denied (tested) — We reproduced this error from a typo'd image name and a bad tag, and show why it almost never means an actual permissions problem.
- Docker: No Space Left on Device (tested) — We reproduced the exact write failure, show the real docker system df command to find what's eating space, and tested two real fixes.
- npm Error Code E404 (tested) — We reproduced npm's E404 from a nonexistent package, an invalid name, and a private scoped package, and show how to tell them apart.
- Node.js Cannot Find Module (tested) — We reproduced Cannot find module in both CommonJS and ESM, including the extension gotcha that only breaks ESM imports, not require().
- Bash: Unbound Variable (tested) — We reproduced set -u's unbound variable error on a typo'd env var and a missing positional argument, then tested three real fixes.
- chmod: Operation Not Permitted (tested) — We reproduced chmod's real ownership error and show why root access, not a different mode number, is the actual fix.
- Bash: Command Not Found (tested) — We reproduced 6 real causes of bash: command not found, from typos to a stale PATH hash cache, and tested the exact fix for each.
- Bash: Syntax Error Near Unexpected Token (tested) — We reproduced bash syntax error near unexpected token from missing fi/done/esac and from Windows CRLF line endings, and tested the fixes.
- Python SyntaxWarning: Invalid Escape Sequence (tested) — We reproduced Python's invalid escape sequence warning from a plain regex string, turned it into a hard error, and tested the exact fix.
- Regex Catastrophic Backtracking (tested) — We timed a vulnerable regex on growing input until it hung, then measured three fixes that stay fast at 100,000 characters.
- CSS: z-index Not Working (tested) — We reproduced 3 real reasons z-index fails: missing position, a parent's new stacking context, and static elements, proven in headless Chromium.
- CSS Grid Overflow (tested) — We measured why a grid track overflows its container, why minmax(0,1fr) alone isn't enough, and the fix that stops overflow at 0px, in headless Chromium.
- HTML Form Not Submitting (tested) — We reproduced the #1 silent cause of a form that won't submit: a button's default type, and a submit button placed outside its form. No console error.
- HTML Form Not Submitting on Enter Key (tested) — We tested when Enter submits a form in Chromium: one text field submits with no button, two+ fields need a submit button. Textareas never submit.
- Git Stash Pop Conflict: How to Resolve It (Tested) — We triggered a real stash pop conflict and captured the exact markers, git status output, how to cleanly undo it, and how to resolve and drop the stash.
- Git Rebase Conflict: How to Resolve (Tested) — We triggered a real git rebase conflict and captured the exact markers, git status wording, and the difference between --abort, --skip, and --continue.
- TypeError: X Is Not a Function (tested) — We reproduced 'X is not a function' in Node 24: broken imports, lost 'this', and unset properties. Exact error text for each, and how it differs from a typo.
- JavaScript 'Unexpected token' (tested) — We reproduced 'Unexpected token' for real syntax typos, JSON.parse() on bad data, and import/export in a CommonJS file. Exact Node 24 wording for each.
- TS2339 Property does not exist on type (tested) — We reproduced TS2339 for typos, union types, and unknown vs any, plus the replaceAll/lib case. Exact TypeScript 7 error text for each.
- TS18046 'e' is of type 'unknown' (tested) — Reproduced TS18046 on a plain catch(e) block in TypeScript 7. Exact error text, the instanceof Error fix, the unsafe cast, and the tsconfig opt-out.
- Minified React Error #130 (tested) — React error #130 means a component is undefined where JSX expected one. We reproduced the exact error from a default/named import mix-up and show the fix.
- React key prop warning (tested) — We reproduced React's exact unique key prop warning, proved index keys silence it, and measured why that still breaks lists on reorder.
- react-hook-form errors not updating (tested) — formState.errors can stay empty after failed validation. We measured why: react-hook-form only tracks a field you actually read in render, and show the fix.
- React error #310 (tested) — We reproduced React error #310 for real: a hook inside an if-block threw 'Rendered more hooks than during the previous render.' Exact error, stack, and fix.
- Next.js error digest (tested) — In production, Next.js strips real errors from the browser, showing only a digest hash. We reproduced it and show exactly what the server logs vs. the client.
- Next.js global-error vs error for layout (tested) — We threw an error in Next.js app/layout.tsx and proved error.tsx never fires; only global-error.tsx catches it. Full HTTP responses and server logs included.
- npm error code ENOENT (tested) — We reproduced npm's exact ENOENT error, plus 3 lookalikes (Missing script, MODULE_NOT_FOUND, EUSAGE) it's often confused with.
- ESLint 'process'/'require'/'module' is not defined (tested) — We reproduced ESLint's 'process'/'require'/'module' is not defined no-undef errors on v9 and measured the exact flat-config and .eslintrc fixes.
- git: unable to unlink / path is unmerged / object file is empty (tested) — We reproduced 3 distinct git errors — unable to unlink, path is unmerged, and object file is empty — and measured the exact fix for each.
- postgres: must be owner of / permission denied for schema (tested) — We reproduced Postgres's 'must be owner of table' and 'permission denied for schema' errors with two roles and measured the exact GRANT/ALTER fix for each.
- yaml.scanner.ScannerError: mapping values are not allowed here (tested) — We reproduced PyYAML's 'mapping values are not allowed here' error 2 ways and measured the exact fix: it's almost always an unquoted colon.
- Hamilton: Required input missing / Cannot define function twice (tested) — We reproduced 3 real Hamilton dataflow errors — missing input, duplicate function, and a cyclic dependency — and measured the exact fix for each.
- Terraform: Error acquiring the state lock (tested) — We reproduced Terraform's state lock error with real concurrent runs and found force-unlock fails on a local backend — the lock had already released.
- Terraform: Saved plan is stale (tested) — We reproduced Terraform's 'Saved plan is stale' error by applying an out-of-date plan file and measured the exact fix: regenerate the plan.
- Terraform: Error: Cycle (tested) — We made two Terraform resources reference each other and reproduced 'Error: Cycle', then measured the fix and that validate catches it too.
- Terraform: Backend configuration changed (tested) — We changed a Terraform backend path and measured the fix: -reconfigure alone still prompts; -migrate-state -force-copy is the non-interactive way to keep state.
- Pytest: error: unrecognized arguments (tested) — We reproduced pytest's 'unrecognized arguments' error and measured that a missing plugin and a typo'd flag give the identical message and exit code 4.
- Unittest discovery ImportError / _FailedTest (tested) — We broke a test file's import and measured that unittest discover hides the real traceback inside a fake _FailedTest case instead of showing it directly.
- Pytest: no tests ran, exit code 5 (tested) — We reproduced pytest exiting 5 with 'no tests ran' from a naming mismatch, a bad -k filter, and an empty directory, and measured the exact fix for each cause.
- SQLite: database is locked (tested) — We reproduced Python sqlite3's 'database is locked' with a real concurrent write and measured the default 5s wait plus the timeout= fix that makes it succeed.
- SQLite: attempt to write a readonly database (tested) — We reproduced sqlite3's readonly-database error two ways: a read-only file, and a read-only directory with a writable file — both give the identical message.
- SQLite: no such table (tested) — We reproduced sqlite3's 'no such table' three ways and measured that table names are case-insensitive, so a casing mismatch is never the cause.
- SQLite: database disk image is malformed (tested) — We corrupted a real SQLite file by truncation and measured exactly what triggers 'disk image is malformed': a page-count mismatch in the file header.
- SQLite: unable to open database file (tested) — We reproduced sqlite3's 'unable to open database file' two ways: a missing parent directory, and a read-only directory for a brand-new file.
- SQLite: table has no column named (tested) — We reproduced sqlite3's 'has no column named' two ways: a typo'd column and an extra column, and measured that both give the identical error shape.
- SQLite: no such column (tested) — We reproduced sqlite3's 'no such column' from a SELECT list, a WHERE clause, and ORDER BY, plus the distinct ambiguous-column error from a JOIN.
- SQLite: cannot start a transaction within a transaction (tested) — We reproduced sqlite3's transaction-nesting error, including the sneaky case: Python opens a transaction implicitly before your explicit BEGIN ever runs.
- SQLite: cannot commit - no transaction is active (tested) — We measured a real split in sqlite3: con.commit() silently no-ops with nothing open, but the raw SQL COMMIT statement raises an error for the exact same state.
- SQLite: NOT NULL constraint failed (tested) — We reproduced sqlite3's NOT NULL error from an explicit NULL and from simply omitting the column, and measured that a column DEFAULT fixes both identically.
- SQLite: datatype mismatch (tested) — We measured why SQLite accepts text in an INTEGER column everywhere except one place: an INTEGER PRIMARY KEY, where it raises 'datatype mismatch' instead.
- SQLite: too many SQL variables (tested) — We measured the real bound-parameter limit on a live system: 250,000, not the commonly-cited 999 or 32,766 — it's set at compile time and varies by distro.
- SQLite: CHECK constraint failed (tested) — We reproduced sqlite3's CHECK constraint error and measured that the message echoes the exact expression, and that NULL silently bypasses CHECK entirely.
- SQLite: UNIQUE constraint failed (tested) — We reproduced sqlite3's UNIQUE error, measured that NULL is exempt (two NULLs insert fine), and confirmed the ON CONFLICT upsert fix.
- SQLite: FOREIGN KEY constraint failed (tested) — We measured that SQLite's foreign keys are OFF by default (a missing-parent insert succeeds silently) until PRAGMA foreign_keys=ON is set per connection.
- SQLite: Incomplete Input / Unrecognized Token (tested) — We reproduced SQLite's three distinct syntax-error messages in Python: incomplete input, unrecognized token, and near X: syntax error.
- TypeError: Object of type X Is Not JSON Serializable (tested) — We measured why json.dumps() rejects datetime, set, bytes and Decimal, why int dict keys silently become strings, and the default= fix, in Python 3.13.
- json.decoder.JSONDecodeError: Extra Data (tested) — We measured why json.loads() throws Extra Data on concatenated JSON and JSON Lines files, and the exact raw_decode() fix for both, in Python 3.13.
- json.decoder.JSONDecodeError: Invalid Control Character (tested) — We measured why a raw newline or tab inside a JSON string breaks json.loads(), why json.dumps() never does it, and the strict=False fix, in Python 3.13.
- Expecting Property Name Enclosed in Double Quotes (tested) — We measured the three causes of this JSONDecodeError: single-quoted keys, unquoted keys, and the classic str(dict) instead of json.dumps() mistake.
- ValueError: Circular Reference Detected (tested) — We measured why json.dumps() raises this on self-referencing data, why default= can't fix it, and the recursive sanitizer that does, in Python 3.13.
- TypeError: the JSON Object Must Be str, bytes or bytearray (tested) — We measured four causes of this TypeError: passing a file object, None, an already-parsed dict, or a custom object to json.loads() instead of json.load().
- json.dumps() sort_keys=True TypeError (tested) — We measured why adding sort_keys=True can suddenly break json.dumps() on mixed-type dict keys, and which key-type mixes are actually safe.
- TypeError: Object of Type int64 Is Not JSON Serializable (tested) — We measured why json.dumps() rejects numpy int64 and ndarray but not float64, and the fastest default= fix, with numpy 2.5 and pandas 3.0.
- json.dumps() ensure_ascii Unicode Escapes (tested) — We measured why json.dumps() escapes non-ASCII text to \uXXXX by default, that both forms decode the same, and the byte-size tradeoff of turning it off.
- json.dumps() separators= Silently Produces Broken JSON (tested) — We measured that swapping json.dumps()'s separators= tuple order produces invalid JSON with zero error at dump time — it fails later, only when parsed.
- json.dumps() indent= TypeError: can't multiply sequence by non-int (tested) — We measured json.dumps(indent=): floats raise a confusing TypeError, bool is silently accepted (bool is an int), negatives are clamped to zero with no error.
- csv.Error: field larger than field limit (131072) (tested) — We measured Python's csv field size limit: exactly 131072 characters (not bytes), global across every reader, and a negative limit silently breaks all parsing.
- csv.Error: new-line character seen in unquoted field (tested) — We measured csv's new-line error: an embedded raw newline outside quotes triggers it, and the error's own newline='' suggested fix often doesn't apply.
- csv DictReader/DictWriter Ragged Rows: the None Key (tested) — We measured csv on ragged rows: DictReader never raises (short rows get None, long rows nest under a literal None key) but DictWriter raises on an extra key.
- csv.Error: need to escape, but no escapechar set (tested) — We measured csv.writer's QUOTE_NONE: a field with the delimiter raises unless escapechar is set. Also: QUOTE_NONNUMERIC reading always returns float, never int.
- csv.Sniffer() Silently Guesses a Wrong Delimiter (tested) — We measured csv.Sniffer() pick the letter 'm' as delimiter for plain prose, zero error — it favors the most consistent per-line count, not the sensible char.
- csv.Sniffer().has_header() False Negative (tested) — We measured csv.Sniffer().has_header() return False for a real header like 'fruit,color' — it only detects a header when column types differ from the body.
- csv.reader Ignores lineterminator= (tested) — We measured csv.reader() ignoring lineterminator= entirely — only the writer uses it. Setting it on a reader doesn't error, it just fails to split rows.
- csv.register_dialect() Overwrites 'excel' (tested) — We measured csv.register_dialect('excel', ...) silently replacing the built-in dialect process-wide — but only some csv callers actually pick up the change.
- subprocess shell=True Drops List Args (tested) — We measured subprocess.run([...], shell=True) silently dropping every argument after the first — no error, exit code 0, just missing output.
- Popen.communicate(timeout=) Leaves Process Running (tested) — We measured Popen.communicate(timeout=1) raising TimeoutExpired while leaving the child process running — you have to kill it yourself.
- subprocess env= Replaces, Doesn't Merge (tested) — We measured subprocess.run(..., env={...}) wiping out every inherited variable, including PATH and HOME, not just adding to them.
- CalledProcessError.stderr Is None By Default (tested) — We measured catching CalledProcessError without capture_output= and finding e.stderr is None — the real error text went straight to the terminal instead.
- zlib decompressobj max_length Silent Data Loss (tested) — We measured decompressobj().decompress(data, max_length) silently returning 270 bytes instead of 11000 when unconsumed_tail isn't fed back in.
- zlib compressobj flush() Ends the Stream (tested) — We measured compressobj().flush() with no argument, then compress() again, raising "inconsistent stream state" — default flush ends the stream for good.
- zlib crc32 Per-Chunk Sums Are Wrong (tested) — We measured adding two zlib.crc32() chunk checksums together producing a completely wrong value — the correct way is to chain the running value forward.
- gzip Output Is Not Reproducible By Default (tested) — We measured gzip.compress() output differing on every run for the same input — a timestamp and filename land in the header, breaking hashes and build caches.
- subprocess text=True Decode Error Loses returncode (tested) — We measured subprocess.run(text=True) raising UnicodeDecodeError on one bad byte — the exception has no returncode, pid, or success status at all.
- subprocess shell=True kill() Leaves Child Running (tested) — We measured proc.kill() on a shell=True Popen only killing the /bin/sh wrapper — the actual command it ran kept running as an orphan process afterward.
- csv DictWriter Forgetting writeheader() (tested) — We measured csv.DictWriter skipping the header row silently when writeheader() isn't called — DictReader then treats your first real row as the header.
- zlib decompress() Drops Concatenated Streams (tested) — We measured zlib.decompress() on two concatenated zlib streams silently returning only the first one's data — the second stream is discarded with no error.
- subprocess stdin.write() Deadlock Without communicate() (tested) — We measured writing 1MB to proc.stdin without reading stdout concurrently hanging forever — the child's full output pipe blocks it from reading more input.
- csv QUOTE_NONNUMERIC Booleans Round-Trip Failure (tested) — We measured csv.writer(quoting=QUOTE_NONNUMERIC) writing True/False unquoted since bool is a number subtype — reading that same file back then crashes.
- configparser Percent Sign InterpolationSyntaxError (tested) — We measured configparser.ConfigParser() raising InterpolationSyntaxError on an ordinary value like '50% off' — the default interpolation treats % as special.
- configparser getboolean() Rejects enabled/disabled (tested) — We measured ConfigParser.getboolean() accepting yes/no/true/false/on/off/1/0 (case-insensitive) but raising ValueError on the equally common enabled/disabled.
- configparser ${} Syntax Silently Not Interpolated (tested) — We measured ConfigParser's default interpolation leaving ${section:option} unexpanded with no error, returning literal text. Fix: pass ExtendedInterpolation().
- configparser read() Missing File No Error (tested) — We measured ConfigParser.read() returning an empty list on a missing file, no exception, leaving the parser silently empty instead of raising FileNotFoundError.
- configparser remove_option() Silent No-op on DEFAULT Fallback (tested) — We measured remove_option() returning False and doing nothing on a [DEFAULT]-only key, even though has_option() and 'in' both say it's present.
- argparse type=bool Always True Except Empty String (tested) — We measured --flag type=bool parsing 'False', '0', and 'no' as True. Only an empty string parses False. Fix: action='store_true' or BooleanOptionalAction.
- argparse Subparsers Not Required by Default (tested) — We measured parse_args([]) succeeding with no sub-command chosen, silently omitting every sub-command-only argument instead of erroring at parse time.
- argparse Negative Number Positional Breaks With a -1-style Option (tested) — We measured a working 'value -5' positional failing with 'unrecognized arguments: -5' as soon as the parser gained any -1-style option. Fix: a -- separator.
- urlencode() List Value Without doseq Encodes str(list) (tested) — We measured urlencode({'a': [1,2,3]}) producing a=%5B1%2C+2%2C+3%5D instead of three repeated a= pairs, with no error. Fix: doseq=True.
- urljoin() //host Input Silently Switches Host (tested) — We measured urljoin(base, '//evil.example.com/x') returning a URL on evil.example.com, not the base's host, with no error. Risky if the 2nd arg is user input.
- argparse default Not Validated Against choices (tested) — We measured a default not in choices= passing through silently when the flag is omitted, but rejected the moment a user types that exact value explicitly.
- urllib.parse.quote() Double-Encoding Corrupts Already-Encoded Values (tested) — We measured quote() on an already-encoded string re-encoding the % sign itself, so caf%C3%A9 becomes caf%25C3%25A9 and decodes back wrong, no error.
- parse_qsl() Drops Empty Values By Default (tested) — We measured parse_qsl('a=1&b=&c=3') silently omitting b entirely instead of returning ('b', ''). Fix: keep_blank_values=True.
- urlparse() Without a Scheme Misreads the Host (tested) — We measured urlparse('example.com/path') putting it all in .path (.hostname None), and 'example.com:8080/path' reading 'example.com' as scheme, not host.
- tarfile.extractall() Path Traversal Still Not Blocked By Default (tested) — We measured extractall() writing a '../outside.txt' member outside the dest dir on Python 3.13, no exception -- just a warning. filter='data' blocks it.
- datetime.astimezone() on a Naive Value Silently Assumes Local Time (tested) — We measured .astimezone() on a naive UTC value returning a time off by the full UTC offset, no exception -- fixed with .replace(tzinfo=utc) first.
- Two Different DST Fall-Back Instants Compare Equal in datetime (tested) — We measured two zoneinfo-aware datetimes an hour apart in real UTC time (DST fall-back ambiguity) returning == True, equal hash(), and a 0:00:00 subtraction.
- shutil.copytree() Leaves a Partial Copy Behind When It Raises (tested) — We measured copytree() raising shutil.Error on one unreadable file but still leaving every other file it already copied sitting in the destination directory.
- shutil.make_archive() Stores Symlinks as Absolute Paths in tar Format (tested) — We measured make_archive() storing a symlink's absolute target in tar format while zip just followed it -- and filter='data' then refuses to extract that tar.
- isinstance(x, date) Silently Matches datetime Too (tested) — We measured isinstance(datetime.now(), date) returning True, so a dispatch function checking date before datetime silently misroutes every datetime value.
- tarfile.open() Write Mode Ignores the .tar.gz Extension (tested) — We measured tarfile.open('x.tar.gz', 'w') writing a plain tar despite the .gz name -- gzip.open() and system tar both reject the file as not gzipped.
- timedelta.days Is -1 for Any Negative Sub-Day Duration (tested) — We measured timedelta(hours=-1).days returning -1, not 0 -- any negative duration under a full day still reports .days as -1, which breaks naive age-check code.
- pathlib Path.exists() Returns False for a Dangling Symlink (tested) — We measured Path.exists() returning False for a symlink whose target is missing, even though is_symlink() is True and the entry still shows up in os.listdir().
- pathlib glob() Matches Hidden Dotfiles, glob Module Does Not (tested) — We measured Path.glob('*.txt') matching a hidden .txt file that glob.glob('*.txt') skips -- pathlib has no dotfile-skipping rule, unlike the glob module.
- pathlib Path.resolve() Does Not Detect a Symlink Loop by Default (tested) — We measured Path.resolve() default strict=False returning a symlink-loop path unchanged instead of raising -- the failure surfaces later when it's opened.
- pathlib Path.walk() Puts Symlinked Directories in files, Not dirs (tested) — We measured Path.walk() putting a symlinked directory in the files list, not dirs -- the opposite of os.walk(), which puts the same symlink in dirs by default.
- fnmatch Asterisk Matches Across Path Separators, Unlike glob (tested) — We measured fnmatch.fnmatch('temp/*.txt', ...) matching files deep under temp/ -- its * has no rule against matching a slash, unlike glob.
- difflib quick_ratio() Returns 1.0 for Completely Reordered Strings (tested) — We measured SequenceMatcher.quick_ratio() returning 1.0 for 'abcdefgh' vs its reverse, while the real ratio() is 0.125 -- quick_ratio ignores order entirely.
- difflib unified_diff() Glues Lines Together Without Trailing Newlines (tested) — We measured unified_diff() output becoming one garbled line when input came from split('\n') instead of splitlines(keepends=True) -- silently, no error.
- glob.glob() Silently Fails to Find a Filename Containing Brackets (tested) — We measured glob.glob() given the literal filename 'file[1].txt' returning 'file1.txt' instead -- [1] is parsed as a character class, not literal brackets.
- glob.glob(recursive=True) Does Not Detect a Symlink Loop (tested) — We measured glob.glob('**', recursive=True) walking ~40 levels into a symlink loop before ELOOP stopped it, returning 83 nested paths instead of stopping there.
- fnmatch Bracket Caret Is Literal, Not Negation (tested) — We measured fnmatch treating [^t] as a literal char class, not negation -- it matched files the regex-style pattern meant to exclude. Use [!t] instead.
- glob.glob() Over-Matches Filenames Containing * or ? (tested) — We measured glob.glob() on a file named 'data*.csv' silently pulling in 2 unrelated files -- the '*' expands as wildcard, not literal. Fix: glob.escape().
- difflib Differ Hint-Line Caret Misaligns on Wide Unicode Chars (tested) — We measured Differ.compare()'s '?' hint line pointing at the right char index but printing columns off in a terminal once CJK double-width chars appear.
- textwrap.dedent() Does Nothing on Mixed Tabs/Spaces (tested) — We measured textwrap.dedent() leaving text unchanged when lines mix tab and space indentation -- no common prefix exists, so nothing is stripped, no error.
- textwrap.shorten() Drops a Too-Long Word Entirely (tested) — We measured textwrap.shorten() returning only '[...]' with no original text when one word exceeds the width -- unlike wrap(), it never partially breaks it.
- textwrap Splits Hyphenated CLI Flags Mid-Name by Default (tested) — We measured textwrap splitting '--enable-verbose-logging' at an internal hyphen -- argparse's own --help output hits this bug. Fix: break_on_hyphens=False.
- itertools.groupby Groups Go Empty If Not Read Right Away (tested) — We measured itertools.groupby in Python 3.13.5: collecting (key, group) pairs first, reading later, returns empty lists, no error -- groups share one iterator.
- itertools.tee Silently Drops Items If You Reuse the Source (tested) — We measured itertools.tee in Python 3.13.5: calling next() on the original iterator after tee() silently removes that item from every tee copy too, no error.
- itertools.islice Start/Stop Are Relative, Not Fixed Indices (tested) — We measured itertools.islice in Python 3.13.5: calling islice(it, 2, 5) twice on one iterator with identical args returns two different slices.
- itertools.cycle Freezes the First Lap, Replays It Forever (tested) — We measured itertools.cycle in Python 3.13.5: it caches the first pass of a generator and replays it forever, even when the source would give fresh values.
- zip_longest Fillvalue None Looks Identical to Real None Data (tested) — We measured itertools.zip_longest in Python 3.13.5: a real None value and an exhausted-iterable fillvalue both give (x, None), no way to tell them apart.
- itertools.product() With No Arguments Returns One Result (tested) — We measured itertools.product in Python 3.13.5: an empty option list gives zero combinations, but zero arguments at all gives one empty-tuple result, not zero.
- itertools.chain() Silently Skips Flattening a List of Lists (tested) — We measured itertools.chain in Python 3.13.5: a list of lists comes back unflattened, no error -- use chain(*lists) or chain.from_iterable() instead.
- itertools.starmap() vs map(): The Confusing Missing-Argument Error (tested) — We measured passing a list of tuples to map() in Python 3.13.5: it fails with a missing-argument TypeError that never mentions tuples. starmap() is the fix.
- secrets.token_hex(n) Does Not Return a Length-n Token (tested) — We measured Python 3.13.5's secrets module: token_hex(16) returns 32 characters, not 16, and token_urlsafe(16) returns 22. Same n, three different lengths.
- Python Unicode: Identical-Looking Strings That Are Not Equal (tested) — We measured two Python strings that print as the same word 'cafe': one has length 4, the other length 5, == returns False, and a set treats them as two items.
- string.Template: $name_backup Greedily Eats Trailing Text (tested) — We measured Python 3.13.5's string.Template: $name_backup.txt is parsed as one placeholder, name_backup, not $name plus literal text -- and fails silently.
- secrets.SystemRandom.seed() Silently Does Nothing (tested) — We measured Python 3.13.5: secrets.SystemRandom().seed(42) raises no error but has zero effect -- reseeding to the same value gives different results each time.
- Python str.ljust() Misaligns CJK Text in Monospace Output (tested) — We measured Python 3.13.5: str.ljust() pads by character count, but CJK characters render two columns wide in a terminal, so padded text still misaligns.
- Python str.isdigit() Is True But int() Still Raises ValueError (tested) — We measured Python 3.13.5: a superscript '²' passes isdigit() as True, but int('²') raises ValueError -- isdigit() doesn't mean int() will work.
- string.capwords()'s sep Argument Disables Whitespace Splitting (tested) — We measured Python 3.13.5: string.capwords(sep='-') stops splitting on spaces entirely, so only the first word of each '-'-separated chunk gets capitalized.
- base64.b64decode() Silently Strips Invalid Characters by Default (tested) — We measured Python 3.13.5: base64.b64decode() ignores injected non-base64 characters and decodes fine, unless you pass validate=True.
- base64.b32decode() and b16decode() Reject Lowercase by Default (tested) — We measured Python 3.13.5: b32decode() and b16decode() raise binascii.Error on lowercase input unless you pass casefold=True.
- base64.b32decode() vs b32hexdecode(): Wrong Variant Decodes Silently (tested) — We measured Python 3.13.5: decoding standard Base32 with b32hexdecode() can return the wrong bytes with no error at all, for some inputs.
- Zero-Width Characters Survive str.strip() in Python (tested) — We measured Python 3.13.5: str.strip() leaves zero-width space (U+200B) in place because it's category Cf (Format), not whitespace.
- secrets.compare_digest() Is Not Constant-Time for Different-Length Inputs (tested) — We measured Python 3.13.5: secrets.compare_digest() runs ~10,000x faster when inputs differ in length than when they're the same length.
- ipaddress.ip_address() Rejects Leading Zeros, socket.inet_aton() Silently Treats Them as Octal (tested) — We measured Python 3.13.5: socket.inet_aton('0177.0.0.1') silently returns 127.0.0.1 (octal), while ipaddress.ip_address() rejects the same string outright.
- IPv4-Mapped IPv6 Addresses Bypass a Set-Based ipaddress Blocklist (tested) — We measured Python 3.13.5: '::ffff:127.0.0.1' in {IPv4Address('127.0.0.1')} is False, even though is_loopback correctly says True.
- A uuid.UUID Object Is Not Equal to Its Own String Form (tested) — We measured Python 3.13.5: uuid.uuid4() == str(uuid.uuid4()) is False, so a dict keyed by UUID objects can't be looked up by the matching string.
- uuid.uuid1() Leaks the Host's MAC Address and Exact Timestamp (tested) — We measured Python 3.13.5: a single uuid.uuid1() string lets anyone recover the generating machine's real MAC address and creation time to the microsecond.
- hashlib.shake_128/256 Require a Length Argument and Have No Fixed Size (tested) — We measured Python 3.13.5: shake_128().hexdigest() raises TypeError without a length argument, and can produce output of any requested length.
- Python Enum: A Duplicate Value Becomes a Silent Alias (tested) — We measured Python 3.13.5: giving two Enum members the same value makes the second one a silent alias -- it vanishes from iteration, len(), and repr().
- enum.IntFlag Silently Accepts Undefined Bits, enum.Flag Raises (tested) — We measured Python 3.13.5: IntFlag(8) on a 3-bit flag returns 8 with no error, while the equivalent Flag raises ValueError for the same invalid value.
- An IPv6 Zone ID Breaks Equality and Set Membership in ipaddress (tested) — We measured Python 3.13.5: ip_address('fe80::1%eth0') != ip_address('fe80::1'), so a zone-tagged address fails a blocklist set lookup for the same host.
- dataclasses: Default Instances Are Unhashable by Default (tested) — We measured Python 3.13.5: a plain @dataclass raises TypeError 'unhashable type', and unsafe_hash=True's hash changes after mutation, breaking lookup.
- ipaddress: is_private and is_global Are Not Always Opposites (tested) — We measured Python 3.13.5: 100.64.0.5 (CGNAT shared space) has is_private=False and is_global=False -- neither flag is True.
- dataclasses: compare=False Fields Still Show Up in repr() (tested) — We measured Python 3.13.5: two @dataclass instances with compare=False on a field compare equal via == while repr() shows their differing values.
- enum: auto() Gives Sequential Ints in Enum, Powers of 2 in Flag (tested) — We measured Python 3.13.5: enum.auto() yields 1,2,3 in a plain Enum but 1,2,4 in a Flag -- switching base classes silently changes every value.
- dataclasses: Mutable-Default Guard Only Covers list/dict/set (tested) — We measured Python 3.13.5: @dataclass blocks a list/dict/set default with ValueError, but a custom mutable default is silently shared across every instance.
- dataclasses: order=True Crashes Only When an Early Field Ties (tested) — We measured Python 3.13.5: sorted() on @dataclass(order=True) objects works fine until two items tie on the first field, then raises TypeError.
- hashlib: new() Is Case-Insensitive, Except for blake2b/blake2s (tested) — We measured Python 3.13.5: hashlib.new('SHA256') and hashlib.new('sha3-256') work fine, but hashlib.new('BLAKE2B') raises unsupported hash type.
- dataclasses: InitVar Defaults Leave a Stale Class Attribute (tested) — We measured Python 3.13.5: an InitVar field with a default silently returns that default, never the value passed in, instead of raising AttributeError.
- hmac: shake_128/shake_256 digestmod Raises 'no reason supplied' (tested) — We measured Python 3.13.5: hmac.new() with digestmod=shake_128 or shake_256 raises ValueError: no reason supplied, giving no hint why.
- decimal: Context.prec Counts Significant Digits, Not Decimal Places (tested) — We measured Python 3.13.5: summing seven $19.99 values under Context.prec=2 gives 1.4E+2 (140), not the exact 139.93 -- prec isn't decimal places.
- decimal: quantize() Defaults to Round-Half-to-Even, Not Round-Half-Up (tested) — We measured Python 3.13.5: Decimal('2.5').quantize(Decimal('1')) gives 2, not 3 -- the default rounding mode is banker's rounding, not round-half-up.
- decimal: Decimal(float) Bakes In Binary Floating-Point Imprecision (tested) — We measured Python 3.13.5: Decimal(0.1) is not 0.1 -- it's 0.1000000000000000055511151231257827021181583404541015625, unlike Decimal('0.1').
- decimal: NaN List Membership Depends on Object Identity, Not Value (tested) — We measured Python 3.13.5: Decimal('NaN') in [that_same_object] is True, but a second, equal-looking Decimal('NaN') in the same list is False.
- decimal: Mixing With float Raises on Arithmetic, Not on Comparison (tested) — We measured Python 3.13.5: Decimal('0.1') + 0.1 raises TypeError, but Decimal('0.1') == 0.1 and sorted() with a float silently run and can mislead.
- decimal: compare_total() Sorts NaN, Regular sorted() Raises (tested) — We measured Python 3.13.5: sorted() on a list containing Decimal('NaN') raises InvalidOperation, but compare_total() orders it without error.
- decimal: Subtracting Equal Values Can Yield -0 Under ROUND_FLOOR (tested) — We measured Python 3.13.5: Decimal('5.00') - Decimal('5.00') gives 0.00 normally, but -0.00 under ROUND_FLOOR -- same inputs, different sign.
- decimal: Disabling Traps Reintroduces Infinity and NaN Silently (tested) — We measured Python 3.13.5: Decimal('1')/Decimal('0') raises by default, but with the DivisionByZero trap off, it silently returns Infinity.
- decimal: as_tuple()'s exponent Is a String for NaN/Infinity (tested) — We measured Python 3.13.5: as_tuple()'s exponent is an int for finite Decimals but 'n'/'N'/'F' for NaN/sNaN/Infinity, breaking digits*10**exponent math.
- decimal: Context.copy() Is Independent but Never Equal (tested) — We measured Python 3.13.5: Context.copy() makes an independent copy, but two identical-setting Contexts still compare unequal and hash differently (no __eq__).
- fractions: Two-Arg Constructor Rejects float/Decimal (tested) — We measured Python 3.13.5: Fraction(0.5) works as one argument, but Fraction(1, 0.5) with a float numerator/denominator raises TypeError.
- fractions: Fraction ** Fraction Always Returns float (tested) — We measured Python 3.13.5: Fraction(9,1)**Fraction(1,2) returns float 3.0, not Fraction, even for a rational result -- Fraction**Fraction always returns float.
- fractions: limit_denominator() Breaks Ties Toward Floor (tested) — We measured Python 3.13.5: limit_denominator() rounds halfway values toward floor (1.5->1), not round-half-even like round() (1.5->2) -- every tie disagrees.
- fractions: NaN and Infinity Raise Different Exception Types (tested) — We measured Python 3.13.5: Fraction(nan) raises ValueError, but Fraction(inf) raises OverflowError instead -- except ValueError silently misses Infinity.
- fractions: round() Without ndigits Returns int, Not Fraction (tested) — We measured Python 3.13.5: round(Fraction(5,2)) returns a plain int (2), but round(Fraction(5,2), 0) returns a Fraction (2) -- same value, different type.
- fractions: String Constructor Rejects a Negative Denominator (tested) — We measured Python 3.13.5: Fraction(3, -4) normalizes the sign fine, but the equivalent string Fraction("3/-4") raises ValueError instead.
- fractions and decimal: Compare Equal, Can't Add (tested) — We measured Python 3.13.5: Fraction(1,2) == Decimal("0.5") is True and sorted() mixes them fine, but Fraction(1,2) + Decimal("0.5") raises TypeError.
- fractions: limit_denominator() Default Silently Approximates (tested) — We measured Python 3.13.5: Fraction(1, 3000000).limit_denominator() -- called with no argument -- silently returns 0, not the original value.
- decimal and fractions: Constructor Support Only Goes One Way (tested) — We measured Python 3.13.5: Fraction(Decimal('0.1')) builds fine, but Decimal(Fraction(1,2)) raises TypeError -- the conversion only works one direction.
- fractions: Whole-Number Fraction Still Can't Be Used as an Index (tested) — We measured Python 3.13.5: lst[Fraction(4,1)] raises TypeError even though Fraction(4,1) is a whole number -- Fraction never implements __index__.
- statistics: mean() Can't Mix Decimal With Other Types (tested) — We measured Python 3.13.5: statistics.mean([Fraction(1,2), 0.5]) works, but mixing Decimal with float or Fraction raises TypeError: don't know how to coerce.
- statistics: harmonic_mean() Returns 0 If Any Value Is 0 (tested) — We measured Python 3.13.5: harmonic_mean([5, 0, 10]) returns 0 -- a single zero among large values zeroes out the entire result, no error or warning.
- statistics: NormalDist Subtraction Has the Same Spread as Addition (tested) — We measured Python 3.13.5: NormalDist(10,2) - NormalDist(5,1) has the same stdev as NormalDist(10,2) + NormalDist(5,1) -- subtracting never reduces spread.
- statistics: quantiles() Can Extrapolate Past the Data's Range (tested) — We measured Python 3.13.5: statistics.quantiles(range(1,11), n=100) returns values as low as 0.11 and as high as 10.89 -- outside the data's actual 1-10 range.
- statistics: covariance() Stays Silent on Constant Input (tested) — We measured Python 3.13.5: covariance() returns 0.0 for constant input, but correlation() and linear_regression() raise StatisticsError on the same data.
- statistics: quantiles(method="inclusive") Still Avoids Min/Max (tested) — We measured Python 3.13.5: quantiles(method='inclusive') fixes the default's out-of-range extrapolation, but its cut points never equal the data's min or max.
- statistics: fmean() Reintroduces Float Error on Decimal (tested) — We measured Python 3.13.5: mean() on Decimal data stays exact (2.2), but fmean() on the identical data returns a float with rounding error (2.1999999999999997).
- statistics: A Wrong xbar Silently Corrupts variance() (tested) — We measured Python 3.13.5: variance(data, xbar=100) accepts a precomputed mean with no validation, silently returning 11763.75 instead of the correct 2.5.
- statistics: stdev() Crashes on NaN, variance() Doesn't (tested) — We measured Python 3.13.5: variance([1,2,float('nan'),4]) correctly returns nan, but stdev() on the identical data raises AttributeError instead.
- statistics: covariance() Always Returns float, Unlike variance() (tested) — We measured Python 3.13.5: variance() on Fraction data stays exact, but covariance() on Fraction data always returns float, with no square root involved.
- statistics: correlation() Crashes on Pure Decimal Input (tested) — We measured Python 3.13.5: mean()/variance() work fine on Decimal data, but correlation(), covariance(), and linear_regression() all raise TypeError on it.
- statistics: kde() Returns a Closure That Can't Be Pickled (tested) — We measured Python 3.13.5: statistics.kde() returns a local closure function, so pickling it for caching or multiprocessing raises AttributeError.
- heapq.merge() Silently Returns Wrong Results on Unsorted Input (tested) — We measured Python 3.13.5: heapq.merge() assumes every input is already sorted. An unsorted input gives wrong, non-sorted output -- no exception, no warning.
- struct: Native Format Padding Silently Breaks unpack() (tested) — We measured Python 3.13.5: struct.pack('bi',...) with no prefix adds invisible padding -- unpack('<bi',...) then errors, or returns a wrong phantom field.
- array: frombytes() Skips the Overflow Validation Every Other Entry Point Enforces (tested) — We measured Python 3.13.5: append()/extend()/fromlist() raise OverflowError on out-of-range ints, but frombytes() silently wraps the value instead.
- bisect: key= Only Transforms the List, Never the Search Value (tested) — We measured Python 3.13.5: bisect_left(a, x, key=f) applies f() to every element of a, never to x -- the wrong form of x errors, or gives a wrong index.
- bisect: hi < lo Silently Corrupts insort's Sort Order (tested) — We measured Python 3.13.5: bisect validates a negative lo but never checks hi < lo -- insort_right can insert into the middle of a sorted list with zero error.
- struct: unpack_from() Silently Ignores Trailing Bytes unpack() Rejects (tested) — We measured Python 3.13.5: struct.unpack() errors on extra trailing bytes, but unpack_from() silently ignores anything past what it needs on the same data.
- contextlib: closing() Masks the Real Error If close() Is Missing (tested) — We measured Python 3.13.5: contextlib.closing() checks for close() only at exit -- if missing, AttributeError buries the real exception raised inside the block.
- contextlib: ExitStack Silently Drops All But One Callback Error (tested) — We measured Python 3.13.5: when multiple ExitStack callbacks raise, only the last-executed one propagates -- the rest vanish, not even chained as __context__.
- contextlib: redirect_stdout() Redirects Every Thread, Not Just Yours (tested) — We measured Python 3.13.5: redirect_stdout() reassigns the global sys.stdout -- a concurrent threads print() calls get silently captured into your buffer too.
- contextlib: suppress(GeneratorExit) Breaks Generator close() (tested) — We measured Python 3.13.5: suppressing GeneratorExit then reaching another yield makes a generators close() raise RuntimeError instead of closing cleanly.
- heapq: A Single NaN Silently Corrupts the Whole Heap Invariant (tested) — We measured Python 3.13.5: heapify()/heappush() with one NaN gives no error, but heappop() can return even the non-NaN values out of order.
- shelve: Without writeback=True, a Mutation Vanishes in the Same Session (tested) — We measured Python 3.13.5: shelve without writeback=True returns a fresh object every read, so in-place mutations vanish instantly, same session.
- weakref: WeakValueDictionary Iteration Silently Skips GC'd Entries (tested) — We measured Python 3.13.5: dropping the last strong ref during iteration silently removes it from a WeakValueDictionary, no RuntimeError, unlike a plain dict.
- weakref.finalize(obj, obj.method) Silently Keeps obj Alive Forever (tested) — We measured Python 3.13.5: passing a bound method as the finalize callback keeps a strong ref, so the object is never collected and cleanup never runs early.
- calendar.itermonthdates() Crashes on December 9999 -- Sibling Methods Don't (tested) — We measured Python 3.13.5: itermonthdates(9999,12) raises ValueError, while itermonthdays2/3/4 return the identical month grid fine -- same data, no crash.
- functools.lru_cache Confuses 1 and True in Some Calls, Not Others (tested) — We measured Python 3.13.5: lru_cache(g)(1,0) then g(True,False) returns the cached int result, not a fresh bool one -- same hash, same ==, no error.
- functools.partial Objects With Identical Args Are Never Equal (tested) — We measured Python 3.13.5: two functools.partial(f,1,2) objects, same func and args, are not ==, hash differently, and both land in a set meant to dedupe them.
- functools.lru_cache Treats Keyword Argument Order as Part of the Cache Key (tested) — We measured Python 3.13.5: f(a=1,b=2) and f(b=2,a=1) are the same call, but lru_cache caches them as two separate entries -- kwarg order changes the cache key.
- functools.cached_property Writes to a Frozen Dataclass's __dict__ Anyway (tested) — We measured Python 3.13.5: Point(3,4) is frozen -- p.x=10 raises FrozenInstanceError -- but p.magnitude (a cached_property) writes to p.__dict__ with no error.
- functools.partialmethod Binds One Shared Mutable Object to Every Instance (tested) — We measured Python 3.13.5: partialmethod(configure, options={}) binds the same dict to every instance and call -- mutating it in one leaks into all others.
- functools.singledispatchmethod Register on a Subclass Leaks Into the Base Class (tested) — We measured Python 3.13.5: registering on a subclass's inherited singledispatchmethod changes the base class's dispatch too -- one shared registry.
- functools.cached_property Lost Its Thread-Safety Lock in Python 3.12 (tested) — We measured Python 3.13.5: 10 threads hitting one cached_property at once ran the getter 10 times, not once -- the pre-3.12 per-instance lock is gone.
- functools.wraps on a functools.partial Copies the Wrong __doc__/__module__ (tested) — We measured Python 3.13.5: wraps() on a functools.partial object silently sets __doc__/__module__ to generic partial-class values, not the wrapped call's own.
- copy.deepcopy Copies a functools.cached_property's Stale Cached Value (tested) — We measured Python 3.13.5: deepcopy copies a cached_property's stored value as plain data -- it never recomputes, even after the source attribute changed.
- inspect.getmembers Silently Skips AttributeError but Crashes on Any Other Exception (tested) — We measured Python 3.13.5: a property raising AttributeError is silently skipped by getmembers(), but ValueError (or any other exception) aborts the whole call.
- collections.abc .register() Makes isinstance Pass But Grants No Methods (tested) — We measured Python 3.13.5: Mapping.register(Cls) makes isinstance(obj, Mapping) True, but obj.get()/.keys() still don't exist -- no code is granted.
- collections.abc.Sequence __iter__/in Loop Forever Without IndexError (tested) — We measured Python 3.13.5: Sequence's mixin __iter__/__contains__ call __getitem__(0,1,...) until IndexError. Return None instead, both loop forever.
- collections.abc.Set operators raise TypeError without _from_iterable override (tested) — We measured Python 3.13.5: Set's &, |, -, ^ build results via cls(iterable) -- an __init__ needing a 2nd arg makes all of them raise TypeError.
- collections.abc.Hashable isinstance() Cache Goes Stale (Tested) — We measured Python 3.13.5: isinstance(x, Hashable) keeps returning True after __hash__ is set to None on the class, even though hash(x) now raises TypeError.
- collections.abc.Mapping __eq__ Requires Hashable Keys, Nothing Else Does (tested) — We measured Python 3.13.5: a Mapping with unhashable keys works for get()/keys()/items(), but m == m raises TypeError -- __eq__ builds a dict() internally.
- io.TextIOWrapper Crashes on a Non-Blocking Raw Stream's None (tested) — We measured Python 3.13.5: a non-blocking raw stream's None read result works fine via BufferedReader, but TextIOWrapper.read() on it raises TypeError.
- io.TextIOWrapper.detach() Leaves the Raw Stream Past Your Last Read (tested) — We measured Python 3.13.5: reading 5 chars via TextIOWrapper then detach() leaves the raw stream at byte 54 of 54, not byte 5 -- read-ahead, not text position.
- io.TextIOWrapper.reconfigure() Mid-Write Encoding Switch Is Silent (tested) — We measured Python 3.13.5: reconfigure(encoding=...) is unrestricted on the write side, letting a file end up with mixed byte encodings and no warning.
- io.TextIOWrapper.reconfigure(errors=...) Mid-Write Silently Drops Characters (tested) — We measured Python 3.13.5: reconfigure(errors=...) is unrestricted on the write side -- switching to errors=ignore mid-stream silently drops characters.
- io.TextIOWrapper tell()/seek() Cookie Arithmetic Silently Skips Characters (tested) — We measured Python 3.13.5: adding 1 to a tell() cookie can crash, but adding 2 lands on a valid boundary and silently skips a character with no error.
- io.BufferedWriter Infinite-Loops on write() Returning 0 (tested) — We measured Python 3.13.5: a raw stream's write() returning 0 for non-empty data makes BufferedWriter spin forever at 100% CPU -- no error, no output.
- io.BufferedReader.peek() Leaves .raw Mid-Read-Ahead (tested) — We measured Python 3.13.5: peek() doesn't advance the buffered position, but it silently advances the raw stream -- reading .raw directly afterward skips data.
- with-Block close() Exception Masks the Original Error (tested) — We measured Python 3.13.5: if close() fails as a with block exits on an exception, the close() error replaces it -- the real error only survives in __context__.
- io.BufferedReader.read1() Turns a Non-Blocking None Into b'' (tested) — We measured Python 3.13.5: read() correctly returns None for a non-blocking stream with no data ready, but read1() returns b'' instead -- identical to real EOF.
- shutil.copyfileobj() Treats None Like EOF (Tested) — We measured Python 3.13.5: copyfileobj() stops after one read() returning None -- identical to real EOF -- silently truncating the copy.
- gzip/bz2/lzma Crash on a Non-Blocking None (Tested) — We measured Python 3.13.5: gzip, bz2 and lzma all crash on a single transient None read -- even with valid compressed data waiting on the very next call.
- tarfile/zipfile Crash on a Non-Blocking None (Tested) — We measured Python 3.13.5: tarfile and zipfile both crash on one transient None read from a non-blocking stream, blaming a perfectly valid archive.
- io.TextIOWrapper.readline() Silently Treats None as EOF (tested) — We measured Python 3.13.5: TextIOWrapper.read() crashes with TypeError on a non-blocking None, but .readline() and iteration silently return '' / stop instead.
- ElementTree.parse() Crashes on a Non-Blocking None (tested) — We measured Python 3.13.5: ElementTree.parse() raises 'no element found' on one transient non-blocking None read, even with complete valid XML one call away.
- tomllib.load() Misdiagnoses a Non-Blocking None (tested) — We measured Python 3.13.5: tomllib.load() blames 'must be opened in binary mode' on a transient None read, even though the stream already is binary.
- email.message_from_binary_file() Silently Returns Empty on None (tested) — We measured Python 3.13.5: message_from_binary_file() silently returns an empty message on a transient None read, even with a complete valid email waiting.
- plistlib.load() Crashes on a Non-Blocking None (tested) — We measured Python 3.13.5: plistlib.load() crashes with AttributeError: 'NoneType' object has no attribute 'startswith' on a transient non-blocking None read.
- http.client.HTTPResponse Mistakes None for RemoteDisconnected (tested) — We measured Python 3.13.5: HTTPResponse.begin() raises RemoteDisconnected on a transient non-blocking None read, not an actual closed connection.
- wave.open() Crashes on a Non-Blocking None (tested) — We measured Python 3.13.5: wave.open() crashes with TypeError: object of type NoneType has no len() on a transient non-blocking None read.
- smtplib.getreply() Mistakes None for SMTPServerDisconnected (tested) — We measured Python 3.13.5: smtplib.getreply() raises SMTPServerDisconnected on a transient non-blocking None read, not an actual closed connection.
- poplib._getline() Mistakes None for EOF (tested) — We measured Python 3.13.5: poplib's _getline() raises error_proto('-ERR EOF') on a transient non-blocking None read, not an actual closed connection.
- json.load() Crashes on a Non-Blocking None (tested) — We measured Python 3.13.5: json.load() crashes with TypeError: JSON object must be str, bytes or bytearray, not NoneType on a transient None read.
- base64.encode()/decode() Silently Return Empty Output on None (tested) — We measured Python 3.13.5: both base64.encode() and base64.decode() silently write zero bytes of output on a transient non-blocking None read.
- csv.reader() Crashes with a Wrong Text-Mode Error on None (tested) — We measured Python 3.13.5: csv.reader() crashes blaming text mode when its iterable yields a single None, even with valid CSV rows right behind it.
- configparser.read_file() Stringifies a None Line as Text (tested) — We measured Python 3.13.5: configparser.read_file() never checks line types -- a None line becomes the literal text 'None' and gets blamed in the parse error.
- quopri.decode() Crashes with a Raw binascii TypeError on None (tested) — We measured Python 3.13.5: quopri.decode() passes a transient None read to binascii.a2b_qp(), crashing with a TypeError that never mentions quopri or files.
- http.cookiejar's MozillaCookieJar Blames None on File Format (tested) — We measured Python 3.13.5: MozillaCookieJar.load() blames a transient None read on the cookie file's format, not the real non-blocking-stream cause.
- codecs.StreamReader Crashes Concatenating None to Its Byte Buffer (tested) — We measured Python 3.13.5: codecs.StreamReader (codecs.open's encoding engine) crashes concatenating a transient None read straight into its byte buffer.
- http.server Silently Drops a Valid Request on a Transient None (tested) — We measured Python 3.13.5: BaseHTTPRequestHandler silently drops a complete, valid HTTP request on one transient None -- no error, no response, no log line.
- http.client.HTTPResponse.read() Permanently Closes the Connection on None (tested) — We measured Python 3.13.5: HTTPResponse.read(amt) returns None on a transient read AND closes the connection, so even retrying read() can't recover the data.
- xmlrpc.client ExpatError "no element found" on a Valid Response (tested) — We measured Python 3.13.5: one transient None mid-body makes ServerProxy raise ExpatError "no element found: line 1, column 0" on a valid XML-RPC reply.
- http.client resp.read() on a Transient None: 3 Different Failures (tested) — We measured Python 3.13.5: one transient None makes resp.read() raise TypeError, IncompleteRead, or return None, depending on the body's framing.
- IncompleteRead and "Connection broken: IncompleteRead" in Python (tested) — We measured urlopen and requests on bodies cut short: requests calls it ChunkedEncodingError even when not chunked, and Retry(read=3) never retries it.
- python -m http.server with CORS (tested) — python -m http.server has no CORS flag. Tested drop-in script that adds Access-Control-Allow-Origin and answers the OPTIONS preflight header-only fixes miss.
- Python configparser Case Sensitive Keys: optionxform (tested) — We measured Python 3.13.5: ConfigParser lowercases keys, write() saves them that way, Port and port collide. optionxform = str fixes it if set before read().
- ExpatError / ParseError: no element found: line 1, column 0 (tested) — Every cause measured in Python 3.13.5: column 0 means the parser got zero bytes (empty file, file already read, no seek(0)); later columns mean truncated XML.
- JSONDecodeError: Expecting value: line 1 column 1 (char 0) in Python (tested) — Every cause measured in Python 3.13.5 and requests 2.32.3: empty body, HTML error page, JSONP, file already read. How to find which one and fix it.
- Python urllib HTTP Error 403: Forbidden (User-Agent, tested) — urlopen() sends User-Agent: Python-urllib/3.13 and requests sends python-requests/2.32.3, which many sites block. Measured fix and what a 403 after that means.
- Python [SSL: WRONG_VERSION_NUMBER] wrong version number (tested) — Reproduced [SSL: WRONG_VERSION_NUMBER] in Python 3.13.5: https:// to a plain-HTTP port, or an https:// proxy URL for an HTTP proxy. Not a TLS version problem.
- BadZipFile: File is not a zip file in Python (tested) — Measured in Python 3.13.5: empty files, saved HTML pages, truncated downloads and renamed CSVs all raise it. Even a truncated zip starting with PK fails.
- _csv.Error: line contains NUL (tested on Python 3.13) — Python 3.11+ no longer raises line contains NUL: csv keeps the \x00 in your fields silently. We measured the UTF-16 cause and two fixes that work.
- ValueError: time data does not match format (strptime, tested) — We measured Python strptime errors: trailing newlines, Z timestamps, %H with PM silently giving AM, %Z dropping the zone. Fixes that work, tested.
- TypeError: unhashable type: 'list' (tested fixes) — We measured where Python raises unhashable type 'list' / 'dict' / 'set' (keys, sets, lookups, lru_cache, Counter) and the tuple fixes that work.
- RuntimeError: Event loop is closed (asyncio, tested) — We reproduced asyncio's Event loop is closed with a client reused across asyncio.run() calls, plus the one-loop async with fix. Python 3.13, tested.
- ConnectionRefusedError: [Errno 111] Connection refused (tested) — We measured Python's Errno 111 Connection refused (wrong address, ::1 vs 127.0.0.1, server not up) and Errno 104 reset by peer, with fixes that work.
- SSL: CERTIFICATE_VERIFY_FAILED in Python (tested) — We measured Python's CERTIFICATE_VERIFY_FAILED reasons, the new 3.13 key usage error, and why SSL_CERT_FILE fixes urllib but not requests.
- ValueError: math domain error (tested) — We measured which math calls raise math domain error (sqrt, log, acos, pow), the float rounding case that hits acos at 1.0000000000000002, and fixes.
- ValueError: substring not found (tested) — We measured Python's substring not found: index() vs find(), invisible \xa0 spaces and accents, and why switching to find() silently slices wrong data.
- TypeError: 'int' / 'NoneType' object is not iterable (tested) — We measured Python's object is not iterable errors: int (use range), NoneType (missing return, list.sort()), cannot unpack non-iterable, with fixes.
- ImportError: cannot import name (circular import, tested) — We measured Python's cannot import name: circular imports (where 3.13 gives a misleading 'consider renaming' hint), shadowing files, typos. Fixes tested.
- PermissionError: [Errno 13] Permission denied (tested) — We measured Python's Errno 13 Permission denied: read-only files, system folders, ports under 1024, and the folder-as-file mistake. Fixes, no sudo needed.
- FileNotFoundError: [Errno 2] No such file or directory (tested) — We measured why Python can't find a file that exists: working directory vs script folder, trailing spaces, and ~ not expanded. Path(__file__) fix tested.
- AttributeError: can't set attribute / property has no setter (tested) — We measured Python's read-only attribute errors: @property with no setter, assignment in __init__, namedtuple, frozen dataclass, and two setter mistakes.
- binascii.Error: Incorrect padding (base64, tested) — We measured Python's base64 Incorrect padding error: the one-line padding fix, JWTs and base64url, and inputs that decode to wrong bytes with no error.
- ImportError: attempted relative import with no known parent package (tested) — We measured Python's relative import error: running a file vs python -m, where to run from, why removing the dot breaks -m, and a misleading -m hint.
- struct.error: unpack requires a buffer of N bytes (tested) — We measured the four causes of Python's struct unpack buffer error: native alignment padding, a short last read, too many bytes, and text-mode writes.
- multiprocessing: Can't pickle local object (tested) — We measured Python multiprocessing pickling errors: nested functions, lambdas, objects holding locks, and worker exceptions. partial and __getstate__ fixes.
- OverflowError: math range error (tested) — We measured Python's float overflow: where math.exp breaks, three different OverflowError messages, cases that silently return inf, and stable fixes.
- __getattr__ RecursionError: maximum recursion depth exceeded (tested) — We measured why a dict-backed __getattr__ hits RecursionError on copy and pickle, why hasattr breaks, and the fix. Plus the __getattribute__ version.
- SyntaxError: 'await' outside function (tested) — We measured Python's await SyntaxErrors: top-level await, await in a regular def or lambda, the asyncio.run fix, and why deleting await silently does nothing.
- SyntaxError: 'return' outside function / 'break' outside loop (tested) — We measured Python's return/break placement SyntaxErrors: dedented lines, break in a helper, the TabError case, and sys.exit() for stopping a script early.
- SyntaxError: invalid decimal literal / unterminated string literal (tested) — We measured the causes of Python's invalid decimal literal and unterminated string literal SyntaxErrors, including a caret that points at the wrong spot.
- shutil.rmtree PermissionError: [Errno 13] (tested) — We measured why shutil.rmtree raises PermissionError on Linux (directory write permission, not the file), why ignore_errors hides it, and an onexc fix.
- UnboundLocalError: cannot access local variable (tested) — We measured Python's UnboundLocalError (local variable referenced before assignment): += on globals, later assignments, one-branch variables, and fixes.
- NameError: name is not defined (tested) — We measured the causes of Python's NameError: typos, missing imports, calling before def, self-referencing class annotations, and deleted except variables.
- EOFError: Ran out of input / EOF when reading a line (tested) — We measured Python's EOFError: pickle.load on empty or unflushed files (Ran out of input) and input() with no stdin (EOF when reading a line), with fixes.
- BrokenPipeError: [Errno 32] Broken pipe (tested) — We measured Python BrokenPipeError [Errno 32]: piping into head, sockets whose peer closed, subprocess stdin, and the two fixes (catch + dup2, SIGPIPE).
- UnicodeEncodeError: 'charmap' codec can't encode character (tested) — We measured Python's UnicodeEncodeError (charmap, ascii): file writes without encoding, print() and PYTHONIOENCODING, errors= options, and logging.
- FileExistsError: [Errno 17] File exists (tested) — We measured Python FileExistsError [Errno 17]: mkdir twice, exist_ok over a file, open mode 'x', symlink and copytree, with the fix for each.
- IsADirectoryError: [Errno 21] Is a directory (tested) — We measured Python IsADirectoryError [Errno 21]: open() on a folder, an empty filename in os.path.join, listdir subfolders, and os.remove on directories.
- RuntimeError: generator raised StopIteration (tested) — We measured Python's RuntimeError: generator raised StopIteration (PEP 479): bare next() in generators, the fixes, and how map() silently truncates instead.
- TypeError: 'module'/'int'/'str' object is not callable (tested) — We measured Python's object is not callable errors: 'module' (import datetime), shadowed sum/list/str, properties, dicts, x(y+1), and 'NoneType'.
- TypeError: got multiple values for argument (tested) — We measured Python's TypeError got multiple values for argument: positional + keyword clashes, missing self, **kwargs duplicates, and super().__init__.
- IndexError: pop from empty list (tested) — We measured Python's IndexError pop from empty list, the deque/heapq/dict/set variants, stack underflow, and popping while iterating, with fixes.
- LookupError: unknown encoding (tested) — We measured Python's LookupError unknown encoding: utf8mb4, ansi, unicode names, codecs.lookup aliases, email charsets, and how requests hides it.
- IndexError: no such group (Python re, tested) — We measured Python re's IndexError no such group: missing group numbers and names, re.sub invalid group reference, \10 vs \g<1>0, and None groups.
- ValueError: too many values to unpack (tested) — We measured Python's too many / not enough values to unpack: split() rows, dicts without .items(), return values, *rest, partition, and nested unpacking.
- ValueError: invalid literal for int() with base 10 (tested) — We measured Python's invalid literal for int() with base 10: empty strings, decimals, commas, hex, what int() accepts, rounding, and safe conversion.
- TypeError: missing 1 required positional argument (tested) — We measured Python's missing 1 required positional argument: methods called on the class, __init__, Thread args, super().__init__ and decorators.
- TypeError: can't compare offset-naive and offset-aware datetimes (tested) — We measured Python's naive vs aware datetime TypeError: utcnow() vs parsed Z timestamps, why == silently returns False, and replace() vs astimezone().
- Python AssertionError and assert not working with -O (tested) — We measured Python's AssertionError: reading the traceback, python -O and PYTHONOPTIMIZE silently deleting asserts, and the always-true tuple assert.
- NotImplementedError vs NotImplemented in Python (tested) — We measured NotImplementedError vs NotImplemented: un-overridden methods, abstractmethod, why __eq__ must return NotImplemented, and raise NotImplemented.
- KeyboardInterrupt / Ctrl+C not working in Python (tested) — We sent Ctrl+C to Python scripts and measured why KeyboardInterrupt isn't caught: bare except, threads that keep running, asyncio CancelledError, SIG_IGN.
- asyncio TimeoutError and CancelledError (tested) — We measured asyncio TimeoutError: empty message, wait_for vs asyncio.timeout, CancelledError inside the block, and the swallowed cancel that hides a timeout.
- requests ReadTimeout: Read timed out (tested) — We measured requests ReadTimeout: per-read vs total timeout, (connect, read) tuples, and why Retry turns ReadTimeout into ConnectionError for GET.
- sqlite3.OperationalError: near X: syntax error (tested) — We measured the causes of sqlite3 near X: syntax error in Python: reserved words like order, %s placeholders, ? for table names, quotes in f-strings.
- Python logging not printing to console or file (tested) — We measured why Python logging shows nothing: default WARNING level, basicConfig silently ignored (force=True), logger vs handler level, missing log file.
- logging TypeError: not all arguments converted (tested) — We measured Python's '--- Logging error --- TypeError: not all arguments converted': print-style args, {} placeholders, %% for percent, silent drops.
- python venv: ensurepip is not available (tested) — We measured the Debian venv error 'ensurepip is not available': the leftover broken venv, a no-sudo fix with get-pip.py, and externally-managed-environment.
- argparse: unrecognized arguments / arguments are required (tested) — We measured Python argparse 'unrecognized arguments' and 'the following arguments are required': exit code 2, Jupyter argv, parse_known_args, typo prefixes.
- ImportError: bad magic number (tested) — We measured Python's ImportError: bad magic number: .pyc files from another version, files that aren't bytecode, and why __pycache__ isn't the cause.
- ImportError: cannot import name (unknown location) (tested) — We measured Python's 'cannot import name ... (unknown location)': a folder with no __init__.py, an uninstalled library hidden by an empty folder, and leftovers.
- OSError: [Errno 9] Bad file descriptor (tested) — We measured Python's Errno 9 Bad file descriptor: double close, fdopen sharing, buffered writes failing at close(), closed sockets, and silent fd reuse.
- configparser.NoSectionError: No section (tested) — We measured configparser's NoSectionError: read() silently skipping a file at a cwd-relative path, case-sensitive sections, DEFAULT, BOM files, fallback=.
- Python import from another directory: No module named (tested) — Why Python can't import from another directory: we measured sys.path[0] for scripts vs -m, PYTHONPATH, a __file__ path fix, and the -m sibling trap.
- Python sqlite3 error handling: exceptions and error codes (tested) — Which sqlite3 exception you get for each error: IntegrityError, OperationalError, ProgrammingError, plus sqlite_errorname codes, measured on Python 3.13.
- Python OSError errno codes list (tested) — Python OSError error codes measured on Linux: errno number, name, and the exception subclass for 14 common codes, plus e.errno handling and IOError vs OSError.
- Python argparse custom error message (tested) — We measured four ways to customize argparse errors: parser.error(), ArgumentTypeError (ValueError text is thrown away), overriding error(), exit_on_error.
- Python requests: get the HTTP error response message (tested) — We measured requests not raising on 4xx/5xx, HTTPError hiding the server's message, and reading it from e.response.json()/.text; plus urllib's e.read().
- shutil copy/move PermissionError: [Errno 13] (tested) — We measured shutil copy/move Permission denied: read-only folders, copy vs move over read-only files, and why copy() fails on a rerun (it copies mode bits).
- Python pickle error: cannot pickle object (tested) — We measured Python pickle errors for lambdas, nested functions, locks, files and generators: three different exception types, plus the __getstate__ fix.
- TypeError: 'module' object is not callable (tested) — We measured Python's 'module' object is not callable: datetime/pprint vs import style, your own same-named file, and the 3.13 'Did you mean' hint.
- AttributeError: module has no attribute (tested) — We measured Python's 'module has no attribute': submodule not imported, a file shadowing the module, a circular import with a misleading hint, typos.
- decimal.InvalidOperation ConversionSyntax (tested) — We measured Python's decimal.InvalidOperation: unparseable strings, why except ValueError misses it, quantize past precision, and 0/0 vs 1/0.
- urllib.error.URLError: urlopen error (tested) — We measured Python's urllib URLError: what e.reason tells you, why HTTPError must be caught first, read timeouts that escape it, unknown url type.
- NoneType object cannot be interpreted as an integer (tested) — We measured Python's 'NoneType object cannot be interpreted as an integer': a missing return, which calls raise it, which accept None silently.
- Python MemoryError reading a large file (tested) — We measured Python MemoryError on a 300 MB file under a 200 MB cap: read() and readlines() fail, line iteration works unless the file has no newlines.
- BlockingIOError [Errno 11] Resource temporarily unavailable (tested) — We measured Python's errno 11 (EAGAIN): recv on a non-blocking socket, settimeout(0), flock with LOCK_NB, and how to wait with selectors instead.
- OSError [Errno 22] Invalid argument (tested) — We measured Python's OSError errno 22: colons in filenames from datetime, negative seek, a directory moved into itself, and negative os sizes.
- Python print error message and traceback in except (tested) — We measured printing Python exceptions: print(e) can be empty, repr drops the filename, how to get the line number, format_exc and logging.exception.
- Python f-string errors: unmatched '[' and format errors (tested) — We compiled the same f-strings on Python 3.13 and 3.11: unmatched '[', empty braces, missing '}', bad conversions, and format spec errors at run time.
- Python queue.Empty exception (tested) — We measured Python's queue.Empty: which get() calls raise it, why except IndexError misses it, asyncio.QueueEmpty, and a worker pattern without it.
- ValueError: signal only works in main thread (tested) — We measured Python's 'signal only works in main thread of the main interpreter', asyncio's set_wakeup_fd variant, and a clean SIGTERM shutdown for threads.
- Python threading exception handling (tested) — We measured Python thread exceptions: join() doesn't raise and the exit code stays 0, threading.excepthook, future.result(), and map() losing results.
- Python enum ValueError: is not a valid (tested) — We measured Python's enum 'is not a valid' ValueError: value vs name lookup, numbers arriving as strings, KeyError by name, and _missing_ for variants.
- Python pathlib mkdir exceptions (tested) — We measured pathlib mkdir errors: FileNotFoundError without parents, FileExistsError even with exist_ok when a file has the name, NotADirectoryError.
- tarfile.ReadError: file could not be opened successfully (tested) — Measured in Python 3.13.5: empty files, HTML pages, wrong modes and zips cause it. A truncated .tar.gz raises EOFError, which except ReadError misses.
- zipfile BadZipFile: Bad CRC-32 for file (tested) — Measured in Python 3.13.5: one bad byte breaks one member, extractall leaves partial files, and 11 of 58 corruptions raise zlib.error instead.
- Python smtplib exceptions: which error for which failure (tested) — Measured in Python 3.13.5: which smtplib exception each SMTP failure raises, why connection refused escapes except SMTPException, and partial recipient refusal.
- xml.etree ParseError in Python: every message explained (tested) — Measured in Python 3.13.5: what not well-formed, undefined entity, junk after document element and no element found mean, with tested fixes.
- zlib.error Error -3 incorrect header check (tested) — Measured in Python 3.13.5: which wbits decodes zlib, gzip and raw deflate, why 47 misses raw deflate, and the truncated stream that decompressobj hides.
- ssl.SSLError: [SSL] PEM lib in Python (tested) — Measured in Python 3.13.5: missing key, swapped cert/key, DER files, empty files and wrong passwords all give PEM lib. How to tell which one you have.
- os.remove errors and deleting a file without an error (tested) — Measured in Python 3.13.5: what os.remove raises for missing files, directories and permissions, and why except OSError: pass leaves files behind.
- Send an email on error in Python with SMTPHandler (tested) — Measured in Python 3.13.5: email errors with tracebacks using SMTPHandler, what happens when the mail server is down, and mailing uncaught exceptions.
- http.client timeout in Python: defaults and per-read limits (tested) — Measured in Python 3.13.5: HTTPConnection has no timeout by default, timeout= is per read (a trickling server ran 4.8s on timeout=1), plus a total deadline.
- Python socket error handling: every exception and errno (tested) — We caused 6 socket failures in Python 3.13 and logged what each raises: timeouts have errno None, EADDRINUSE has no subclass, and gaierror -2 is not ENOENT.
- Python shutil error handling: copy, move, copytree, rmtree (tested) — What shutil.copy, copytree, move and rmtree raise, measured in Python 3.13: copytree finishes then raises one shutil.Error, and move raises shutil.Error.
- Python JSON error handling: every JSONDecodeError message (tested) — 10 broken inputs, each JSONDecodeError message measured in Python 3.13 and 3.11, what json accepts silently (NaN, duplicate keys) and a helper that shows where.
- AttributeError: module 'datetime' has no attribute 'now' (tested fix) — module 'datetime' has no attribute 'now' and type object 'datetime.datetime' has no attribute 'datetime': 9 calls tested in Python 3.13 under both imports.
- AttributeError: 'str' object has no attribute 'decode' (tested fix) — 'str' object has no attribute 'decode' means the value is already text. We checked which common calls return str vs bytes in Python 3.13 and how to handle both.
- module 'collections' has no attribute 'Mapping' / 'Callable' (tested fix) — collections.Mapping, Callable, Iterable and the other ABCs were removed in Python 3.10. Tested on 3.13 and 3.11: import them from collections.abc instead.
- AttributeError: module 'time' has no attribute 'clock' (tested fix) — time.clock() was removed in Python 3.8. We measured its replacements: perf_counter for elapsed time, process_time for CPU time, and why not time.time().
- AttributeError: 'dict' object has no attribute 'iteritems' (tested fix) — iteritems, iterkeys, itervalues and has_key were removed in Python 3. Tested replacements: items(), keys(), values() and the in operator, plus the view gotcha.
- RuntimeError: dictionary changed size during iteration (tested fixes) — We changed a dict 5 ways inside a loop in Python 3.13: the change is applied before the error, swapping keys raises nothing, and the 3 fixes that work.
- AttributeError: 'str' object has no attribute 'read' (tested fix) — 'str' object has no attribute 'read' means a path or text went where an open file belongs. Tested json.load vs loads, and why csv.reader(path) fails silently.
- AttributeError: 'list' object has no attribute 'split' (tested fix) — 'list' object has no attribute 'split' (or strip, lower, replace) means a str method was called on a list. Tested in Python 3.13: fix per item, or join first.
- TypeError: 'str' / 'tuple' object does not support item assignment (tested fix) — 'str' or 'tuple' object does not support item assignment: strings and tuples are immutable. Tested fixes in Python 3.13, plus the tuple += trap.
- AttributeError: 'dict' / 'str' object has no attribute 'append' (tested fix) — 'dict' or 'str' object has no attribute 'append': only lists have append. Tested fixes in Python 3.13: d[key] = v, setdefault, defaultdict, += and join.
- TypeError: 'float' object cannot be interpreted as an integer (tested fix) — 'float' object cannot be interpreted as an integer: range() needs an int, and / always returns a float. Tested fixes in Python 3.13: //, int(), round().
- TypeError: can only concatenate str (not "int") to str (tested fix) — can only concatenate str (not "int") to str: + won't convert numbers to text. Tested fixes in Python 3.13: str(), f-strings, print commas, join.
- TypeError: unsupported operand type(s) (tested fix) — unsupported operand type(s) for /: 'str' and 'int', 'NoneType' and 'int', Decimal and float: 8 cases tested in Python 3.13, with the fix for each.
- TypeError: sequence item 0: expected str instance, int found (tested fix) — sequence item 0: expected str instance, int found means str.join got a non-string. Tested in Python 3.13 for int, None, list, tuple, dict and bytes.
- TypeError: can't multiply sequence by non-int of type 'float' (tested fix) — can't multiply sequence by non-int of type 'float' (or 'str', 'list'): * repeats strings and lists. Tested in Python 3.13, plus the silent "2.50" * 3 bug.
- TypeError: slice indices must be integers or None (tested fix) — slice indices must be integers or None or have an __index__ method: a float or str got into x[a:b]. Tested fixes in Python 3.13: //, int(), None.
- TypeError: list indices must be integers or slices, not str (tested fix) — list indices must be integers or slices, not str: usually a JSON list of dicts indexed like a dict. Tested fixes in Python 3.13, plus the not dict/float cases.
- TypeError: string indices must be integers (tested fix) — string indices must be integers, not 'str': you indexed a str like a dict. Tested in Python 3.13: unparsed JSON, looping over dict keys, double-encoded JSON.
- TypeError: 'dict_keys' object is not subscriptable (tested fix) — 'dict_keys' (or dict_values, dict_items) object is not subscriptable: views can't be indexed. Tested in Python 3.13: list(d)[0], next(iter(d)), sorted.
- ValueError: list.remove(x): x not in list (tested fix) — list.remove(x): x not in list and 'x' is not in list from index(): tested causes (str vs int, newline, case) and fixes in Python 3.13, incl. removing all.
- TypeError: takes 1 positional argument but 2 were given (tested fix) — TypeError: takes 1 positional argument but 2 were given: usually a method missing self. Tested in Python 3.13 with threading args, decorators, kw-only.
- TypeError: got an unexpected keyword argument (tested fix) — got an unexpected keyword argument: tested causes in Python 3.13 (typos, removed json encoding=, super().__init__, decorators, **dict) and how to fix each.
- TypeError: '<' not supported between instances of 'str' and 'int' (tested fix) — '<' not supported between instances of 'str' and 'int' (or NoneType, dict): tested fixes in Python 3.13 for input(), sorted/max, None, heapq ties, classes.
- TypeError: object of type 'int' has no len() (tested fix) — object of type 'int' (or NoneType, generator, map) has no len(): tested causes and fixes in Python 3.13, incl. digit count, None returns, generators.
- ValueError: could not convert string to float (tested fix) — could not convert string to float: '' or '1,234.5': tested in Python 3.13 with empty strings, commas, $ and %, CSV N/A values, plus what float() accepts.
- TypeError: a bytes-like object is required, not 'str' (tested fix) — TypeError: a bytes-like object is required, not 'str': tested in Python 3.13 with wb files, subprocess output, sockets, base64, csv, and the .encode() fix.
- ValueError: I/O operation on closed file (tested fix) — ValueError: I/O operation on closed file: tested in Python 3.13 with code after a with block, returned file objects, lazy csv.reader, StringIO, and fixes.
- TypeError: 'str' object cannot be interpreted as an integer (tested fix) — 'str' object cannot be interpreted as an integer: range(input()) and argv strings. Tested in Python 3.13 with range, chr, bytes, argparse, and the int() fix.
- AttributeError: 'int' object has no attribute (tested fix) — 'int' object has no attribute 'append', 'split' or 'lower': tested in Python 3.13. Find where the variable became a number, use defaultdict or str(n).
- TypeError: 'type' object is not subscriptable (tested fix) — 'type' object is not subscriptable: list[int] hints fail on Python 3.8. Tested on 3.8 vs 3.13: __future__ annotations, typing.List, and indexing a class.
- TypeError: 'tuple' object is not callable (tested fix) — 'tuple' object is not callable: tested in Python 3.13. A missing comma between tuples, t(0) instead of t[0], or a variable named tuple. Why the hint can vanish.
- TypeError: cannot unpack non-iterable object (tested fix) — cannot unpack non-iterable NoneType, int or bool object: tested in Python 3.13. A function returns one value on some path. Find it and fix every return.
- TypeError: 'list' object is not an iterator (tested fix) — 'list' object is not an iterator: next() needs an iterator. Tested in Python 3.13: wrap with iter(), skip a CSV header, next() with a default.
- TypeError: 'str' object is not a mapping (tested fix) — 'str' object is not a mapping: ** got a string, usually unparsed JSON. Tested in Python 3.13: the argument after ** wording, json.loads, list of pairs.
- TypeError: 'method' object is not subscriptable (tested fix) — 'method' or 'builtin_function_or_method' object is not subscriptable or iterable: a missing (). Tested in Python 3.13 with dict.keys, items, split, len.
- TypeError: missing 1 required positional argument: 'self' (tested fix) — missing 1 required positional argument: 'self' means the method was called on the class. Tested in Python 3.13: missing (), staticmethod, threads, super().
- NameError: name '__file__' is not defined (tested fix) — name '__file__' is not defined: no file behind the code (python -c, REPL, Jupyter, exec). Tested in Python 3.8-3.13, with a fallback that works everywhere.
- ValueError: invalid literal for int() with base 16 (tested fix) — invalid literal for int() with base 16: tested 13 inputs in Python 3.13. 0x and whitespace are fine; # and stray characters are not. Parsing #rrggbb colours.
- OSError: [Errno 29] Illegal seek (tested fix) — [Errno 29] Illegal seek: seek() or tell() on a pipe, socket or piped stdin. Tested in Python 3.13: why you may get UnsupportedOperation, and the BytesIO fix.
- OSError: [Errno 5] Input/output error (tested fix) — [Errno 5] Input/output error in Python: a closed pty, a background job that lost its terminal, or a failing disk. Reproduced in Python 3.13 with a tested fix.
- NameError: name 'np' is not defined (tested fix) — NameError: name 'np' (or 'pd') is not defined: a missing or swallowed import, no 'as np' alias, or an import inside a function. Tested in Python 3.13.
- ImportError: cannot import name 'UTC' from 'datetime' (tested fix) — cannot import name 'UTC' from 'datetime': datetime.UTC is new in Python 3.11. Tested on 3.8, 3.11 and 3.13: use timezone.utc or a fallback import.
- ImportError: cannot import name 'StrEnum' from 'enum' (tested fix) — cannot import name 'StrEnum' from 'enum': StrEnum is new in Python 3.11. Tested on 3.8, 3.11, 3.13: a (str, Enum) fallback and its f-string gotcha.
- OSError: [Errno 101] Network is unreachable in Python (tested fix) — Python OSError [Errno 101] Network is unreachable: no route to the address. Tested: why except ConnectionError misses it, DNS vs 101, and a safe retry.
- OSError: [Errno 18] Invalid cross-device link in Python (tested fix) — Python OSError [Errno 18] Invalid cross-device link: os.rename cannot move files between filesystems. Tested fixes: shutil.move and same-dir temp files.
- TypeError: can't compare datetime.datetime to datetime.date (tested fix) — Python TypeError can't compare datetime.datetime to datetime.date ('<' not supported on 3.13). Tested on 3.8-3.13: why == is silently False, and 3 fixes.
- ModuleNotFoundError: No module named 'distutils' (tested fix) — No module named 'distutils': it was removed in Python 3.12. Tested on 3.11, 3.13 and 3.14: the setuptools shim, and what to replace each call with.
- ModuleNotFoundError: No module named 'pkg_resources' (tested fix) — No module named 'pkg_resources': setuptools 82 removed it, so pip install setuptools no longer helps. Tested: pin setuptools<82 or use importlib.metadata.
- ModuleNotFoundError: No module named 'dotenv' (tested fix) — No module named 'dotenv': install python-dotenv, not dotenv, with the Python that runs your code. Tested on 3.14, plus why load_dotenv() returns False.
- ModuleNotFoundError: No module named 'yaml' (tested fix) — No module named 'yaml': run pip install pyyaml (pip install yaml finds nothing). Tested on Python 3.14 with PyYAML 6.0.3, plus the load() Loader error.
- TypeError: unhashable type: 'dict' (tested fix) — TypeError: unhashable type: 'dict' from set(), dict keys or lru_cache. Tested fixes: dedupe a list of dicts with tuple(sorted(items)) or json.dumps.
- ModuleNotFoundError: No module named 'requests' (tested fix) — No module named 'requests' even after pip install requests? Pip installed it into a different Python. Tested fix: python -m pip install requests.
- UnicodeDecodeError: invalid start byte (tested fix) — Fix 'utf-8' codec can't decode byte 0xff/0x80/0x8b in position 0: invalid start byte. Tested: UTF-16 BOM files, gzip/xlsx opened as text, cp1252.
- TypeError: expected string or bytes-like object (tested fix) — re.sub/re.search raise expected string or bytes-like object, got 'NoneType' or 'float'. Tested on 3.8-3.13: None from JSON, NaN from pandas, file objects.
- ModuleNotFoundError: No module named 'Crypto' (tested fix) — No module named 'Crypto' even after pip install crypto? That installs an unrelated package. Tested fix: pip install pycryptodome (or Cryptodome).
- KeyError: 0 in Python and pandas (tested fix) — KeyError: 0 in pandas means s[0] or df[0] looked up a label that is not there. Tested fixes: .iloc, reset_index, and int keys lost in JSON.
- TypeError: unhashable type: 'slice' (tested fix) — unhashable type: 'slice' means you sliced a dict. On Python 3.12+ the same code raises KeyError: slice(0, 2, None). Tested fix with islice.
- TypeError: can only join an iterable (tested fix) — TypeError: can only join an iterable means str.join() got None or a number. Tested causes: join(list.sort()), a missing return, joining an int.
- TypeError: unhashable type: 'set' (tested fix) — TypeError: unhashable type: 'set' from a set of sets or a set as a dict key. Tested fix: frozenset, which is hashable and ignores member order.
- pandas SettingWithCopyWarning (tested on pandas 2 and 3) — SettingWithCopyWarning means your assignment did not change the DataFrame. pandas 3 replaces it with ChainedAssignmentError. Tested fix: .loc.
- pandas KeyError but the column exists (tested) — pandas KeyError on a column you can see: a space in the header, an Excel BOM, or the column is now the index. Tested on pandas 2.3.3 and 3.1.0.
- pandas Error tokenizing data: Expected N fields (tested) — pandas read_csv 'Error tokenizing data': error_bad_lines was removed in pandas 2, use on_bad_lines. Causes and fixes tested on pandas 2.3.3 and 3.1.0.
- pandas KeyError: not in index / None of [Index] (tested) — pandas KeyError not in index, None of [Index] are in the [columns], and not found in axis: what each means and the fix. Tested on pandas 2.3.3 and 3.1.0.
- pandas FutureWarning: concatenation with empty or all-NA entries (tested) — The pandas concat FutureWarning about empty or all-NA entries: on pandas 3 your float columns silently become object. Tested fix on pandas 2.3.3 and 3.1.0.
- pandas to_datetime errors='ignore' deprecated (tested) — pandas to_datetime and to_numeric errors='ignore' warn on pandas 2 and raise ValueError on pandas 3. Tested replacements: coerce or try/except.
- pandas FutureWarning: Downcasting object dtype arrays on .fillna (tested) — pandas 'Downcasting object dtype arrays on .fillna is deprecated': on pandas 3 the column stays object. Tested warning-free fix for pandas 2.3.3 and 3.1.0.
- pandas groupby FutureWarning: apply on grouping columns, observed=False (tested) — pandas groupby FutureWarnings for apply on grouping columns and observed=False: on pandas 3 results change silently. Tested fixes on pandas 2.3.3 and 3.1.0.
- pandas merge KeyError, int64 vs object, and rows not matching (tested) — pandas merge KeyError, 'trying to merge on int64 and object columns', or an empty result: the 3 causes and fixes, tested on pandas 2.3.3 and 3.1.0.
- pandas IndexError: single positional indexer is out-of-bounds (tested) — pandas 'single positional indexer is out-of-bounds' usually means iloc[0] on an empty filter result. Causes and fixes tested on pandas 2.3.3 and 3.1.0.
- pandas TypeError: unhashable type: 'Series' / 'numpy.ndarray' (tested) — pandas TypeError unhashable type 'Series' or 'numpy.ndarray': a whole column used as a dict key or set element. Tested fixes: map, iloc, tolist.
- pandas PerformanceWarning: DataFrame is highly fragmented (tested) — pandas 'DataFrame is highly fragmented' appears after about 100 column inserts in a loop. Tested fix: build columns first, pd.concat(axis=1) once.
- pandas read_excel: Missing optional dependency 'openpyxl' (tested) — pandas read_excel ImportError: missing openpyxl for .xlsx; for .xls pandas 2 wants xlrd and pandas 3 python-calamine. Tested on pandas 2.3.3 and 3.1.0.
- pandas pivot: Index contains duplicate entries, cannot reshape (tested) — Why df.pivot raises ValueError: Index contains duplicate entries, and how to fix it with duplicated(), pivot_table or groupby. Tested on pandas 2.3.3 and 3.1.0.
- AttributeError: _ARRAY_API not found / numpy.dtype size changed (pandas, NumPy 2) — Why NumPy 2 breaks pandas with _ARRAY_API not found or numpy.dtype size changed, how to find the culprit package, and the fix. Tested with pip transcripts.
- MemoryError: Unable to allocate X GiB for an array (NumPy / pandas, tested) — What NumPy's Unable to allocate X GiB means, the merge blow-up that usually causes it in pandas, and how to cut memory 12x. Tested on pandas 2.3.3 and 3.1.0.
- How to suppress pandas warnings (tested on pandas 2 and 3) — Silence pandas FutureWarning, PerformanceWarning and SettingWithCopyWarning by category, per block or with -W, and the traps on pandas 3. Tested: 2.3.3, 3.1.0.
- pandas apply errors='coerce': skip errors in apply (tested) — pandas apply has no errors= argument (you get float() takes no keyword arguments). Use pd.to_numeric(errors='coerce') or a safe wrapper. Tested: 2.3.3, 3.1.0.
- pandas TypeError: unhashable type: 'list' (drop_duplicates, groupby) — Why pandas drop_duplicates, groupby and nunique raise unhashable type: 'list' on list cells, and the tuple/explode fix. Tested on pandas 2.3.3 and 3.1.0.
- pandas TypeError: unhashable type: 'numpy.ndarray' (tested) — Why pandas drop_duplicates, groupby and nunique raise unhashable type 'numpy.ndarray' on array cells, and the tuple fix. Tested on pandas 2.3.3 and 3.1.0.
- pandas TypeError: unhashable type: 'dict' (groupby, nunique, merge) — Why pandas groupby, nunique, unique and merge raise unhashable type: 'dict' on JSON dict cells, and the json_normalize fix. Tested on pandas 2.3.3 and 3.1.0.
- pandas 3.0 breaking changes, measured against pandas 2.3 — pandas 3 vs 2.3, same code run on both: str dtype, Copy-on-Write, datetime64[us], removed applymap/fillna(method), and the changes that fail silently.
- pandas AttributeError: can't set attribute (itertuples, shape) — Why pandas raises AttributeError: can't set attribute on itertuples rows and df.shape/values, the Python 3.11+ 'has no setter' wording, and the .at fix.
- pandas pivot_table KeyError (causes and fixes) — Why pandas pivot_table raises KeyError: wrong column case or spaces, MultiIndex result columns, the index column, with fixes. Tested on pandas 2.3.3 and 3.1.0.
- pandas apply KeyError (missing axis=1) — Why df.apply(lambda row: row['col']) raises KeyError for a column that exists: apply passes columns by default; use axis=1. Tested on pandas 2.3.3 and 3.1.0.
- module 'numpy' has no attribute 'int' / 'float' / 'bool8' / 'float_' — Which np.int, np.float, np.bool, np.long, np.bool8, np.float_, np.NaN and np.product names fail on NumPy 1.26 vs 2.x, and what to use instead.
- NumPy RuntimeWarning: mean of empty slice, overflow, divide by zero (tested) — NumPy RuntimeWarning: mean of empty slice, overflow in exp, divide by zero, invalid value, All-NaN slice. Why errstate misses some, and tested fixes.
- ValueError: assignment destination is read-only (NumPy, pandas 3, PIL, tested) — NumPy ValueError: assignment destination is read-only from frombuffer, broadcast_to, pandas 3 to_numpy() and PIL images. Tested on numpy 2.5 and pandas 3.
- numpy.linalg.LinAlgError: Singular matrix (tested causes and fixes) — numpy.linalg.LinAlgError: Singular matrix from inv or solve: dependent rows, collinear regression columns, zeros. Tested with matrix_rank, cond, lstsq, pinv.
- NumPy broadcasting error: operands could not be broadcast together with shapes (tested) — NumPy ValueError: operands could not be broadcast together with shapes (3,4) (3,). The broadcasting rule, keepdims and [:, None] fixes, matmul errors, tested.
- numpy AxisError: axis 1 is out of bounds for array of dimension 1 (tested) — numpy.exceptions.AxisError: axis 1 is out of bounds for array of dimension 1. Why 1-D arrays have only axis 0, np.AxisError removed in NumPy 2, tested fixes.
- matplotlib not showing plot: plt.show() does nothing (tested) — matplotlib plt.show() not showing a plot: headless machines fall back to the Agg backend silently (no warning in 3.11). Check get_backend, use savefig.
- How to suppress matplotlib warnings (and findfont messages), tested — Suppress matplotlib warnings: filterwarnings(module='matplotlib') does not match, findfont is logging not a warning. Tested message filters and logger fix.
- sklearn ConvergenceWarning: lbfgs failed to converge (tested) — scikit-learn ConvergenceWarning: lbfgs failed to converge (max_iter=100). Tested: StandardScaler converges in 19 iterations vs 2338 with max_iter. Suppress it.
- How to suppress scikit-learn warnings (ConvergenceWarning, UndefinedMetricWarning), tested — Suppress scikit-learn warnings by category: ConvergenceWarning and UndefinedMetricWarning from sklearn.exceptions, scoped with catch_warnings; zero_division.
- Liblinear failed to converge, increase the number of iterations (tested) — sklearn ConvergenceWarning: Liblinear failed to converge. Tested: max_iter=100000 still warned; LinearSVC(dual=False) converged in 27 iterations.
- ValueError: continuous is not supported in scikit-learn (tested) — Why confusion_matrix/accuracy_score raise 'continuous is not supported' or 'mix of binary and continuous targets', with tested fixes for sklearn 1.9.
- ValueError: Unknown label type: continuous in scikit-learn (tested) — Why a sklearn classifier raises Unknown label type: continuous (or unknown), and tested fixes: regressor, binning, astype(int), stratify on bins.
- JSONDecodeError: Expecting ',' delimiter (tested) — Python json.loads 'Expecting , delimiter' tested: missing comma, unescaped quote, truncated JSON. Find the spot with lineno/colno and fix it with json.dumps.
- requests.exceptions.SSLError: HTTPSConnectionPool Max retries exceeded (tested) — requests.exceptions.SSLError HTTPSConnectionPool decoded: 4 causes (self-signed, missing CA, hostname, wrong version number) and the fixes we tested.
- Python requests exceptions: full list and error handling (tested) — Every requests.exceptions class and its parents, what triggers each (tested against a local server), and a try/except order that catches them all.
- OSError: [Errno 113] No route to host in Python (tested) — Python [Errno 113] No route to host reproduced: unused IP (3s ARP timeout), firewall REJECT with the server up (instant), musl wording, and how to catch it.
- OSError: [Errno 16] Device or resource busy in Python (tested) — Python [Errno 16] Device or resource busy reproduced: os.replace onto a Docker bind-mounted file, rmtree on a mount point. Tested fixes for each.
- OSError: [Errno 98] Address already in use in Python (tested) — Python [Errno 98] Address already in use: find what holds the port, and why SO_REUSEADDR only fixed the TIME_WAIT restart when both sockets set it.
- OSError: [Errno 39] Directory not empty in Python (tested) — Python [Errno 39] Directory not empty from os.rmdir, Path.rmdir and os.rename onto a non-empty dir. Tested fixes: shutil.rmtree and copytree merge.
- ConnectionResetError: [Errno 104] Connection reset by peer (tested) — Python [Errno 104] Connection reset by peer reproduced with a local server, how it looks through requests, how to catch it, and when retrying helps.
- OSError: [Errno 36] File name too long in Python (tested) — Python [Errno 36] File name too long: the 255-byte NAME_MAX (bytes, not chars) and 4096-byte PATH_MAX limits. Tested fix: truncate by bytes plus a hash.
- OSError: [Errno 28] No space left on device in Python (tested) — Python [Errno 28] No space left on device, reproduced on a 1 MB tmpfs: why it can appear at close(), shutil.disk_usage checks, partial-file cleanup, TMPDIR.
- TimeoutError: [Errno 110] Connection timed out in Python (tested) — Python [Errno 110] Connection timed out reproduced with a firewall DROP: 134 s with no timeout, 'timed out' with errno None when you set one, and requests.
- PIL DecompressionBombError: Image size exceeds limit (tested) — Pillow DecompressionBombError and DecompressionBombWarning, tested on Pillow 13: the 89,478,485-pixel limit, the 2x rule, MAX_IMAGE_PIXELS, safe uploads.
- PIL UnidentifiedImageError: cannot identify image file (tested) — Pillow UnidentifiedImageError: cannot identify image file, tested on Pillow 13: HTML pages saved as .jpg, empty or truncated files, consumed streams.
- SQLAlchemy IntegrityError: UNIQUE constraint failed (tested) — SQLAlchemy IntegrityError tested on 2.1.6: why the next commit raises PendingRollbackError, rollback(), ON CONFLICT DO NOTHING, begin_nested savepoints.
- SQLAlchemy DetachedInstanceError: not bound to a Session (tested) — SQLAlchemy DetachedInstanceError tested on 2.1.6: lazy load and attribute refresh after the session closes. Fixes: selectinload, expire_on_commit=False, merge.
- SQLAlchemy OperationalError: no such table (tested) — SQLAlchemy (sqlite3.OperationalError) no such table, tested on 2.1.6: create_all never ran, models imported too late, relative sqlite:/// paths, in-memory DBs.
- SQLAlchemy MissingGreenlet: greenlet_spawn has not been called (tested) — SQLAlchemy async MissingGreenlet 'greenlet_spawn has not been called' tested on 2.1.6: lazy loads and expired attributes. Fixes: selectinload, awaitable_attrs.
- Flask jinja2.exceptions.TemplateNotFound (tested) — Flask TemplateNotFound tested on Flask 3.1: wrong-case names or templates/ prefix, folder outside the package, blueprints, and how to see where Flask looked.
- SQLAlchemy StaleDataError: expected to update 1 row(s); 0 were matched (tested) — SQLAlchemy StaleDataError tested on 2.1.6: row deleted by another connection, DELETE only warns, version_id_col optimistic locking with reload and retry.
- openpyxl IllegalCharacterError: cannot be used in worksheets (tested) — openpyxl IllegalCharacterError tested on 3.1.5: which control characters fail, stripping them with ILLEGAL_CHARACTERS_RE, and the pandas to_excel fix.
- openpyxl InvalidFileException: does not support file format (tested) — openpyxl InvalidFileException tested on 3.1.5: .csv and old .xls rejected by extension, fake .xlsx gives BadZipFile, and how to read each format.
- FastAPI 422 Unprocessable Entity (tested) — FastAPI 422 Unprocessable Entity tested on 0.161: reading detail/loc, form data vs JSON, missing Content-Type, str params read as query, logging 422s.
- uvicorn Error loading ASGI app: Could not import module (tested) — uvicorn Error loading ASGI app tested on 0.54: could not import module, attribute app not found, main.py:app, --app-dir, and import errors inside the app.
- pydantic BaseSettings has been moved to pydantic-settings (tested) — PydanticImportError: BaseSettings has been moved to pydantic-settings, tested on Pydantic 2.14: the fix, SettingsConfigDict, v1/v2 fallback, pydantic.v1.
- Flask: Could not locate a Flask application (tested) — flask run Could not locate a Flask application, tested on Flask 3.1: --app and FLASK_APP, Failed to find attribute, Could not import, ImportError in app.py.
- pydantic: Extra inputs are not permitted (tested) — Pydantic Extra inputs are not permitted tested on 2.14: extra='forbid' vs ignore vs allow, model_extra, and aliases that turn field names into extras.
- FastAPI CORS error on localhost (tested) — FastAPI CORS error from localhost tested: OPTIONS 405 without CORSMiddleware, trailing slash, 127.0.0.1 vs localhost, default allow_methods GET only.
- FastAPI 405 Method Not Allowed (tested) — FastAPI 405 Method Not Allowed tested on 0.161: the Allow header, GET on a POST route, trailing-slash 307 redirects, and OPTIONS 405 from CORS preflight.
- Pydantic Field required [type=missing] (tested) — Pydantic v2 Field required [type=missing] on 2.14: Optional without a default is still required, aliases, nested loc paths, and FastAPI 422 body vs query.
- FastAPI / uvicorn Exception in ASGI application (tested) — uvicorn's Exception in ASGI application tested on FastAPI 0.161: find the real error, ResponseValidationError, non-JSON return values, and a JSON 500 handler.
- Flask CORS error on localhost (tested) — Flask CORS error on localhost tested with flask-cors 6.0.5: no headers by default, exact origin matching, 127.0.0.1 vs localhost, redirects, and credentials.
- openpyxl ValueError: Cannot convert to Excel (tested) — openpyxl Cannot convert to Excel tested on 3.1.5: lists, dicts, UUIDs and arrays fail at assignment; timezone datetimes fail only at save(); pandas to_excel.
- asyncio Task exception was never retrieved (tested) — asyncio Task exception was never retrieved on Python 3.13: why the error is lost, done callbacks, gather, TaskGroup, and Task was destroyed but it is pending.
- boto3 Unable to locate credentials / You must specify a region (tested) — boto3 NoCredentialsError and NoRegionError tested on 1.43: when each is raised, credential lookup order, credentials.method, ProfileNotFound, and Docker/cron.
- boto3 ClientError error codes and handling (tested) — boto3 ClientError tested on 1.43: read e.response['Error']['Code'], HeadObject's bare 404, s3.exceptions.NoSuchKey, re-raising, and Stubber for tests.
- aiohttp Unclosed client session (tested) — aiohttp Unclosed client session tested on 3.14.5: a ClientSession never closed, the async with fix, reusing one session, and no running event loop errors.
- Django TemplateDoesNotExist (tested) — Django TemplateDoesNotExist tested on 6.1.2: read the loader postmortem, DIRS vs APP_DIRS, app/template.html namespacing, INSTALLED_APPS, and extends.
- Django NoReverseMatch (tested) — Django NoReverseMatch tested on 6.1.2: not a valid view function or pattern name, missing or wrong arguments, 'is not a registered namespace', and {% url %}.
- Django settings are not configured (tested) — Django 'settings are not configured' tested on 6.1.2: DJANGO_SETTINGS_MODULE in scripts, Apps aren't loaded yet, django.setup() order, and import paths.
- Django matching query does not exist (tested) — Django DoesNotExist and MultipleObjectsReturned tested on 6.1.2: why .get() raises, catching Model.DoesNotExist, first(), get_or_create and get_object_or_404.
- Django CSRF verification failed (tested) — Django CSRF verification failed (403) tested on 6.1.2: cookie not set, token missing or incorrect, X-CSRFToken, Origin checking failed, CSRF_TRUSTED_ORIGINS.
- Django CORS error on localhost (tested) — Django CORS error on localhost tested on 6.1.2 + django-cors-headers 4.9.0: no Access-Control-Allow-Origin, CorsMiddleware order, 127.0.0.1 vs localhost, E014.
- Django Error: That port is already in use (tested) — Django runserver 'Error: That port is already in use' reproduced on 6.1.2: why it happens, running on another port, and finding and stopping the old process.
- Django 400 Bad Request with DEBUG=False (tested) — Django 400 Bad Request with DEBUG=False tested on 6.1.2: DisallowedHost Invalid HTTP_HOST header, www vs bare domain, server IP, and the .example.com wildcard.
- Django admin 'Please correct the error below' (tested) — Django admin shows 'Please correct the error below' but no error? Tested on 6.1.2: required form fields missing from fieldsets, and how to print form.errors.
- Django form errors not showing in template (tested) — Django form errors not showing? Tested on 6.1.2: fields rendered without .errors, non_field_errors from clean(), and views that replace the bound form.
- Django RuntimeError: populate() isn't reentrant (tested) — Django populate() isn't reentrant tested on 6.1.2: it hides the first setup() error (e.g. ModuleNotFoundError), or setup() is called from inside app code.
- Django 500 error with DEBUG=False (tested) — Django 500 error only with DEBUG=False, tested on 6.1.2: no traceback by default, LOGGING to see it, missing staticfiles manifest entry, custom 500.html.
- Celery Error 111 Connection refused (tested) — Celery Error 111 connecting to localhost:6379 on Celery 5.6: broker down, fail-fast retry_policy, and amqp 5672 when the CELERY_ broker setting is ignored.
- Celery MaxRetriesExceededError (tested) — Celery MaxRetriesExceededError tested on 5.6: max_retries=2 means 3 attempts, retry(exc=...) re-raises your exception instead, and how to give up cleanly.
- Celery link_error errback example (tested) — Celery link_error example tested on 5.6: errback signature (request, exc, traceback), old-style task id errbacks, and chain on_error stopping the chain.
- Selenium ElementNotInteractableException (tested) — Selenium ElementNotInteractableException tested in Chrome 156: hidden elements, a hidden duplicate matched first, WebDriverWait, and which inputs count.
- Selenium ElementClickInterceptedException (tested) — Selenium element click intercepted, tested in Chrome 156: cookie banners, spinners element_to_be_clickable misses, fixed headers, and why ActionChains hides it.
- Selenium StaleElementReferenceException (tested) — Selenium stale element reference tested in Chrome 156: why re-rendered nodes go stale, clicking through a list, staleness_of, and ignored_exceptions.
- Selenium Unable to obtain driver for chrome (tested) — Selenium NoSuchDriverException, Selenium Manager exit code 65, error sending request for url and cannot find Chrome binary, tested on 4.51 with fixes.
- Selenium TimeoutException: Message: (tested) — selenium.common.exceptions.TimeoutException with an empty Message, tested in Chrome 156: wrong locator, iframes, presence vs visibility, page load timeout.
- Selenium NoSuchElementException (tested) — Selenium no such element: Unable to locate element, tested in Chrome 156: exact-match By.ID, late JavaScript content, waits, iframes and shadow DOM.
- pip error: externally-managed-environment (tested) — pip install error externally-managed-environment on Debian 13 / Ubuntu, tested: why PEP 668 blocks it, venv, apt packages, pipx, --break-system-packages.
- This version of ChromeDriver only supports Chrome version (tested) — Selenium session not created: This version of ChromeDriver only supports Chrome version N, tested on 4.51: hard-coded Service paths, old drivers on PATH.
- Selenium invalid session id (tested) — Selenium invalid session id, tested in Chrome 156: browser closed the connection (crash, Docker /dev/shm), close() on the last tab, MaxRetryError after quit
- pytest ERROR collecting: ModuleNotFoundError (tested) — pytest Interrupted: 1 error during collection with ModuleNotFoundError, tested on pytest 9.1: python -m pytest, pythonpath for src layout, import file mismatch.
- pytest error vs failure, ERROR at setup/teardown (tested) — pytest error vs failure, tested on pytest 9.1: FAILED is the test body, ERROR at setup/teardown is a fixture; a test can pass and error; fixture not found.
- pytest Failed: DID NOT RAISE (tested) — pytest.raises tested on pytest 9.1: Failed: DID NOT RAISE, a different exception type, Regex pattern did not match (re.escape), and code after the raise.
- pytest: async def functions are not natively supported (tested) — pytest async def functions are not natively supported, tested on pytest 9.1 + pytest-asyncio 1.4: why installing the plugin is not enough, marker vs auto mode.
- pytest exit codes 0-6 (tested) — What pytest exit code 1, 2, 3, 4, 5 and the new 6 mean, measured on pytest 9.1: collection errors, INTERNALERROR, usage errors, VS Code discovery failed.
- pytest fixture not found (tested) — Fix pytest fixture not found: typos, fixtures in another test file, conftest.py in the wrong folder, missing plugins like mocker, self, unittest.TestCase.
- pytest parametrize: function uses no argument (tested) — Fix pytest parametrize errors: function uses no argument, number of names must equal number of values, has no len(), duplicate parametrization, indirect.
- pytest filterwarnings error: fail on warnings (tested) — Make pytest fail on warnings with -W error or filterwarnings = error, ignore specific ones, and why .* works in pytest.ini but not with -W. Tested on 9.1.
- pytest rerun only failed tests: --lf, --ff, -x, --sw (tested) — Rerun only the last failed pytest tests with --lf, run failures first with --ff, stop at the first failure with -x or --sw, and why --lf can run everything.
- pytest using the wrong Python / virtualenv (tested) — pytest runs with a different Python than your venv, so imports fail with ModuleNotFoundError. Check with pytest -VV and which pytest; fix with python -m pytest.
- pytest ImportError: Error importing plugin (tested) — Fix pytest Error importing plugin: -p with a pip name, pytest_plugins in a local or non-top-level conftest, required_plugins, and broken autoloaded plugins.
- pytest.fail with message vs assert vs xfail (tested) — How pytest.fail(msg) and pytrace=False look in the output, when to use assert with a message instead, and how xfail, XPASS and strict=True are reported.
- pytest ScopeMismatch: function scoped fixture (tested) — Fix pytest ScopeMismatch: a session/module fixture requesting a function-scoped fixture, tmp_path or monkeypatch. Use tmp_path_factory or MonkeyPatch.context().
- pytest caplog: assert a logger error was logged (tested) — Assert log messages in pytest with caplog: text, records, record_tuples. Why INFO logs are missing, logger= for named loggers, propagate=False fix.
- pytest mock.patch not working (tested fixes) — Why mock.patch doesn't take effect in pytest (from-imports), fixture 'mocker' not found, does not have the attribute, and expected call not found.
- Celery chord error handling (tested with a real worker) — What happens when a Celery chord header task fails: callback skipped, errback gets ChordError, caller gets the original exception, eager mode differs.
- Celery WorkerLostError: Worker exited prematurely (tested) — Celery WorkerLostError 'Worker exited prematurely: signal 9 (SIGKILL)' or 'exitcode 1': what killed the pool process, and how it differs from TimeLimitExceeded.
- Celery task timeout: time_limit and soft_time_limit (tested) — Celery TimeLimitExceeded vs SoftTimeLimitExceeded, measured: hard limit kills the process, soft limit lets you clean up, and -P solo ignores both.
- Celery: Received unregistered task of type (KeyError) (tested) — Fix Celery 'Received unregistered task of type' KeyError / NotRegistered: the worker never imported the task module. include=, autodiscover_tasks, names.
- celery beat vs celery worker (tested) — celery beat sends scheduled tasks, the worker runs them. Measured: worker alone runs 0 periodic tasks, worker -B embeds beat, separate beat for production.
- Celery task stuck in PENDING: queue routing (tested) — Celery task_routes sends a task to a queue the worker doesn't consume: get() times out, state PENDING, message waits in Redis. Fix with worker -Q.
- pytest error: argument -k: expected one argument (tested) — Fix pytest 'error: argument -k: expected one argument' (also -m, -p, --maxfail): missing value, empty unquoted CI variable, unquoted expressions. Exit code 4.
- Celery chain error handling (tested with a real worker) — What happens when a task in a Celery chain fails: later tasks skipped, caller gets the original exception, where on_error must go, and eager mode.
- Celery logging configuration (tested with a real worker) — A Celery worker hijacks the root logger and drops your handlers. Tested fixes: worker_hijack_root_logger=False and the setup_logging signal.
- Celery Error: No such command 'flower' (tested fix) — Why celery says No such command 'flower': Flower is not installed in the same environment as celery. Fix, check, and the -A argument-order trap.
- pytest.raises: get and check the error message (tested) — Read an exception's message in pytest with str(excinfo.value), check it with match=, add a custom assert message, and see the full truncated message.
- pytest fail fast: stop on first failure (-x, --maxfail, --ff, --sw) — Stop pytest on the first failure with -x, after N with --maxfail, run failures first with --ff, or resume with --sw (which exits 2, not 1).
- pytest parametrize: expect an error in some cases (tested) — Parametrize valid and invalid inputs in one pytest test: pass pytest.raises or nullcontext as a parameter. Plus the xfail(raises=...) alternative.
- pytest: fail but continue checking (built-in subtests, tested) — A failing assert stops the rest of a pytest test. pytest 9's built-in subtests fixture keeps going and reports each failed check (SUBFAILED).
- Celery Redis SSL: rediss:// URL must have parameter ssl_cert_reqs (tested) — Celery with Redis over TLS: fix 'A rediss:// URL must have parameter ssl_cert_reqs', and why a bad certificate shows up as 'Retry limit exceeded'.
- httpx follow redirects: why you get a 302 and how to fix it (tested) — httpx doesn't follow redirects by default, unlike requests. Use follow_redirects=True; plus r.history, raise_for_status on 3xx, POST to GET, max_redirects.
- httpx timeout: the 5 s default, ReadTimeout, PoolTimeout and fixes (tested) — httpx times out after 5 seconds by default. How to raise or disable it with timeout= / httpx.Timeout, and what ReadTimeout, PoolTimeout, ConnectTimeout mean.
- httpx ConnectError: SSL CERTIFICATE_VERIFY_FAILED fix (tested) — Fix httpx.ConnectError [SSL: CERTIFICATE_VERIFY_FAILED]: pass verify=ssl.create_default_context(cafile=...), or set SSL_CERT_FILE. verify=str is deprecated.
- httpx vs requests: the default differences that break ported code (tested) — httpx vs requests, measured: redirects not followed, 5 s default timeout, raise_for_status on 3xx, ConnectError vs ConnectionError, plus async and HTTP/2.
- httpx proxy: unexpected keyword argument 'proxies' fix (tested) — httpx 0.28 rejects proxies=: use proxy= on Client/AsyncClient, mounts= for per-scheme proxies, plus HTTP_PROXY/NO_PROXY and SOCKS. Measured.
- httpx retry: what HTTPTransport(retries=) does and doesn't retry (tested) — httpx HTTPTransport(retries=N) retries only failed connections, not ReadTimeout or 429/503. Measured, plus a short retry loop with Retry-After and backoff.
- httpx RemoteProtocolError: Server disconnected without sending a response (tested) — httpx.RemoteProtocolError explained by reproducing it: server disconnected without a response, incomplete message body, illegal status line.
- httpx streaming response: stream(), iter_bytes, ResponseNotRead (tested) — Stream httpx responses with client.stream(): iter_lines, iter_bytes(chunk_size), aiter_lines, and the ResponseNotRead, StreamConsumed and StreamClosed errors.
- httpx params: query parameters, lists, client params (tested) — httpx params= for GET query strings: lists repeat the key, None is sent empty, params= replaces a ?query already in the URL, client params merge.
- httpx post json vs data vs content (tested) — httpx json= sends application/json, data= sends a form, a JSON string belongs in content=. data= plus json= silently drops the JSON. Tested, httpx 0.28.1.
- httpx headers: request, client default and response headers (tested) — Set httpx headers per request or as Client/AsyncClient defaults (merged, case-insensitive), read response headers, get_list for Set-Cookie. httpx 0.28.1.
- httpx auth: Basic, Bearer token and refresh on 401 (tested) — httpx auth=('user','pass') for Basic auth, a small httpx.Auth subclass for Bearer tokens, auth_flow to refresh on 401. A string auth= raises TypeError.
- httpx AsyncClient connection pool and Limits (tested) — Reuse one httpx AsyncClient (20 requests: 1 connection vs 20). Default pool 100 connections, 20 keep-alive, 5s expiry; max_connections and PoolTimeout tested.
- httpx raise_for_status and HTTPStatusError status code (tested) — httpx does not raise on 404/500 until raise_for_status(). Get e.response.status_code and body from HTTPStatusError; 3xx raises too; hooks for AsyncClient.
- httpx cookies: client cookies, set cookies, CookieConflict (tested) — httpx.get() forgets cookies; a Client jar stores Set-Cookie and sends it back. client.cookies.set(), per-request cookies= deprecated, CookieConflict fix.
- httpx upload file: post files as multipart/form-data (tested) — Upload files with httpx files=: filename/content-type tuples, form fields via data=, several files per field. Text-mode files raise TypeError; json= is dropped.
- httpx download file: stream to disk in chunks (tested) — Download a file with httpx.stream() and iter_bytes() to disk without loading it in memory. follow_redirects avoids a 0-byte file; async version included.
- httpx mock: MockTransport for tests (tested) — Mock httpx in tests with the built-in httpx.MockTransport: fake responses, assert requests, simulate timeouts, AsyncClient. No extra library needed.
- httpx logging: disable INFO lines, enable debug (tested) — Silence httpx's INFO 'HTTP Request: GET ...' log lines, turn on httpcore debug logging, and log requests with event hooks. Tested with httpx 0.28.1.
- httpx HTTP/2: enable http2=True (tested) — Enable HTTP/2 in httpx: install h2, Client(http2=True), check response.http_version, why http:// stays HTTP/1.1, and multiplexing. Tested.
- httpx base_url: how Client joins paths (tested) — httpx Client base_url tested: '/users' and 'users' both keep the base path, absolute URLs bypass it, UnsupportedProtocol without it, AsyncClient + params.
- httpx verify=False not working: 4 causes (tested) — httpx verify=False ignored? Put it on Client not client.get(), on the transport when using transport= or mounts=, and never as the string 'False'. Tested.
- httpx JSON decode error: response.json() fails (tested) — httpx r.json() raises json.JSONDecodeError (not httpx.HTTPError) on empty 204 bodies, HTML error pages and NDJSON. Causes, a safe helper, streaming lines.
- httpx websocket client: httpx-ws (tested) — httpx has no WebSocket support: httpx.get('ws://...') gets 426 Upgrade Required. Use httpx-ws connect_ws/aconnect_ws with your Client, or websockets.
- httpx AsyncClient RuntimeError: Event loop is closed (tested) — httpx AsyncClient raises RuntimeError: Event loop is closed when one client is reused over asyncio.run() calls. Reproduced and fixed (tested).
- matplotlib savefig: dpi, size, transparent, blank image (tested) — matplotlib savefig tested: pixels = figsize x dpi, bbox_inches='tight' crops, transparent=True alpha 0, format from extension, why the saved image is blank.
- matplotlib errorbar: no line, asymmetric, bar chart, colours (tested) — matplotlib errorbar tested: fmt='o' or 'none' removes the line, yerr=[lower, upper] for asymmetric bars, bar() with capsize, per-point colours.
- numpy errstate: ignore or raise divide by zero (tested) — np.errstate tested: defaults, divide='ignore' inside a with block, all='raise' gives FloatingPointError, and np.divide(where=) to avoid the warning entirely.
- uv pip install vs uv add: what each does (tested) — uv add records the package in pyproject.toml and uv.lock; uv pip install only installs, so the next uv sync uninstalls it. Tested with uv 0.13.5.
- uv ignore SSL errors: invalid peer certificate UnknownIssuer (tested) — uv invalid peer certificate: UnknownIssuer reproduced. --allow-insecure-host skips verification; SSL_CERT_FILE or --system-certs trusts your CA. Tested.
- numpy.dtype size changed, may indicate binary incompatibility (tested) — ValueError: numpy.dtype size changed. Expected 96 from C header, got 88 reproduced (pandas 2.0.3 + NumPy 2). Fix: upgrade pandas or pin numpy<2.
- Poetry ignore SSL errors: certificate verify failed (tested) — Poetry 'All attempts to connect failed' hides CERTIFICATE_VERIFY_FAILED. Skip verification with certificates.<source>.cert false, or point it at your CA.
- Poetry Authorization error accessing private repository (tested) — Poetry 'Source: Authorization error accessing' reproduced with a 401 index. Fix with poetry config http-basic.<source> or POETRY_HTTP_BASIC_* env vars.
- Python 3.13: CA cert does not include key usage extension (tested) — Python 3.13 enables VERIFY_X509_STRICT, so a CA without keyUsage fails verification. Reproduced vs 3.11; re-issue the CA or clear the flag. Tested.
- uv pip compile: requirements.in to requirements.txt (tested) — uv pip compile tested: pins requirements.in to requirements.txt, keeps existing pins until -U or -P, --generate-hashes, --universal markers, uv pip sync.
- NumPy 2 breaking changes: same code on 1.26 vs 2.x (tested) — NumPy 2 vs 1.26 side by side: np.float64(1.5) repr, NEP 50 promotion (uint8 wraps), copy=False ValueError, removed np.float_/NaN/in1d/row_stack, fixes.
- uv pip install -r requirements.txt: venv, errors, upgrade (tested) — uv pip install -r requirements.txt tested: finds .venv in parent dirs without activating, File not found, conflicts, -c constraints, -U and --dry-run.
- Poetry: All attempts to connect failed (3 causes, tested) — Poetry prints 'All attempts to connect failed' for SSL errors, connection refused and DNS failures alike. Run with -v to see which; tested fixes.
- pyinstaller: error: unrecognized arguments (tested causes) — pyinstaller unrecognized arguments tested: -onefile single dash, extra scripts after options, add-data ; vs :, removed --key, .spec file options.
- Poetry error: externally-managed-environment (tested fix) — pip install poetry fails with externally-managed-environment on Debian/Ubuntu. Tested: install Poetry in its own venv; virtualenvs.create false skips PEP 668.
- matplotlib legend not showing: No artists with labels (tested) — matplotlib legend not showing, tested: missing label=, underscore labels, legend() before plot, plt.legend on subplots, legend cut off in savefig.
- matplotlib axis labels not showing (tested fixes) — matplotlib axis labels not showing, tested: ax.xlabel = assignment, str object is not callable, plt.xlabel on subplots, labels cut off fixed by tight_layout.
- pip install numpy: error metadata-generation-failed (tested) — pip install numpy fails with metadata-generation-failed / Unknown compiler(s)? Tested: why pip builds from source, --only-binary check, unpin, older Python.
- MatplotlibDeprecationWarning: fix, silence, find it (tested) — Matplotlib deprecation warning tested on 3.11: boxplot vert, positional hist range/pie explode, how to ignore or raise it, why imported code hides it.
- numpy polyfit RankWarning: Polyfit may be poorly conditioned (tested) — numpy polyfit errors tested: RankWarning poorly conditioned (degree too high, large x), NaN gives all-NaN silently, np.RankWarning gone in numpy 2.
- PyInstaller ModuleNotFoundError: No module named (tested) — PyInstaller exe fails with ModuleNotFoundError: No module named but python works? Tested: hidden imports via importlib, pyinstaller from the wrong venv.
- numpy floating point errors: 0.1 + 0.2, isclose, arange (tested) — numpy floating point errors tested: 0.1+0.2 != 0.3, arange including stop, isclose default atol trap, float32 == 0.1 True, round half to even.
- uv sync errors: no pyproject, no solution, --locked, requires-python (tested) — uv sync errors tested: No pyproject.toml found, No solution found, lockfile needs to be updated with --locked, --frozen skips deps, requires-python.
- mypy error: Need type annotation for (tested) — mypy "Need type annotation for" on empty list, dict or set, tested with mypy 2.4: the fix (items: list[str] = []), when mypy infers it, how to ignore.
- mypy Incompatible types in assignment (tested) — mypy "Incompatible types in assignment (expression has type X, variable has type Y)" tested with mypy 2.4: Optional, int vs float, None defaults, redefinition.
- gunicorn CRITICAL WORKER TIMEOUT (tested) — gunicorn [CRITICAL] WORKER TIMEOUT reproduced with gunicorn 26.2: default 30s timeout, what the traceback shows, --timeout, gunicorn.conf.py and gthread.
- mypy Duplicate module named (tested) — mypy "Duplicate module named" and "Source file found twice under different module names" with mypy 2.4: __init__.py, --explicit-package-bases, --exclude.
- mypy Statement is unreachable (tested) — mypy "Statement is unreachable" tested with mypy 2.4: only with --warn-unreachable (not --strict), isinstance on a narrow type, bool, sys.exit, how to ignore.
- seaborn errorbar options: sd, ci, se, pi (tested) — seaborn errorbar options measured on one dataset with seaborn 0.13.2: default bootstrap ("ci", 95), "sd", "se", ("pi", 50), None, and the deprecated ci=.
- cv2.error (-215:Assertion failed) !_src.empty() (tested) — OpenCV (-215:Assertion failed) !_src.empty() in cvtColor and !ssize.empty() in resize, tested with OpenCV 5.0: imread returns None, empty crops, channels.
- gunicorn logs: where they go, access log, error log (tested) — Where gunicorn logs go (tested, 26.2): errors to stderr, no access log by default, --access-logfile -, --error-logfile, --capture-output for print().
- mypy Skipping analyzing / Library stubs not installed (tested) — mypy "Skipping analyzing: missing library stubs or py.typed marker", "Library stubs not installed" and import-not-found, tested with mypy 2.4: fixes.
- cv2.imshow error: The function is not implemented (tested) — cv2.imshow raises "The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support", tested: headless build, both packages, Qt xcb
- Plotly ValueError: Mime type rendering requires nbformat>=4.2.0 (tested) — Fix plotly ValueError "Mime type rendering requires nbformat>=4.2.0 but it is not installed", tested: install nbformat, restart the kernel, write_html fallback.
- sklearn error_score='raise' and FitFailedWarning (tested) — What sklearn error_score='raise' does, tested: FitFailedWarning vs Scoring failed, nan scores in GridSearchCV, error_score=0, getting the real traceback.
- Plotly error bars: error_y in px and graph_objects (tested) — Add error bars in plotly: px error_y / error_y_minus columns, go error_y dict (data, percent), asymmetric bars, and computing sd/se per group first. Tested.
- Plotly error bands: shaded confidence interval (tested) — Draw an error band in plotly: upper and lower traces with fill="tonexty" in the right order, or one fill="toself" polygon. Tested with plotly 7.1.0.
- StreamlitAPIException: duplicate key, session_state cannot be modified (tested) — Fix StreamlitAPIException in streamlit 1.66: duplicate element ID/key, session_state cannot be modified after the widget, read-only button state. Tested.
- Streamlit error message: st.error vs st.exception vs st.stop (tested) — Streamlit error handling, tested on 1.66: st.error only displays, st.exception shows a traceback, st.stop halts cleanly, showErrorDetails hides tracebacks.
- scipy minimize error: success False, precision loss, maxiter (tested) — scipy.optimize.minimize errors, tested on SciPy 1.18: maxiter exceeded, precision loss, NaN objective, must return a scalar, x0 one dimension, args.
- SciPy standard error: scipy.stats.sem, ddof, NaN and regression (tested) — Standard error in SciPy, tested: stats.sem uses ddof=1 (np.std does not), NaN handling, axis, a 95% CI, and linregress / curve_fit standard errors.
- SciPy error function: erf, erfc (complementary) and erfinv (inverse), tested — scipy.special.erf, erfc and erfinv, tested: why erfc beats 1-erf, erfinv range, norm.cdf link, and the np.erf / math.erf array errors.
- scipy install error: metadata-generation-failed, Unknown compiler(s) (tested) — pip install scipy failing with metadata-generation-failed and Unknown compiler(s), reproduced on Python 3.15: why it builds from source and the two fixes.
- Error: jupyter nbconvert is not installed / jupyter-nbconvert not found (tested) — Fix "Jupyter command jupyter-nbconvert not found" step by step: install nbconvert in the right env, then xelatex, webpdf and NoSuchKernel errors.
- Jupyter notebook kernel not found: NoSuchKernel, ipykernel install (tested) — Jupyter kernel not found / No such kernel named X, reproduced: kernelspec list, ipykernel install --user --name, kernel_name override, kernelspec remove.
- Error propagation in Python with SciPy: linear, Monte Carlo, uncertainties (tested) — Propagate measurement uncertainty in Python, tested: approx_fprime linear formula, scipy.stats Monte Carlo, the uncertainties package, and correlated inputs.
- Jupyter notebook kernel keeps dying: DeadKernelError, crash vs out of memory (tested) — Jupyter "kernel died" reproduced: a native crash and an OOM-style kill give the same DeadKernelError with no traceback. How to tell them apart and fix it.
- Docker Python ModuleNotFoundError: No module named in a container (tested) — Python ModuleNotFoundError inside Docker reproduced 3 ways: code not copied, package in a different Python (venv), src layout off sys.path. Fixes for each.
- Docker pip error: externally-managed-environment in a Dockerfile (tested) — pip install fails in a Debian/Ubuntu-based Dockerfile with externally-managed-environment. Reproduced, plus 4 tested fixes: python image, venv, flag, apt.
- Docker Python exec format error: wrong architecture or missing shebang (tested) — "exec /usr/local/bin/python: exec format error" reproduced: an arm64 image on amd64, and an entrypoint script with no #! line. How to check and fix both.
- Jupyter error 403 Forbidden and '_xsrf' argument missing from POST (tested) — Jupyter 403 reproduced: missing or wrong token gives Forbidden; cookie login without _xsrf gives "_xsrf argument missing from POST". Tested fixes for both.
- Jupyter "Error unpacking user from cookie" and "Clearing invalid/expired login cookie" (tested) — Jupyter logs "Error unpacking user from cookie" or "Clearing invalid/expired login cookie" for a stale login cookie. Both reproduced, with the fix.
- Jupyter "Error Starting Kernel" (500 Unhandled error): three causes, tested — Jupyter "Error Starting Kernel" / 500 Unhandled error: a deleted env, no ipykernel, or a broken kernel.json. All three reproduced, with a checker script.
- Jupyter install "error: externally-managed-environment" on Debian/Ubuntu (tested) — pip install jupyter fails with externally-managed-environment on Debian/Ubuntu, even with --user. Reproduced, and fixed with a venv.
- gunicorn "error: unrecognized arguments" (--host, --port, --worker) (tested) — gunicorn: error: unrecognized arguments: --host / --port, ambiguous option --worker, invalid int value 60s. Reproduced with the right --bind flags.
- gunicorn access log format: --access-logformat examples (tested) — gunicorn --access-logformat measured: default line, request time in ms, request-id header, JSON-style line, and what an unknown key prints.
- gunicorn 500 Internal Server Error: where the traceback is (tested) — gunicorn returns a bare 500 Internal Server Error page. Reproduced with a raw WSGI app and Flask: what the error log shows and where to look.
- pip install SyntaxError: invalid syntax (tested) — pip install gives SyntaxError: invalid syntax because you typed it at the Python >>> prompt or in a .py file. Reproduced, plus the shell and subprocess fixes.
- pip install error: subprocess-exited-with-error, exit code: 1 (tested) — pip install error: subprocess-exited-with-error, exit code: 1. Two causes reproduced (undeclared build dependency, failed C compile) and how to read the log.
- pip install tensorflow: No matching distribution found (tested) — "Could not find a version that satisfies the requirement tensorflow (from versions: none)": no wheel for your Python. Reproduced on 3.15, fixed with 3.13.
- pip install torch: No matching distribution found (tested) — "Could not find a version that satisfies the requirement torch (from versions: none)": reproduced on Python 3.15 and Alpine, with the wheel matrix and fix.
- TensorFlow Keras errors after upgrading to Keras 3 (tested) — No module named keras.layers.core, cannot import adam, Adam(lr=...) not recognized, invalid save extension: reproduced on TensorFlow 2.21 + Keras 3 with fixes.
- AssertionError: Torch not compiled with CUDA enabled (tested) — Torch not compiled with CUDA enabled means a CPU-only torch build. Reproduced vs "Found no NVIDIA driver", how to check your build, and device-agnostic code.
- PyTorch RuntimeError: Numpy is not available (tested) — torch raises RuntimeError: Numpy is not available on .numpy() when numpy is missing from the interpreter. Reproduced with the import warning, plus the fix.
- TensorFlow "triggered tf.function retracing" warning (tested) — "5 out of the last 5 calls ... triggered tf.function retracing": reproduced on TensorFlow 2.21 with trace counts, then fixed with tensors and reduce_retracing.
- torch.accelerator error: Cannot access accelerator device (tested) — torch.accelerator raises RuntimeError when no device is usable, and current_accelerator() can return cuda with no GPU. Reproduced on torch 2.14, with the fix.
- TensorFlow ResourceExhaustedError: OOM when allocating tensor (tested) — "ResourceExhaustedError: OOM when allocating tensor with shape[...]" reproduced on TensorFlow 2.21, how to read the shape, and a batched fix that ran.
- Keras ImageDataGenerator deprecated: replacement (tested) — ImageDataGenerator in Keras 3: which import fails, which still works, and the image_dataset_from_directory + augmentation layers replacement, tested.
- No module named 'keras.wrappers.scikit_learn' (tested fix) — ModuleNotFoundError for keras.wrappers.scikit_learn and tensorflow.keras.wrappers, reproduced on Keras 3 and fixed with scikeras KerasClassifier + GridSearchCV.
- ModuleNotFoundError: No module named 'torch' (tested fix) — No module named 'torch' even after installing it: reproduced with two interpreters, fixed with python -m pip, plus why pip install pytorch fails on purpose.
- Keras "Invalid filepath extension for saving" (tested fix) — Keras 3 model.save("my_model") ValueError reproduced, then fixed: .keras vs .h5, model.export() for SavedModel, and loading it back with TFSMLayer.
- module 'tensorflow' has no attribute 'Session' (tested fix) — AttributeError for tf.Session, tf.placeholder and global_variables_initializer reproduced on TensorFlow 2.21, then fixed with eager code or tf.compat.v1.
- Keras 3: AttributeError module 'keras' has no attribute (tested) — np_utils, layers.experimental, backend.get_session/set_session and optimizers.legacy errors in Keras 3, measured, with the replacement for each.
- pip install torch "error: externally-managed-environment" (tested) — pip install torch fails with externally-managed-environment on Debian/Ubuntu, even with --user. Reproduced, fixed with a venv and the CPU-only wheel.
- TensorFlow import error with NumPy 2: _ARRAY_API not found (tested) — import tensorflow fails with "_ARRAY_API not found" and "numpy.core.umath failed to import" on NumPy 2. Reproduced on TF 2.15; fixed two ways.
- "A module that was compiled using NumPy 1.x cannot be run in NumPy 2" (tested) — What the NumPy 1.x/NumPy 2 banner and its traceback mean, why torch keeps going but .numpy() fails, and two tested fixes: numpy<2 or upgrade.
- ImportError: numpy.core.multiarray failed to import (cv2, tested) — import cv2 fails with numpy.core.multiarray failed to import and _ARRAY_API not found: old OpenCV built for NumPy 1.x. Reproduced; two tested fixes.
- import sklearn: _ARRAY_API not found with NumPy 2 (tested) — import sklearn fails with _ARRAY_API not found and numpy.core.multiarray failed to import on NumPy 2. The real culprit is old SciPy. Two tested fixes.
- SciPy and NumPy 2 compatibility (tested) — Old SciPy on NumPy 2 fails with multiarray failed to import, numpy.dtype size changed, or cannot import Inf. SciPy 1.13+ supports NumPy 2. Tested fixes.
- Matplotlib and NumPy 2 compatibility (tested) — import matplotlib fails on NumPy 2 with numpy.core.multiarray failed to import on 3.8.3 and older. Matplotlib 3.8.4 is the first that works. Tested fixes.
- ImportError: Numba needs NumPy 2.2 or less (tested) — import numba fails with "Numba needs NumPy 2.2 or less" (or 2.0 or less). Which NumPy each Numba release allows, and two tested fixes.
- PyArrow and NumPy 2 compatibility (tested) — import pyarrow fails on NumPy 2 with _ARRAY_API not found and numpy.core.multiarray failed to import. PyArrow 16.0.0 is the first that works. Tested fixes.
- statsmodels and NumPy 2 compatibility (tested) — statsmodels 0.14.1 fails on NumPy 2 with numpy.dtype size changed; 0.14.2 is the first that works. Plus the scipy _lazywhere and pandas 3 errors. Tested.
- gensim: cannot import name 'triu' from 'scipy.linalg' (tested) — import gensim fails: cannot import name 'triu' from 'scipy.linalg' on SciPy 1.13+. Upgrade to gensim 4.4.0 or pin scipy<1.13. Plus the NumPy 2 error, tested.
- shap and NumPy 2 compatibility (tested) — shap 0.45 and older print C extension was not built during install! and fail with numpy.core.multiarray failed to import on NumPy 2. 0.46.0 works. Tested.
- spaCy and NumPy 2 compatibility (tested) — import spacy fails with numpy.dtype size changed in thinc numpy_ops after NumPy 2 is installed. spaCy 3.8 with thinc 8.3 works. Tested fixes.
- PyTables and NumPy 2 compatibility (tested) — import tables fails on NumPy 2 with numpy.dtype size changed in utilsextension. PyTables 3.10.1 is the first that works; 3.9.2 is uncapped. Tested fixes.
- astropy and NumPy 2 compatibility (tested) — astropy 6.0 fails on NumPy 2 (numpy.dtype size changed); 6.1 to 7.1 fail on NumPy 2.4 (no attribute 'in1d'). 7.2.0 works. Tested fixes.
- NumPy 2.4: module 'numpy' has no attribute 'in1d' / 'trapz' (tested) — NumPy 2.4 removed np.in1d and np.trapz. Use np.isin and np.trapezoid. NumPy 2.3 vs 2.4 output, tested, plus what to do when a library calls them.
- scikit-learn-extra + NumPy 2: dtype size changed (tested fixes) — scikit-learn-extra 0.3.0 fails to import on NumPy 2 (dtype size changed in _cyfht). Tested fixes: numpy<2, install from GitHub main, or the kmedoids package.
- librosa + NumPy 2: works; the real error is pkg_resources (tested) — librosa 0.10.2+ runs on NumPy 2.4 (tested). Older librosa fails with No module named 'pkg_resources' (setuptools 82+), not NumPy. Fixes, tested.
- TensorBoard: No module named 'pkg_resources' (tested fix) — tensorboard 2.20 and older import pkg_resources, which setuptools 82 removed. Tested fixes: upgrade to tensorboard 2.21.0 or pin setuptools<81.
- cx_Oracle install: No module named 'pkg_resources' (tested fix) — pip install cx_Oracle fails with No module named 'pkg_resources', even with setuptools. Tested fixes: oracledb, --build-constraint, no build isolation.
- selenium-wire: No module named 'pkg_resources' / blinker._saferef (tested) — from seleniumwire import webdriver fails with No module named 'pkg_resources', then blinker._saferef. Tested fix: pin setuptools<81 and blinker<1.8.
- openai CLIP: No module named 'pkg_resources' on pip install (tested) — pip install git+https://github.com/openai/CLIP.git fails with No module named 'pkg_resources'. Fix: install main or --build-constraint setuptools<81.
- uv: No module named 'pkg_resources' when building a package (tested) — uv add fails building an sdist with No module named 'pkg_resources'. The hint's fix fails; build-constraint-dependencies setuptools<81 works.
- Poetry: No module named 'pkg_resources' (PEP517 build failed, tested) — poetry add fails with PEP517 build of a dependency failed: No module named 'pkg_resources'. Tested fix: [tool.poetry.build-constraints] setuptools<81.
- pipenv: No module named 'pkg_resources' (hidden lock error, tested) — pipenv install fails with 'dependencies could not be resolved' but the cause is a hidden No module named 'pkg_resources'. Tested fix: PIP_BUILD_CONSTRAINT.
- docker build: No module named 'pkg_resources' (tested Dockerfile fix) — docker build fails at pip install with No module named 'pkg_resources'. Tested Dockerfile fix for pip 24 and 26: PIP_CONSTRAINT + PIP_BUILD_CONSTRAINT.
- Ansible pip module: No module named 'pkg_resources' (tested fix) — Ansible pip module fails: Failed to import the required Python library (setuptools), No module named 'pkg_resources'. Fix: ansible-core 2.19 or setuptools<81.
- import fs: No module named 'pkg_resources' (PyFilesystem2, tested) — import fs fails with ModuleNotFoundError: No module named 'pkg_resources' (fs 2.4.16, setuptools 82+). Tested fix: pin setuptools<81 next to fs.
- UserWarning: pkg_resources is deprecated as an API (tested fixes) — UserWarning: pkg_resources is deprecated as an API. What it means (setuptools 82 removes it), how to find the importer, and two tested ways to silence it.
- pygame: pkg_resources is deprecated as an API (tested fix) — pygame 2.6.1 prints UserWarning: pkg_resources is deprecated as an API from pkgdata.py. Tested: upgrading setuptools removes it; or silence via PYTHONWARNINGS.
- Home Assistant: No module named 'pkg_resources' (tested fix) — Home Assistant Core up to 2023.8 imports pkg_resources, so hass fails on setuptools 82+. Tested: upgrade to 2023.9, or pin setuptools<81.
- Odoo: No module named 'pkg_resources' (tested fix) — Odoo 16 imports pkg_resources in odoo/modules/module.py, so odoo-bin fails on setuptools 82+. Tested fix: pin setuptools<81. Odoo 17 has a fallback.
- Stable Diffusion WebUI: No module named 'pkg_resources' (tested) — AUTOMATIC1111 webui fails installing CLIP with No module named 'pkg_resources' on pip 25.3+. Tested fixes: PIP_BUILD_CONSTRAINT, --no-build-isolation, pip<25.3.
- Trac 1.6: No module named 'pkg_resources' (tested fix) — Trac 1.6 imports pkg_resources in trac/__init__.py, so trac-admin and tracd fail on setuptools 82+. Tested fix: pin setuptools<81. Trunk still affected.
- supervisord: No module named 'pkg_resources' (tested fix) — supervisor 4.2.5 imports pkg_resources in options.py, so supervisord fails on setuptools 82+. Tested fix: upgrade to supervisor 4.3.0, or pin setuptools<81.
- deluge 2.2.0: No module named 'pkg_resources' (tested fix) — deluge 2.2.0 imports pkg_resources in ui_entry.py and pluginmanagerbase.py, so deluge and deluge-web fail on setuptools 82+. Tested fix: setuptools<81.
- paster (PasteScript): No module named 'pkg_resources' (tested) — PasteScript 3.7.0 imports pkg_resources in paste/script/command.py, so every paster command fails on setuptools 82+. Tested fix: pin setuptools<81.
- jenkins-jobs: No jjb.cli.subcommands extensions found (fix) — Jenkins Job Builder 6.5.0 imports pkg_resources, so on setuptools 82+ jenkins-jobs fails with NoMatches. Tested fix: pin setuptools<81.
- mim install: No module named 'pkg_resources' (tested fix) — openmim 0.3.9 imports pkg_resources, so every mim command (mim install mmcv too) fails on setuptools 82+. Tested fix: pin setuptools<81.
- pyqt5-tools designer: No module named 'pkg_resources' (fix) — pyqt5-tools imports pkg_resources, so pyqt5-tools designer fails on setuptools 82+ or with no setuptools. Tested fix: pin setuptools<81.
- scrapyd RunnerError: No module named 'pkg_resources' (fix) — scrapyd 1.6.0 runner.py imports pkg_resources, so addversion.json and scrapyd-deploy fail on setuptools 82+. Tested fix: pin setuptools<81.
- pyqt6-tools designer: No module named 'pkg_resources' (fix) — pyqt6-tools imports pkg_resources, so pyqt6-tools designer fails on setuptools 82+ or with no setuptools. Tested fix: pin setuptools<81.
- opsdroid: No module named 'pkg_resources' (fix) — opsdroid 0.31.0 imports pkg_resources in loader.py, so every command fails on setuptools 82+. Tested fix: pin setuptools<81.
- nameko: No module named 'pkg_resources' (fix) — nameko 2.14.1 imports pkg_resources in cli/main.py, so nameko run fails on setuptools 82+. Tested fixes: setuptools<81 or nameko 3.0.0rc11.
- python -m eel: No module named 'pkg_resources' (fix) — Eel's python -m eel bundler imports pkg_resources, so it fails on setuptools 82+. Tested fixes: pin setuptools<81 or run PyInstaller directly.
- Open Interpreter: No module named 'pkg_resources' (fix) — open-interpreter 0.4.3 imports pkg_resources, so interpreter and from interpreter import interpreter fail on setuptools 82+. Tested fix: setuptools<81.
- wfuzz: No module named 'pkg_resources' (and pip install fails) — wfuzz 3.1.0 fails twice: pip 24.1+ rejects its metadata, then it imports pkg_resources (gone in setuptools 82+). Tested fix: pip<24.1, setuptools<81.
- nnictl: No module named 'pkg_resources' (NNI fix) — NNI 3.0's nnictl imports pkg_resources, so every nnictl command fails on setuptools 82+. Tested fix: pin setuptools<81. The Python API imports fine.
- embedchain ec: No module named 'pkg_resources' (fix) — embedchain 0.1.128's ec CLI imports pkg_resources, so ec fails on setuptools 82+. Tested fix: pin setuptools<81. from embedchain import App works.
- import yolov5: No module named 'pkg_resources' (fix) — The yolov5 PyPI package (7.0.14) imports pkg_resources, so import yolov5 fails on setuptools 82+. Tested fix: setuptools<81, then the torch 2.6 weights fix.
- torch.load: Weights only load failed (fix) — Since torch 2.6, torch.load defaults to weights_only=True and rejects full-model files. Tested fixes: weights_only=False, add_safe_globals, or a state_dict.
- ultralytics YOLO: Weights only load failed (fix) — Old ultralytics fails to load yolov8n.pt on torch 2.6+ with UnpicklingError. Tested fixes: upgrade to 8.2.103+ or set TORCH_FORCE_NO_WEIGHTS_ONLY_LOAD=1.
- torchaudio has no attribute 'AudioMetaData' (fix) — pyannote.audio 3.x fails to import on torchaudio 2.9+ (AudioMetaData removed). Tested fixes: pin torch+torchaudio 2.8.0, or upgrade to pyannote.audio 4.
- torchaudio has no attribute 'info' (fix) — torchaudio 2.9 removed torchaudio.info. Tested fixes: soundfile.info (field names differ) or pin torch+torchaudio 2.8.0. Plus the torchaudio.load error.
- Could not load libtorchcodec (fix) — torchaudio.load fails with "Could not load libtorchcodec" or an OSError on libtorchcodec_image.so. Tested: missing FFmpeg vs. torchcodec/torch mismatch.
- No module named 'torchaudio.backend' (fix) — torchaudio 2.9 removed torchaudio.backend, set_audio_backend and list_audio_backends. Tested: guard the calls (load ignores backend) or pin 2.8.0.
- No module named 'torchaudio.io' (fix) — torchaudio 2.9 removed torchaudio.io (StreamReader/StreamWriter). Tested: torchcodec AudioDecoder/AudioEncoder, or pin 2.8.0 with FFmpeg 6 or older.
- torchaudio: Failed to intialize FFmpeg extension (fix) — torchaudio 2.8 StreamReader: ImportError Failed to intialize FFmpeg extension. Tried versions ['6','5','4']. FFmpeg 7 fails too; FFmpeg 6 fixed it.
- torchaudio sox_effects: libsox.so not found (fix) — torchaudio 2.8: OSError libsox.so cannot open shared object file. 2.9: No module named 'torchaudio.sox_effects'. Tested fixes: torchaudio.functional or libsox.
- torchaudio.utils has no attribute 'download_asset' (fix) — torchaudio 2.9 removed torchaudio.utils.download_asset (ImportError / AttributeError). Tested: a 6-line replacement, the private _download_asset, or pin 2.8.
- CTC Decoder suit requires flashlight-text package (fix) — torchaudio ctc_decoder fails without flashlight-text. Tested: pip install flashlight-text; on Python 3.13 (no wheel) the exact env vars that make it build.
- No module named 'torchaudio.kaldi_io' (fix) — torchaudio 2.9 removed torchaudio.kaldi_io. Tested: read Kaldi ark/scp files with kaldiio and torch.from_numpy (same result), or pin torchaudio 2.8.0.
- torchaudio libtorchaudio.so undefined symbol (fix) — OSError libtorchaudio.so: undefined symbol (or libtorch_cuda.so not found) means torch and torchaudio don't match. Tested diagnosis and fix.
- RuntimeError: operator torchvision::nms does not exist (fix) — import torchvision raises operator torchvision::nms does not exist (or segfaults) when torch and torchvision don't match. Tested check and fix.
- module 'torchvision.transforms' has no attribute 'v2' (fix) — AttributeError: module 'torchvision.transforms' has no attribute 'v2' has two causes: v2 not imported, or torchvision too old. Both tested.
- module 'torchvision' has no attribute 'disable_beta_transforms_warning' (fix) — AttributeError: module 'torchvision' has no attribute 'disable_beta_transforms_warning' means torchvision is too old. Tested on 0.14.1 vs 0.24.0, with fixes.
- cannot enable executable stack as shared object requires: Invalid argument (fix) — ImportError: cannot enable executable stack as shared object requires: Invalid argument after a glibc 2.41 upgrade. Reproduced with torch 1.10, 3 tested fixes.
- module 'torchvision.transforms' has no attribute 'Scale' (fix) — AttributeError: module 'torchvision.transforms' has no attribute 'Scale': Scale was removed in torchvision 0.12. Tested on 0.11.3 vs 0.24.0; use Resize.
- torch: ModuleNotFoundError: No module named 'pkg_resources' (fix) — import torch or torch.utils.cpp_extension raises No module named 'pkg_resources' on torch 1.10-2.1 with new setuptools. Tested on 1.10.2, 2.1.2, 2.9.0.
- onnxruntime: cannot enable executable stack as shared object requires (fix) — import onnxruntime fails with cannot enable executable stack as shared object requires: Invalid argument on glibc 2.41. 1.16.3 affected, 1.17.3 OK. 3 fixes.
- partially initialized module 'torchvision' has no attribute 'extension' (fix) — partially initialized module 'torchvision' has no attribute 'extension' is a second import after a failed first one. Reproduced on torch 2.8 + torchvision 0.24.
- ComfyUI: ModuleNotFoundError: No module named 'torchaudio' (fix) — ComfyUI v0.37 and older won't start without torchaudio: comfy/sd.py imports it. Reproduced on v0.37.0; install the matching torchaudio or update to v0.38.
- ComfyUI: ModuleNotFoundError: No module named 'av' (fix) — ComfyUI won't start without PyAV: comfy_api imports av. Reproduced on v0.37.0, plus the old-av ColorPrimaries ImportError and the Python 3.9 pip error.
- ComfyUI: ModuleNotFoundError: No module named 'sqlalchemy' (fix) — ComfyUI v0.37 exits at startup without SQLAlchemy (app.assets imports it). Reproduced; fix with pip install -r requirements.txt. Missing alembic only warns.
- ComfyUI: ModuleNotFoundError: No module named 'gguf' (fix) — ComfyUI-GGUF shows IMPORT FAILED with No module named 'gguf' when its requirements.txt was skipped. Reproduced on v0.37.0; install it into ComfyUI's Python.
- ComfyUI-Manager: Failed to initialize: Bad git executable (fix) — ComfyUI-Manager shows IMPORT FAILED with 'Bad git executable' when git is not on PATH. Reproduced; fix by installing git or setting GIT_PYTHON_GIT_EXECUTABLE.
- ComfyUI: ModuleNotFoundError: No module named 'insightface' (fix) — InstantID and other face nodes show IMPORT FAILED with No module named 'insightface'. Reproduced on ComfyUI v0.37.0; insightface 2.x installs as a wheel.
- ComfyUI-Manager: ModuleNotFoundError: No module named 'comfy' (fix) — comfyui_manager imports comfy.cli_args, which only exists inside your ComfyUI folder. Reproduced with Manager 4.2.2; use --enable-manager or COMFYUI_PATH.
- ComfyUI: ModuleNotFoundError: No module named 'yaml' (fix) — No module named 'yaml' when starting ComfyUI means main.py runs under a Python without its requirements. Reproduced on v0.3.40; v0.37.0 says 'filelock'.
- ComfyUI: ModuleNotFoundError: No module named 'ultralytics' (fix) — ComfyUI-Impact-Subpack shows IMPORT FAILED with No module named 'ultralytics' when its requirements were skipped. Reproduced on v0.37.0 and fixed.
- ComfyUI: ModuleNotFoundError: No module named 'comfy.options' (fix) — An unrelated PyPI package named comfy shadows ComfyUI's comfy folder, so main.py fails at line 1. Reproduced on v0.37.0; pip uninstall comfy fixes it.
- ComfyUI: ModuleNotFoundError: No module named 'soundfile' (fix) — comfyui-various shows IMPORT FAILED with No module named 'soundfile' when its extra nodes are enabled. Reproduced on ComfyUI v0.37.0 and fixed.
- ComfyUI --use-sage-attention: No module named 'triton' (fix) — ComfyUI --use-sage-attention crashes with No module named 'triton' when sageattention is installed without Triton. Reproduced on v0.37.0 and fixed.
- ComfyUI: ModuleNotFoundError: No module named 'cv2' (fix) — ComfyUI custom nodes like InstantID and Impact Subpack fail with No module named 'cv2' when OpenCV is missing. Reproduced on v0.37.0 and fixed.
- ComfyUI: ModuleNotFoundError: No module named 'onnxruntime' (fix) — ComfyUI InstantID and other insightface nodes fail with No module named 'onnxruntime' when ONNX Runtime is missing. Reproduced on v0.37.0 and fixed.
- ComfyUI: module 'onnxruntime' has no attribute 'InferenceSession' (fix) — With both onnxruntime and onnxruntime-gpu installed, uninstalling one breaks the other. Reproduced in ComfyUI with insightface and fixed.
- ComfyUI-Manager cm-cli: ModuleNotFoundError: No module named 'utils' (fix) — cm-cli.py imports utils.extra_config from your ComfyUI folder. Reproduced: a Manager cloned outside custom_nodes needs COMFYUI_PATH; PyPI utils shadows it.
- ComfyUI: ModuleNotFoundError: No module named 'torchsde' (fix) — ComfyUI's core samplers import torchsde, so it exits before the UI starts. Reproduced on v0.37.0; fixed by installing torchsde with ComfyUI's own Python.
- ComfyUI --directml: No module named 'torch_directml' (fix) — --directml imports torch_directml, which ComfyUI does not install. Reproduced on v0.37.0; the package pins torch 2.4.1 and has no Python 3.13 wheels.
- pip install flash-attn: No module named 'torch' (fix) — Why flash-attn fails to build (torch, setuptools.build_meta, CUDA_HOME), the SKIP_CUDA_BUILD trap, and which prebuilt wheel to use. Measured, incl. ComfyUI.
- ComfyUI: ModuleNotFoundError: No module named 'transformers' (fix) — ComfyUI core imports transformers (sd1_clip.py line 3), so startup stops with exit 1. Reproduced on v0.37.0 and fixed with requirements.txt.
- ComfyUI: ModuleNotFoundError: No module named 'tqdm' (fix) — ComfyUI imports tqdm at startup (main.py line 35 via comfy_execution/progress.py) and exits 1 without it. Reproduced on v0.37.0, fixed with requirements.txt.
- ComfyUI: ModuleNotFoundError: No module named 'requests' (fix) — ComfyUI imports requests at startup (server.py via app/frontend_management.py) and exits 1 without it. Reproduced on v0.37.0, fixed with requirements.txt.
- ComfyUI: ModuleNotFoundError: No module named 'safetensors' (fix) — ComfyUI imports safetensors at startup (main.py line 249 via comfy/utils.py) and exits 1 without it. Reproduced on v0.37.0, fixed with requirements.txt.
- ComfyUI: ModuleNotFoundError: No module named 'einops' (fix) — ComfyUI imports einops at startup (main.py line 249 via comfy/utils.py) and exits 1 without it. Reproduced on v0.37.0, fixed with requirements.txt.
- ComfyUI: ModuleNotFoundError: No module named 'aiohttp' (fix) — ComfyUI imports aiohttp at startup (main.py line 27 via app/assets/manager.py) and exits 1 without it. Reproduced on v0.37.0, fixed with requirements.txt.
- ComfyUI: ModuleNotFoundError: No module named 'PIL' (fix) — ComfyUI imports PIL (Pillow) at startup via comfy_execution/progress.py and exits 1 without it. Reproduced on v0.37.0; fix: install Pillow, not PIL.
- ComfyUI: No module named 'numpy' or 'numpy.dtypes' (fix) — ComfyUI exits 1 without NumPy, and with NumPy below 1.25 it fails on numpy.dtypes (comfy/utils.py line 55). Both reproduced on v0.37.0 and fixed.
- ComfyUI-Manager: No module named 'toml' (IMPORT FAILED fix) — Cannot import ComfyUI-Manager module for custom nodes: No module named 'toml'. Reproduced with Manager V3.42 when its auto-install fails; fixed in one command.
- ComfyUI-Manager: No module named 'git' (IMPORT FAILED fix) — Cannot import ComfyUI-Manager module for custom nodes: No module named 'git'. Reproduced with Manager V3.42; fix = install GitPython with ComfyUI's Python.
- Content-Type charset=utf-8 (tested) — We served the same UTF-8 text under 13 Content-Type and meta variants in Chromium 153. Without a charset it rendered café as windows-1252; the header beat meta, a BOM beat the header, fetch().text() ignored it. Plus Python requests, Node, Express and nginx fixes.
- Location header: relative vs absolute URLs (tested) — Relative Location values like next, /next, ../x, //host/x and ?q=1 resolved the same in Chromium 153, curl 8.14.1 and Node 24 fetch on every 3xx code. Plus: POST becoming GET on 301/302/303, Location on 201 is never followed, and why fetch redirect: manual hides it.
- TypeError: object is not subscriptable (tested) — We reproduced TypeError: object is not subscriptable on Python 3.13.5: list.sort() returning None, int, float, custom classes, and functions. Exact fixes.
- re.error: nothing to repeat (tested) — We triggered Python's regex 'nothing to repeat' and 'multiple repeat' errors 5 ways and measured the exact position and fix for each.
- Vite dependency-optimization crash (tested) — We crashed Vite 8.3.2's dev server with one broken dependency and measured the exact fix (optimizeDeps.exclude) that keeps it running.
Data tools on Apify
- SEO Audit Crawler & Broken Link Checker – Website Health — Crawl any website and audit every page: titles, meta descriptions, H1s, canonicals, noindex, broken links, duplicates, Open Graph. $5 per 1,000 pages.
- DNS Lookup & WHOIS Domain Checker — SPF/DMARC, SSL Expiry — Check domains in bulk: registrar, creation & expiry dates via RDAP, DNS records, SPF/DMARC and SSL certificate expiry. $2 per 1,000 domains.
- Sitemap Extractor & Bulk URL Status Checker — Extract every URL from a site's sitemaps and find broken links (404/5xx), redirect chains and noindex pages in bulk. $1 per 1,000 URLs.
- Website Technology Detector – Tech Stack, CMS & Analytics — Detect the CMS, ecommerce platform, frameworks, hosting, analytics pixels, chat and payment tools of any website list, plus email provider. $2 per 1,000.
- PDF Extractor & Parser – Bulk PDF to Text with Metadata — Extract clean text from PDF URLs in bulk: full text or per page, plus title, author, dates and page count. Flat $0.003 per PDF, LLM/RAG-ready.
- App Store Reviews Scraper – Apple iOS, Multi-Country — Scrape Apple App Store reviews for any app from 40+ countries in one run: rating, text, version, date, votes, plus app rating summary. $0.10 per 1,000 reviews.
- Job Postings & Career Page Scraper – Workday, Greenhouse, Lever — All open jobs from company career sites on Workday, Greenhouse, Lever, Ashby, SmartRecruiters, Recruitee & Workable in one schema, with salary & descriptions. $1 per 1,000 jobs.
- Company Enrichment from Domain (Logo, Socials, Tech) — Enrich company domains with name, description, logo, LinkedIn/X/Facebook pages, address, tech stack, email provider and domain age. $2 per 1,000 companies.
- Email Validator & MX Record Checker – Bulk, Disposable, Role — Validate email lists in bulk: syntax, MX records, disposable and role addresses, typo suggestions. No SMTP probing. $1 per 1,000 emails.
- Website Screenshot API – Bulk Full Page PNG, JPEG & PDF — Screenshot many URLs at once: full-page or viewport PNG/JPEG/PDF, desktop or mobile, cookie banners hidden. Public image links in the dataset. $3 per 1,000 screenshots.
- Bulk PageSpeed Insights, Lighthouse & Core Web Vitals — Test many URLs with Lighthouse on mobile and desktop: performance score, LCP, CLS, TBT, fix opportunities. No setup; optional API key adds CrUX field data. $0.02 per test.
- Article Scraper & Text Extractor – Clean Markdown for LLM/RAG — Extract clean article text, title, author, date and Markdown from any list of URLs. No browser, fast, per-URL errors. $1 per 1,000 articles.
- Bluesky Posts Scraper – Profiles & Threads, No Login — Export Bluesky posts from any profiles and full reply threads with likes, reposts and quotes via the official public API. No login. $0.50 per 1,000 posts.
- Steam Reviews Scraper – Game Reviews & App Details — Export Steam game reviews in bulk with playtime, votes, language and recommendation, plus game details and review summary. No login. $0.50 per 1,000 reviews.
- Wayback Machine Scraper — Archived URLs & Snapshot History — List Wayback Machine captures for any URL or every archived URL of a domain via the official CDX API. Date filters, dedupe. $0.50 per 1,000 rows.
- App Store Keyword Rank Tracker & Top Charts — iOS ASO — Check iOS app keyword rankings across countries and fetch App Store top free, paid and grossing charts by category. $1 per 1,000 rows.
- Brazil CNPJ Lookup — Company Data from Receita Federal (Bulk) — Bulk CNPJ consulta: company name, status, CNAE, opening date, size, capital, Simples/MEI and address from Receita Federal open data. $1 per 1,000 companies.
- France Company Search (SIRENE/SIREN) — Bulk Company Data — Search French companies by name, SIREN, département or NAF code: status, size, VAT, revenue, address. Official government API. $1 per 1,000 companies.
Everything here is built with AI assistance by an independent developer and is open source (MIT). No analytics, no cookies.