[{"data":1,"prerenderedAt":248},["ShallowReactive",2],{"navigation":3,"/blog/blooper-video-crawl-budget":154,"surround-blooper-video-crawl-budget":237},[4],{"title":5,"path":6,"stem":7,"children":8,"page":153},"Blog","/blog","blog",[9,13,17,21,25,29,33,37,41,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,121,125,129,133,137,141,145,149],{"title":10,"path":11,"stem":12},"How to Increase Free Tier Memory on AWS EC2","/blog/aws-ec2-ram","blog/aws-ec2-ram",{"title":14,"path":15,"stem":16},"Blooper: The Disappearing Cloudflare Variables","/blog/blooper-cloudflare-env-vars","blog/blooper-cloudflare-env-vars",{"title":18,"path":19,"stem":20},"Blooper: Hardcoded Content Links cause 404s","/blog/blooper-hardcoded-nuxt-content-links","blog/blooper-hardcoded-nuxt-content-links",{"title":22,"path":23,"stem":24},"Blooper: The Invisible SEO","/blog/blooper-nuxt-seo-env","blog/blooper-nuxt-seo-env",{"title":26,"path":27,"stem":28},"Blooper: The SSR Crash of Doom","/blog/blooper-ssr-feedback-form","blog/blooper-ssr-feedback-form",{"title":30,"path":31,"stem":32},"Blooper: The YouTube Crawl Budget Killer","/blog/blooper-video-crawl-budget","blog/blooper-video-crawl-budget",{"title":34,"path":35,"stem":36},"Blooper: PWA Redirecting SPA Routes","/blog/blooper-vite-pwa-ssr-redirects","blog/blooper-vite-pwa-ssr-redirects",{"title":38,"path":39,"stem":40},"Git Branching in 2026: Code State, Environment Isolation, and Modern CD","/blog/branch-theater-staging-branches","blog/branch-theater-staging-branches",{"title":42,"path":43,"stem":44},"The Developer's Guide to Avoiding Cloud Billing Traps in 2026","/blog/cloud-billing-traps-2026","blog/cloud-billing-traps-2026",{"title":46,"path":47,"stem":48},"Disk Management in Linux","/blog/disk-management-in-linux","blog/disk-management-in-linux",{"title":50,"path":51,"stem":52},"Docker Devtools Stage | Powerlevel, OhMyZSH, tmux, fuzzy finder, autocomplete etc","/blog/docker-devtools","blog/docker-devtools",{"title":54,"path":55,"stem":56},"Docker container | Resolving Permission Denied Woes: A Decade-Long Struggle Unraveled","/blog/docker-non-root-user-perms","blog/docker-non-root-user-perms",{"title":58,"path":59,"stem":60},"The Ultimate Guide to Free Tier Hosting Platforms (Serverless & Containers)","/blog/free-hosting-platforms-guide","blog/free-hosting-platforms-guide",{"title":62,"path":63,"stem":64},"Git commands | underrated","/blog/git-commands-underrated","blog/git-commands-underrated",{"title":66,"path":67,"stem":68},"Journey: Taming Edge Caching and KV Storage","/blog/journey-github-streak-caching","blog/journey-github-streak-caching",{"title":70,"path":71,"stem":72},"Kubernetes Cluster Setup Guide","/blog/k8s-setup","blog/k8s-setup",{"title":74,"path":75,"stem":76},"Linux WiFi Drivers","/blog/linux-wifi-drivers","blog/linux-wifi-drivers",{"title":78,"path":79,"stem":80},"4 Common Routing Traps When Migrating to Nuxt i18n","/blog/nuxt-i18n-routing","blog/nuxt-i18n-routing",{"title":82,"path":83,"stem":84},"Patch the CVE, Don't Trigger an Accidental Refactor: Surviving PHP2Shell on Docker","/blog/patching-php2shell-docker-playbook","blog/patching-php2shell-docker-playbook",{"title":86,"path":87,"stem":88},"pfSense basic firewall setup","/blog/pfsense-basic-firewall-setup","blog/pfsense-basic-firewall-setup",{"title":90,"path":91,"stem":92},"pfSense Quickstart","/blog/pfsense-quickstart","blog/pfsense-quickstart",{"title":94,"path":95,"stem":96},"Postmortem: Cloudflare Worker Missing Dependency on Deploy","/blog/postmortem-cloudflare-worker-dependency-deploy","blog/postmortem-cloudflare-worker-dependency-deploy",{"title":98,"path":99,"stem":100},"Postmortem: Serverless HTTP Driver Transaction Failures","/blog/postmortem-neon-http-transactions","blog/postmortem-neon-http-transactions",{"title":102,"path":103,"stem":104},"Postmortem: The Ghost in the Chrome Cache (Nuxt & Cloudflare Pages)","/blog/postmortem-nuxt-cloudflare-chunk-error","blog/postmortem-nuxt-cloudflare-chunk-error",{"title":106,"path":107,"stem":108},"Postmortem: Nuxt Content 404s on Staging Deployments","/blog/postmortem-nuxt-content-404-staging","blog/postmortem-nuxt-content-404-staging",{"title":110,"path":111,"stem":112},"Postmortem: 500 Internal Server Error on ISR Routes","/blog/postmortem-nuxt-content-payload-extraction","blog/postmortem-nuxt-content-payload-extraction",{"title":114,"path":115,"stem":116},"Post-Mortem: Intrusive Database Driver Refactoring","/blog/postmortem-proxy-re-architecting","blog/postmortem-proxy-re-architecting",{"title":118,"path":119,"stem":120},"Post-Mortem: Cloudflare Worker Connection Hang & Resilient DB Fallbacks","/blog/postmortem-worker-db-connection-hang","blog/postmortem-worker-db-connection-hang",{"title":122,"path":123,"stem":124},"Pro Tip: Sandboxing Cloudflare Workers for AI Agents","/blog/pro-tip-wrangler-local-dev-trick","blog/pro-tip-wrangler-local-dev-trick",{"title":126,"path":127,"stem":128},"Proxmox DNS Management","/blog/proxmox-dns","blog/proxmox-dns",{"title":130,"path":131,"stem":132},"Proxmox Recovery","/blog/proxmox-recovery","blog/proxmox-recovery",{"title":134,"path":135,"stem":136},"Proxmox WiFi Connection Story","/blog/proxmox-wifi","blog/proxmox-wifi",{"title":138,"path":139,"stem":140},"roadauth-rails api jwt cors","/blog/rodauth-jwt","blog/rodauth-jwt",{"title":142,"path":143,"stem":144},"SOCKS5 Proxy Quickstart","/blog/sock5-proxy","blog/sock5-proxy",{"title":146,"path":147,"stem":148},"tmux status bar toggle","/blog/tmux-status","blog/tmux-status",{"title":150,"path":151,"stem":152},"UFW - Cheatsheet","/blog/ufw-cheatsheet","blog/ufw-cheatsheet",false,{"id":155,"title":30,"authors":156,"badge":162,"body":164,"date":226,"description":227,"extension":228,"image":229,"imageComponent":230,"meta":231,"navigation":232,"path":31,"pinned":153,"seo":233,"seoImage":234,"stem":32,"__hash__":236},"posts/blog/blooper-video-crawl-budget.md",[157],{"name":158,"to":159,"avatar":160},"Rahul Dhole","/",{"src":161},"/profile.png",{"label":163},"Blooper",{"type":165,"value":166,"toc":219},"minimark",[167,172,176,180,188,192,205],[168,169,171],"h2",{"id":170},"the-blunder","The Blunder",[173,174,175],"p",{},"Google Search Console started treating our application like a media hosting platform, throwing bizarre Video Indexing errors. Regular page indexing ground to a halt.",[168,177,179],{"id":178},"the-duh-moment","The \"Duh\" Moment",[173,181,182,183,187],{},"We were server-side rendering heavy YouTube ",[184,185,186],"code",{},"iframe"," embeds in our blog posts. Because our new domain has a tiny \"crawl budget\", Googlebot spent all its time trying to parse heavy media wrappers, hit its timeout, and gave up on reading our actual text content.",[168,189,191],{"id":190},"the-fix","The Fix",[173,193,194,195,198,199,204],{},"Wrapped the entire YouTube component template in ",[184,196,197],{},"\u003CClientOnly>"," tags with a lightweight HTML placeholder. Now the server sends a fast skeleton, Googlebot reads the text immediately, and the heavy video only loads on the client side. Problem solved! 🤦‍♂️ (See ",[200,201,203],"a",{"href":202},"#fig-1","Figure 1",")",[173,206,207,210,215],{},[200,208],{"id":209},"fig-1",[211,212],"mermaid",{":config":213,"code":214},"config","sequenceDiagram%0A%20%20%20%20participant%20Bot%20as%20Googlebot%0A%20%20%20%20participant%20Server%20as%20SSR%20Server%0A%20%20%20%20participant%20Client%20as%20Browser%0A%0A%20%20%20%20Note%20over%20Bot%2CServer%3A%20Before%20%60%3CClientOnly%3E%60%0A%20%20%20%20Bot-%3E%3EServer%3A%20GET%20%2Fblog%2Fpost%0A%20%20%20%20Server-%3E%3EServer%3A%20Render%20Heavy%20iframe%0A%20%20%20%20Server--%3E%3EBot%3A%20Massive%20HTML%20response%0A%20%20%20%20Bot-%3E%3EBot%3A%20Parse%20timeout%20%2F%20Budget%20exhausted%0A%0A%20%20%20%20Note%20over%20Bot%2CServer%3A%20After%20%60%3CClientOnly%3E%60%0A%20%20%20%20Bot-%3E%3EServer%3A%20GET%20%2Fblog%2Fpost%0A%20%20%20%20Server-%3E%3EServer%3A%20Render%20Skeleton%20%26%20Text%0A%20%20%20%20Server--%3E%3EBot%3A%20Fast%2C%20small%20HTML%0A%20%20%20%20Bot-%3E%3EBot%3A%20Parses%20text%20successfully!%0A%20%20%20%20Client-%3E%3EServer%3A%20GET%20%2Fblog%2Fpost%0A%20%20%20%20Server--%3E%3EClient%3A%20Fast%20HTML%0A%20%20%20%20Client-%3E%3EClient%3A%20Hydrate%20%26%20Load%20iframe",[216,217,218],"em",{},"Figure 1: Search engine parsing timeout vs success with ClientOnly skeleton",{"title":220,"searchDepth":221,"depth":221,"links":222},"",2,[223,224,225],{"id":170,"depth":221,"text":171},{"id":178,"depth":221,"text":179},{"id":190,"depth":221,"text":191},"2026-06-27","How server-rendered YouTube iframes destroyed our SEO crawl budget.","md",null,{"type":163},{},true,{"title":30,"description":227},{"src":235},"https://placehold.co/800x400/0f172a/3b82f6?text=Crawl+Budget+Killer","_TaUlJ3iHKL3lk5hKSq3MhwK2FegnqFzuLVqQQB7u-U",[238,243],{"title":26,"path":27,"stem":28,"description":239,"imageComponent":240,"seoImage":241,"children":-1},"How importing a client-side SDK crashed our Server-Side Rendering edge workers.",{"type":163},{"src":242},"https://placehold.co/800x400/0f172a/3b82f6?text=SSR+Crash+of+Doom",{"title":34,"path":35,"stem":36,"description":244,"imageComponent":245,"seoImage":246,"children":-1},"How Vite PWA intercepted navigation requests in production and caused redirect loops.",{"type":163},{"src":247},"https://placehold.co/800x400/0f172a/3b82f6?text=PWA+Redirecting+SPA+Routes",1792752997600]