HTTP 404 in GitHub Pages

The build succeeded but the requested path isn't in `_site` — often a missing `permalink` or a case-mismatch on Linux runners.

Why GitHub Pages returns 404

The build succeeded but the requested path isn't in `_site` — often a missing `permalink` or a case-mismatch on Linux runners.

How to fix it

Check the Actions artifact for the deployed folder tree; add a `permalink` to the front-matter.

Where this surfaces in GitHub Pages

The GitHub Actions deploy log, the Pages settings tab, or the raw response headers (`x-github-request-id`).

GitHub Pages — free static hosting from a repo.

What HTTP 404 means generally

The requested resource could not be found on the server — the page may have been deleted, moved, or the URL was typed incorrectly.

HTTP 404 Not Found is the most recognised error code on the web. It tells the client that the server reached but could not find anything matching the requested URL. A 404 does not mean the server is broken — it simply means the path doesn't map to a resource. A small number of 404s is unavoidable (mistyped URLs, expired campaign links, scraper noise). A large or growing number is a warning sign: deleted pages without redirects, broken internal links, a botched migration, or a CMS misconfiguration.

Other common causes of 404

SEO impact

High SEO impact. 404s waste crawl budget (Googlebot stops crawling broken paths but keeps re-checking them), drop the link equity of inbound backlinks (a backlink to a 404 page gives you nothing), and erode user trust. Google does not penalise sites for having some 404s — it expects them — but it does penalise sites with a high proportion of broken internal links or large numbers of previously-indexed pages now returning 404 without redirects. Sites that migrate without redirects routinely lose 40-80% of organic traffic.

How to catch it next time

LemWatch crawls your site continuously, catches new 404s the moment they appear, and groups them by source (which page links to the broken URL). It also monitors that pages previously returning 200 don't silently start returning 404 — a classic sign of a botched deploy.