{
 "run_date": "2026-11-03",
 "tool": "render_diff.py",
 "browser": "Chrome headless (new)",
 "lab_results": [
  {
   "url": "http://127.0.0.1:8766/static/",
   "status": 200,
   "raw": {
    "title": "Himalayan honey 500 g | Lab Shop",
    "meta_description": "Raw honey from Lamjung.",
    "meta_robots": "",
    "canonical": "http://127.0.0.1:8766/static/",
    "h1": [
     "Himalayan honey 500 g"
    ],
    "crawlable_links": 2,
    "internal_links": 2,
    "fragment_links": 0,
    "clickable_without_href": 0,
    "words": 24,
    "jsonld_types": []
   },
   "rendered": {
    "title": "Himalayan honey 500 g | Lab Shop",
    "meta_description": "Raw honey from Lamjung.",
    "meta_robots": "",
    "canonical": "http://127.0.0.1:8766/static/",
    "h1": [
     "Himalayan honey 500 g"
    ],
    "crawlable_links": 2,
    "internal_links": 2,
    "fragment_links": 0,
    "clickable_without_href": 0,
    "words": 24,
    "jsonld_types": []
   },
   "expect": {
    "Himalayan honey 500 g": "raw HTML",
    "NPR 1,250": "raw HTML"
   },
   "notes": []
  },
  {
   "url": "http://127.0.0.1:8766/csr/",
   "status": 200,
   "raw": {
    "title": "Lab Shop",
    "meta_description": "",
    "meta_robots": "",
    "canonical": "",
    "h1": [],
    "crawlable_links": 0,
    "internal_links": 0,
    "fragment_links": 0,
    "clickable_without_href": 0,
    "words": 1,
    "jsonld_types": []
   },
   "rendered": {
    "title": "Himalayan honey 500 g | Lab Shop",
    "meta_description": "",
    "meta_robots": "",
    "canonical": "",
    "h1": [
     "Himalayan honey 500 g"
    ],
    "crawlable_links": 2,
    "internal_links": 2,
    "fragment_links": 0,
    "clickable_without_href": 0,
    "words": 24,
    "jsonld_types": []
   },
   "expect": {
    "Himalayan honey 500 g": "rendered only",
    "NPR 1,250": "rendered only"
   },
   "notes": [
    "title changes after rendering (\"Lab Shop\" -> \"Himalayan honey 500 g | Lab Shop\"). Put the final value in the server HTML.",
    "H1 differs: raw [] vs rendered ['Himalayan honey 500 g'].",
    "Most text appears only after rendering (1 -> 24 words). Google can index it if rendering succeeds; many other crawlers will not.",
    "2 crawlable links exist only after rendering."
   ]
  },
  {
   "url": "http://127.0.0.1:8766/noindex-flip/",
   "status": 200,
   "raw": {
    "title": "Himalayan honey 500 g | Lab Shop",
    "meta_description": "",
    "meta_robots": "noindex",
    "canonical": "",
    "h1": [
     "Himalayan honey 500 g"
    ],
    "crawlable_links": 0,
    "internal_links": 0,
    "fragment_links": 0,
    "clickable_without_href": 0,
    "words": 20,
    "jsonld_types": []
   },
   "rendered": {
    "title": "Himalayan honey 500 g | Lab Shop",
    "meta_description": "",
    "meta_robots": "",
    "canonical": "",
    "h1": [
     "Himalayan honey 500 g"
    ],
    "crawlable_links": 0,
    "internal_links": 0,
    "fragment_links": 0,
    "clickable_without_href": 0,
    "words": 20,
    "jsonld_types": []
   },
   "expect": {
    "Himalayan honey 500 g": "raw HTML"
   },
   "notes": [
    "noindex in the raw HTML. Google may skip rendering, so JavaScript that removes it may not work."
   ]
  },
  {
   "url": "http://127.0.0.1:8766/title-swap/",
   "status": 200,
   "raw": {
    "title": "Loading…",
    "meta_description": "",
    "meta_robots": "",
    "canonical": "http://127.0.0.1:8766/",
    "h1": [
     "Himalayan honey 500 g"
    ],
    "crawlable_links": 0,
    "internal_links": 0,
    "fragment_links": 0,
    "clickable_without_href": 0,
    "words": 20,
    "jsonld_types": []
   },
   "rendered": {
    "title": "Himalayan honey 500 g | Lab Shop",
    "meta_description": "",
    "meta_robots": "",
    "canonical": "http://127.0.0.1:8766/title-swap/",
    "h1": [
     "Himalayan honey 500 g"
    ],
    "crawlable_links": 0,
    "internal_links": 0,
    "fragment_links": 0,
    "clickable_without_href": 0,
    "words": 20,
    "jsonld_types": []
   },
   "expect": {
    "Himalayan honey 500 g": "raw HTML"
   },
   "notes": [
    "title changes after rendering (\"Loading…\" -> \"Himalayan honey 500 g | Lab Shop\"). Put the final value in the server HTML.",
    "canonical changes after rendering (\"http://127.0.0.1:8766/\" -> \"http://127.0.0.1:8766/title-swap/\"). Put the final value in the server HTML."
   ]
  },
  {
   "url": "http://127.0.0.1:8766/js-links/",
   "status": 200,
   "raw": {
    "title": "Categories | Lab Shop",
    "meta_description": "",
    "meta_robots": "",
    "canonical": "",
    "h1": [
     "Categories"
    ],
    "crawlable_links": 0,
    "internal_links": 0,
    "fragment_links": 2,
    "clickable_without_href": 2,
    "words": 5,
    "jsonld_types": []
   },
   "rendered": {
    "title": "Categories | Lab Shop",
    "meta_description": "",
    "meta_robots": "",
    "canonical": "",
    "h1": [
     "Categories"
    ],
    "crawlable_links": 0,
    "internal_links": 0,
    "fragment_links": 2,
    "clickable_without_href": 2,
    "words": 5,
    "jsonld_types": []
   },
   "expect": {},
   "notes": [
    "2 links use #/ fragments. Google does not treat fragments as separate pages; use real paths with the History API.",
    "2 clickable elements have no href. Google only follows <a href> links."
   ]
  },
  {
   "url": "http://127.0.0.1:8766/stored-city/",
   "status": 200,
   "raw": {
    "title": "Delivery | Lab Shop",
    "meta_description": "",
    "meta_robots": "",
    "canonical": "",
    "h1": [
     "Delivery prices"
    ],
    "crawlable_links": 0,
    "internal_links": 0,
    "fragment_links": 0,
    "clickable_without_href": 0,
    "words": 9,
    "jsonld_types": []
   },
   "rendered": {
    "title": "Delivery | Lab Shop",
    "meta_description": "",
    "meta_robots": "",
    "canonical": "",
    "h1": [
     "Delivery prices"
    ],
    "crawlable_links": 0,
    "internal_links": 0,
    "fragment_links": 0,
    "clickable_without_href": 0,
    "words": 9,
    "jsonld_types": []
   },
   "expect": {
    "Delivery to": "MISSING"
   },
   "notes": [
    "\"Delivery to\" is missing even after rendering. Check console errors, blocked resources, or content that needs a click, login or stored state."
   ]
  },
  {
   "url": "http://127.0.0.1:8766/product/honey",
   "status": 200,
   "raw": {
    "title": "Lab Shop",
    "meta_description": "",
    "meta_robots": "",
    "canonical": "",
    "h1": [],
    "crawlable_links": 0,
    "internal_links": 0,
    "fragment_links": 0,
    "clickable_without_href": 0,
    "words": 1,
    "jsonld_types": []
   },
   "rendered": {
    "title": "Lab Shop",
    "meta_description": "",
    "meta_robots": "",
    "canonical": "",
    "h1": [
     "Himalayan honey 500 g"
    ],
    "crawlable_links": 0,
    "internal_links": 0,
    "fragment_links": 0,
    "clickable_without_href": 0,
    "words": 4,
    "jsonld_types": []
   },
   "expect": {
    "Himalayan honey 500 g": "rendered only"
   },
   "notes": [
    "H1 differs: raw [] vs rendered ['Himalayan honey 500 g']."
   ]
  },
  {
   "url": "http://127.0.0.1:8766/product/does-not-exist",
   "status": 200,
   "raw": {
    "title": "Lab Shop",
    "meta_description": "",
    "meta_robots": "",
    "canonical": "",
    "h1": [],
    "crawlable_links": 0,
    "internal_links": 0,
    "fragment_links": 0,
    "clickable_without_href": 0,
    "words": 1,
    "jsonld_types": []
   },
   "rendered": {
    "title": "Lab Shop",
    "meta_description": "",
    "meta_robots": "",
    "canonical": "",
    "h1": [
     "Product not found"
    ],
    "crawlable_links": 0,
    "internal_links": 0,
    "fragment_links": 0,
    "clickable_without_href": 0,
    "words": 3,
    "jsonld_types": []
   },
   "expect": {},
   "notes": [
    "H1 differs: raw [] vs rendered ['Product not found'].",
    "Looks like an error page but returns HTTP 200 (soft 404). Return a real 404, or redirect to a URL that does."
   ]
  }
 ],
 "live_example": [
  {
   "url": "https://bikeshtamang.com.np/blog/javascript-seo-guide/",
   "status": 200,
   "raw": {
    "title": "JavaScript SEO: Rendering, Routing & Audit Checklist",
    "meta_description": "Audit JavaScript SEO with raw and rendered HTML, route-state checks, metadata and crawlable links. Follow a practical checklist and the linked SPA audit lab.",
    "meta_robots": "index, follow",
    "canonical": "https://bikeshtamang.com.np/blog/javascript-seo-guide/",
    "h1": [
     "JavaScript SEO: how to make JS websites crawlable and indexable"
    ],
    "crawlable_links": 74,
    "internal_links": 64,
    "fragment_links": 0,
    "clickable_without_href": 0,
    "words": 3372,
    "jsonld_types": [
     "Answer",
     "BlogPosting",
     "BreadcrumbList",
     "FAQPage",
     "ListItem",
     "Person",
     "Question"
    ]
   },
   "rendered": {
    "title": "JavaScript SEO: Rendering, Routing & Audit Checklist",
    "meta_description": "Audit JavaScript SEO with raw and rendered HTML, route-state checks, metadata and crawlable links. Follow a practical checklist and the linked SPA audit lab.",
    "meta_robots": "index, follow",
    "canonical": "https://bikeshtamang.com.np/blog/javascript-seo-guide/",
    "h1": [
     "JavaScript SEO: how to make JS websites crawlable and indexable"
    ],
    "crawlable_links": 74,
    "internal_links": 64,
    "fragment_links": 0,
    "clickable_without_href": 0,
    "words": 3372,
    "jsonld_types": [
     "Answer",
     "BlogPosting",
     "BreadcrumbList",
     "FAQPage",
     "ListItem",
     "Person",
     "Question"
    ]
   },
   "expect": {
    "Rendering strategies compared": "raw HTML"
   },
   "notes": []
  }
 ]
}