Catalog / garretthaas.com
65

SEO audit for garretthaas.com

Garrett Haas

other

Health 65/100 (fair) · 50 pages crawled · generated 2026-08-26

Download Markdown report (feed to ChatGPT / Claude / Cursor)

cargo.site

Screenshot of garretthaas.com
50
pages crawled
50
indexable pages
0
errors
228
warnings
428
notices
0
orphan pages
0
broken links
Category breakdown
CategoryScoreErrorsWarningsNotices
Agent Readiness 70 0 50 7
Canonical 70 0 50 0
Content 71 0 49 54
Headings 72 0 46 0
Rendering 82 0 30 0
Duplicate 98 0 3 50
Images 100 0 0 2
Meta Description 100 0 0 50
Mobile 100 0 0 50
Performance 100 0 0 104
Security 100 0 0 51
Structured Data 100 0 0 50
Titles 100 0 0 2
URL 100 0 0 8
Findings

Warnings (7 rules)

warning Control has no accessible name

Rule agent.control_no_name · Agent Readiness · 50 occurrence(s)

warning Homepage duplicated across protocol/host variants (no redirect)

Rule duplicate.protocol_host · Duplicate · 1 occurrence(s)

  • https://garretthaas.com/ — https://www.garretthaas.com/ serves the same homepage content with a 200 and no redirect — Google sees a duplicate. Pick one canonical host/scheme and 301-redirect the others.

warning Duplicate <title> across pages

Rule duplicate.title · Duplicate · 2 occurrence(s)

warning Content only rendered by JavaScript (invisible to non-JS crawlers & AI)

Rule rendering.js_shell · Rendering · 30 occurrence(s)

  • https://garretthaas.com/alogod — Raw HTML has 1 words and 0 links — this page is built by JavaScript in the browser. Googlebot renders JS but delays it, and most crawlers and AI assistants (ChatGPT, Perplexity, Claude) don't run JavaScript at all, so to them the page looks empty. Server-render or pre-render your main content and navigation.
  • https://garretthaas.com/andere-sound-1 — Raw HTML has 18 words and 0 links — this page is built by JavaScript in the browser. Googlebot renders JS but delays it, and most crawlers and AI assistants (ChatGPT, Perplexity, Claude) don't run JavaScript at all, so to them the page looks empty. Server-render or pre-render your main content and navigation.
  • https://garretthaas.com/archive-2 — Raw HTML has 1 words and 0 links — this page is built by JavaScript in the browser. Googlebot renders JS but delays it, and most crawlers and AI assistants (ChatGPT, Perplexity, Claude) don't run JavaScript at all, so to them the page looks empty. Server-render or pre-render your main content and navigation.
  • https://garretthaas.com/archive-old — Raw HTML has 1 words and 0 links — this page is built by JavaScript in the browser. Googlebot renders JS but delays it, and most crawlers and AI assistants (ChatGPT, Perplexity, Claude) don't run JavaScript at all, so to them the page looks empty. Server-render or pre-render your main content and navigation.
  • https://garretthaas.com/article-one-eyewear — Raw HTML has 14 words and 0 links — this page is built by JavaScript in the browser. Googlebot renders JS but delays it, and most crawlers and AI assistants (ChatGPT, Perplexity, Claude) don't run JavaScript at all, so to them the page looks empty. Server-render or pre-render your main content and navigation.
  • https://garretthaas.com/atelier-delphine — Raw HTML has 16 words and 0 links — this page is built by JavaScript in the browser. Googlebot renders JS but delays it, and most crawlers and AI assistants (ChatGPT, Perplexity, Claude) don't run JavaScript at all, so to them the page looks empty. Server-render or pre-render your main content and navigation.
  • https://garretthaas.com/call-of-duty-black-ops-7 — Raw HTML has 15 words and 0 links — this page is built by JavaScript in the browser. Googlebot renders JS but delays it, and most crawlers and AI assistants (ChatGPT, Perplexity, Claude) don't run JavaScript at all, so to them the page looks empty. Server-render or pre-render your main content and navigation.
  • https://garretthaas.com/cd — Raw HTML has 8 words and 0 links — this page is built by JavaScript in the browser. Googlebot renders JS but delays it, and most crawlers and AI assistants (ChatGPT, Perplexity, Claude) don't run JavaScript at all, so to them the page looks empty. Server-render or pre-render your main content and navigation.
  • https://garretthaas.com/custom — Raw HTML has 1 words and 0 links — this page is built by JavaScript in the browser. Googlebot renders JS but delays it, and most crawlers and AI assistants (ChatGPT, Perplexity, Claude) don't run JavaScript at all, so to them the page looks empty. Server-render or pre-render your main content and navigation.
  • https://garretthaas.com/faan — Raw HTML has 17 words and 0 links — this page is built by JavaScript in the browser. Googlebot renders JS but delays it, and most crawlers and AI assistants (ChatGPT, Perplexity, Claude) don't run JavaScript at all, so to them the page looks empty. Server-render or pre-render your main content and navigation.
  • https://garretthaas.com/hero — Raw HTML has 2 words and 0 links — this page is built by JavaScript in the browser. Googlebot renders JS but delays it, and most crawlers and AI assistants (ChatGPT, Perplexity, Claude) don't run JavaScript at all, so to them the page looks empty. Server-render or pre-render your main content and navigation.
  • https://garretthaas.com/ikena — Raw HTML has 17 words and 0 links — this page is built by JavaScript in the browser. Googlebot renders JS but delays it, and most crawlers and AI assistants (ChatGPT, Perplexity, Claude) don't run JavaScript at all, so to them the page looks empty. Server-render or pre-render your main content and navigation.
  • https://garretthaas.com/info-1 — Raw HTML has 8 words and 0 links — this page is built by JavaScript in the browser. Googlebot renders JS but delays it, and most crawlers and AI assistants (ChatGPT, Perplexity, Claude) don't run JavaScript at all, so to them the page looks empty. Server-render or pre-render your main content and navigation.
  • https://garretthaas.com/latest — Raw HTML has 1 words and 0 links — this page is built by JavaScript in the browser. Googlebot renders JS but delays it, and most crawlers and AI assistants (ChatGPT, Perplexity, Claude) don't run JavaScript at all, so to them the page looks empty. Server-render or pre-render your main content and navigation.
  • https://garretthaas.com/original — Raw HTML has 1 words and 0 links — this page is built by JavaScript in the browser. Googlebot renders JS but delays it, and most crawlers and AI assistants (ChatGPT, Perplexity, Claude) don't run JavaScript at all, so to them the page looks empty. Server-render or pre-render your main content and navigation.
  • https://garretthaas.com/photography — Raw HTML has 1 words and 0 links — this page is built by JavaScript in the browser. Googlebot renders JS but delays it, and most crawlers and AI assistants (ChatGPT, Perplexity, Claude) don't run JavaScript at all, so to them the page looks empty. Server-render or pre-render your main content and navigation.
  • https://garretthaas.com/project_group_2026-3 — Raw HTML has 4 words and 0 links — this page is built by JavaScript in the browser. Googlebot renders JS but delays it, and most crawlers and AI assistants (ChatGPT, Perplexity, Claude) don't run JavaScript at all, so to them the page looks empty. Server-render or pre-render your main content and navigation.
  • https://garretthaas.com/project_group_2026-4 — Raw HTML has 1 words and 0 links — this page is built by JavaScript in the browser. Googlebot renders JS but delays it, and most crawlers and AI assistants (ChatGPT, Perplexity, Claude) don't run JavaScript at all, so to them the page looks empty. Server-render or pre-render your main content and navigation.
  • https://garretthaas.com/project_group_2026_ikena — Raw HTML has 7 words and 0 links — this page is built by JavaScript in the browser. Googlebot renders JS but delays it, and most crawlers and AI assistants (ChatGPT, Perplexity, Claude) don't run JavaScript at all, so to them the page looks empty. Server-render or pre-render your main content and navigation.
  • https://garretthaas.com/ranked-play-logo-call-of-duty — Raw HTML has 13 words and 0 links — this page is built by JavaScript in the browser. Googlebot renders JS but delays it, and most crawlers and AI assistants (ChatGPT, Perplexity, Claude) don't run JavaScript at all, so to them the page looks empty. Server-render or pre-render your main content and navigation.
  • https://garretthaas.com/recent-primary — Raw HTML has 1 words and 0 links — this page is built by JavaScript in the browser. Googlebot renders JS but delays it, and most crawlers and AI assistants (ChatGPT, Perplexity, Claude) don't run JavaScript at all, so to them the page looks empty. Server-render or pre-render your main content and navigation.
  • https://garretthaas.com/sm-grid — Raw HTML has 1 words and 0 links — this page is built by JavaScript in the browser. Googlebot renders JS but delays it, and most crawlers and AI assistants (ChatGPT, Perplexity, Claude) don't run JavaScript at all, so to them the page looks empty. Server-render or pre-render your main content and navigation.
  • https://garretthaas.com/title-design — Raw HTML has 1 words and 0 links — this page is built by JavaScript in the browser. Googlebot renders JS but delays it, and most crawlers and AI assistants (ChatGPT, Perplexity, Claude) don't run JavaScript at all, so to them the page looks empty. Server-render or pre-render your main content and navigation.
  • https://garretthaas.com/valentino — Raw HTML has 7 words and 0 links — this page is built by JavaScript in the browser. Googlebot renders JS but delays it, and most crawlers and AI assistants (ChatGPT, Perplexity, Claude) don't run JavaScript at all, so to them the page looks empty. Server-render or pre-render your main content and navigation.
  • https://garretthaas.com/vincethealien — Raw HTML has 7 words and 0 links — this page is built by JavaScript in the browser. Googlebot renders JS but delays it, and most crawlers and AI assistants (ChatGPT, Perplexity, Claude) don't run JavaScript at all, so to them the page looks empty. Server-render or pre-render your main content and navigation.

Notices (17 rules)

notice No llms.txt for AI agents

Rule agent.llms_txt_missing · Agent Readiness · 1 occurrence(s)

notice No main landmark for AI agents

Rule agent.no_main_landmark · Agent Readiness · 6 occurrence(s)

notice Main text is hard to read (low Flesch Reading Ease)

Rule content.readability_poor · Content · 4 occurrence(s)

  • https://garretthaas.com/ — this page reads as very difficult (Flesch Reading Ease 25, below 50) — long sentences and multi-syllable words make it hard to scan. Shorten sentences and prefer plainer words to widen your audience. Density can be legitimate for expert, technical or legal content, so judge it against who the page is for.
  • https://garretthaas.com/about — this page reads as very difficult (Flesch Reading Ease 25, below 50) — long sentences and multi-syllable words make it hard to scan. Shorten sentences and prefer plainer words to widen your audience. Density can be legitimate for expert, technical or legal content, so judge it against who the page is for.
  • https://garretthaas.com/tortuga — this page reads as difficult (Flesch Reading Ease 34, below 50) — long sentences and multi-syllable words make it hard to scan. Shorten sentences and prefer plainer words to widen your audience. Density can be legitimate for expert, technical or legal content, so judge it against who the page is for.
  • https://garretthaas.com/videogames — this page reads as difficult (Flesch Reading Ease 44, below 50) — long sentences and multi-syllable words make it hard to scan. Shorten sentences and prefer plainer words to widen your audience. Density can be legitimate for expert, technical or legal content, so judge it against who the page is for.

notice Duplicate meta description across pages

Rule duplicate.meta_desc · Duplicate · 50 occurrence(s)

notice Likely hero image lacks fetchpriority=high

Rule images.hero_no_fetchpriority · Performance · 2 occurrence(s)

  • https://garretthaas.com/cd — the likely hero/LCP image (lv_billboard.jpg) has no fetchpriority="high" — adding it tells the browser to fetch the hero earlier in the waterfall, reducing Largest Contentful Paint. This is a low-severity nudge; verify the flagged image is actually your LCP element.
  • https://garretthaas.com/custom — the likely hero/LCP image (lv_billboard.jpg) has no fetchpriority="high" — adding it tells the browser to fetch the hero earlier in the waterfall, reducing Largest Contentful Paint. This is a low-severity nudge; verify the flagged image is actually your LCP element.

notice Images without width/height (layout shift / CLS)

Rule images.missing_dimensions · Images · 2 occurrence(s)

notice Legacy image format (jpg/png/gif) with no next-gen fallback

Rule perf.images_legacy_format · Performance · 2 occurrence(s)

  • https://garretthaas.com/cd — 15 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.
  • https://garretthaas.com/custom — 15 image(s) use a legacy format (jpg/png/gif) with no next-gen <picture> fallback. Serve WebP or AVIF (with a <picture> typed <source>) to cut image transfer weight and improve LCP.

notice No ETag header (no conditional GET for unchanged pages)

Rule perf.no_etag · Performance · 50 occurrence(s)

  • https://garretthaas.com/ — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
  • https://garretthaas.com/80s-action-heroes-call-of-duty — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
  • https://garretthaas.com/about — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
  • https://garretthaas.com/alogod — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
  • https://garretthaas.com/call-of-duty-black-ops-6 — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
  • https://garretthaas.com/call-of-duty-black-ops-7 — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
  • https://garretthaas.com/cd — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
  • https://garretthaas.com/custom — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
  • https://garretthaas.com/ground-fall-call-of-duty — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
  • https://garretthaas.com/hero — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
  • https://garretthaas.com/hunt-for-adler-call-of-duty — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
  • https://garretthaas.com/info-1 — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
  • https://garretthaas.com/project_group_2025_anderesound — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
  • https://garretthaas.com/project_group_2025_cod_1 — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
  • https://garretthaas.com/project_group_2026-3 — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
  • https://garretthaas.com/project_group_2026-4 — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
  • https://garretthaas.com/project_group_2026_cod_2 — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
  • https://garretthaas.com/project_group_2026_ikena — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
  • https://garretthaas.com/project_group_2026_ikena-copy — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
  • https://garretthaas.com/project_group_2026_indie_1 — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
  • https://garretthaas.com/ranked-play-logo-call-of-duty — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
  • https://garretthaas.com/the-haunting-call-of-duty — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
  • https://garretthaas.com/the-numbers-call-of-duty-1 — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
  • https://garretthaas.com/videogame-logos — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.
  • https://garretthaas.com/videogames — the response carries no ETag header — without an ETag (or Last-Modified) there is no cache-revalidation mechanism, so crawlers re-download the full body every visit. Emit an ETag (a content hash) to enable conditional If-None-Match requests.

notice No Last-Modified header (no conditional GET for unchanged pages)

Rule perf.no_last_modified · Performance · 50 occurrence(s)

  • https://garretthaas.com/ — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
  • https://garretthaas.com/80s-action-heroes-call-of-duty — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
  • https://garretthaas.com/about — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
  • https://garretthaas.com/alogod — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
  • https://garretthaas.com/call-of-duty-black-ops-6 — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
  • https://garretthaas.com/call-of-duty-black-ops-7 — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
  • https://garretthaas.com/cd — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
  • https://garretthaas.com/custom — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
  • https://garretthaas.com/ground-fall-call-of-duty — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
  • https://garretthaas.com/hero — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
  • https://garretthaas.com/hunt-for-adler-call-of-duty — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
  • https://garretthaas.com/info-1 — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
  • https://garretthaas.com/project_group_2025_anderesound — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
  • https://garretthaas.com/project_group_2025_cod_1 — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
  • https://garretthaas.com/project_group_2026-3 — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
  • https://garretthaas.com/project_group_2026-4 — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
  • https://garretthaas.com/project_group_2026_cod_2 — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
  • https://garretthaas.com/project_group_2026_ikena — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
  • https://garretthaas.com/project_group_2026_ikena-copy — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
  • https://garretthaas.com/project_group_2026_indie_1 — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
  • https://garretthaas.com/ranked-play-logo-call-of-duty — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
  • https://garretthaas.com/the-haunting-call-of-duty — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
  • https://garretthaas.com/the-numbers-call-of-duty-1 — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
  • https://garretthaas.com/videogame-logos — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.
  • https://garretthaas.com/videogames — the response carries no Last-Modified header — Googlebot can't send an If-Modified-Since request, so it re-downloads the full page body on every crawl even when nothing changed. Emit Last-Modified (or an ETag) on stable pages to enable 304 Not Modified responses.

notice Missing recommended security headers

Rule security.missing_headers · Security · 50 occurrence(s)

notice target=_blank link without rel=noopener (tab-napping)

Rule security.unsafe_cross_origin_links · Security · 1 occurrence(s)

  • https://garretthaas.com/multicrop-app — 1 external link(s) use target="_blank" without rel="noopener" — the opened page can hijack your tab (reverse tab-napping). Add rel="noopener noreferrer".

notice Title is very short

Rule title.too_short · Titles · 2 occurrence(s)

Pages (showing 50 of 50)
URLStatusIndexableWordsIn-links
https://garretthaas.com/call-of-duty-black-ops-6
Call of Duty: Black Ops 6 — Garrett Haas
200 yes 63 4
https://garretthaas.com/ikena
IKENA — Garrett Haas
200 yes 17 3
https://garretthaas.com/andere-sound-1
Andere Sound — Garrett Haas
200 yes 18 3
https://garretthaas.com/andere-sound-2020
Andere Sound 2020 — Garrett Haas
200 yes 25 3
https://garretthaas.com/ranked-play-logo-call-of-duty
Ranked Play Logo: Call of Duty — Garrett Haas
200 yes 13 3
https://garretthaas.com/title-design
Title Design — Garrett Haas
200 yes 1 3
https://garretthaas.com/
Garrett Haas
200 yes 145 0
https://garretthaas.com/80s-action-heroes-call-of-duty
80s Action Heroes: Call of Duty — Garrett Haas
200 yes 32 0
https://garretthaas.com/about
Garrett Haas
200 yes 145 0
https://garretthaas.com/alogod
alogod — Garrett Haas
200 yes 1 0
https://garretthaas.com/archive-2
Archive — Garrett Haas
200 yes 1 0
https://garretthaas.com/archive-old
archive-old — Garrett Haas
200 yes 1 0
https://garretthaas.com/art-1
ART — Garrett Haas
200 yes 1 0
https://garretthaas.com/article-one-eyewear
Article One Eyewear — Garrett Haas
200 yes 14 0
https://garretthaas.com/atelier-delphine
Atelier Delphine — Garrett Haas
200 yes 16 0
https://garretthaas.com/call-of-duty-black-ops-7
Call of Duty: Black Ops 7 — Garrett Haas
200 yes 15 0
https://garretthaas.com/cd
CD — Garrett Haas
200 yes 8 0
https://garretthaas.com/custom
custom — Garrett Haas
200 yes 1 0
https://garretthaas.com/faan
FAAN — Garrett Haas
200 yes 17 0
https://garretthaas.com/ground-fall-call-of-duty
Ground Fall: Call of Duty — Garrett Haas
200 yes 31 0
https://garretthaas.com/hero
Hero — Garrett Haas
200 yes 2 0
https://garretthaas.com/home
Home — Garrett Haas
200 yes 1 0
https://garretthaas.com/hunt-for-adler-call-of-duty
Hunt For Adler: Call of Duty — Garrett Haas
200 yes 32 0
https://garretthaas.com/info-1
info — Garrett Haas
200 yes 8 0
https://garretthaas.com/latest
Latest — Garrett Haas
200 yes 1 0
https://garretthaas.com/louis-vuitton-for-be-good
Louis Vuitton for Be Good — Garrett Haas
200 yes 26 0
https://garretthaas.com/multicrop-app
Multicrop App — Garrett Haas
200 yes 20 0
https://garretthaas.com/original
Original — Garrett Haas
200 yes 1 0
https://garretthaas.com/overview-new
Overview new — Garrett Haas
200 yes 1 0
https://garretthaas.com/photography
Photography — Garrett Haas
200 yes 1 0
https://garretthaas.com/project_group_2025_anderesound
project_group_2025_anderesound — Garrett Haas
200 yes 23 0
https://garretthaas.com/project_group_2025_cod_1
project_group_2025_cod_1 — Garrett Haas
200 yes 35 0
https://garretthaas.com/project_group_2026-3
project_group_2026.3 — Garrett Haas
200 yes 4 0
https://garretthaas.com/project_group_2026-4
project_group_2026.4 — Garrett Haas
200 yes 1 0
https://garretthaas.com/project_group_2026_cod_2
project_group_2026_cod_2 — Garrett Haas
200 yes 43 0
https://garretthaas.com/project_group_2026_ikena
project_group_2026_ikena — Garrett Haas
200 yes 7 0
https://garretthaas.com/project_group_2026_ikena-copy
project_group_2026_ikena copy — Garrett Haas
200 yes 22 0
https://garretthaas.com/project_group_2026_indie_1
project_group_2026_indie_1 — Garrett Haas
200 yes 17 0
https://garretthaas.com/projects
Projects — Garrett Haas
200 yes 1 0
https://garretthaas.com/projects-new
Projects New — Garrett Haas
200 yes 64 0
https://garretthaas.com/projects-new-copy
Projects New copy — Garrett Haas
200 yes 1 0
https://garretthaas.com/recent-primary
RECENT Primary — Garrett Haas
200 yes 1 0
https://garretthaas.com/sm-grid
sm-grid — Garrett Haas
200 yes 1 0
https://garretthaas.com/the-haunting-call-of-duty
The Haunting: Call of Duty — Garrett Haas
200 yes 31 0
https://garretthaas.com/the-numbers-call-of-duty-1
The Numbers: Call of Duty — Garrett Haas
200 yes 31 0
https://garretthaas.com/tortuga
Tortuga — Garrett Haas
200 yes 98 0
https://garretthaas.com/valentino
Valentino — Garrett Haas
200 yes 7 0
https://garretthaas.com/videogame-logos
Videogame Logos — Garrett Haas
200 yes 46 0
https://garretthaas.com/videogames
Videogames — Garrett Haas
200 yes 286 0
https://garretthaas.com/vincethealien
vincethealien — Garrett Haas
200 yes 7 0

Audit your own site — free

157 checks, internal PageRank, render-diff. No signup, results in ~30s.

Scan your site →