[{"data":1,"prerenderedAt":207},["ShallowReactive",2],{"navigation":3,"/blog/blooper-ssr-feedback-form":130,"surround-blooper-ssr-feedback-form":196},[4],{"title":5,"path":6,"stem":7,"children":8,"page":129},"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],{"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},"Disk Management in Linux","/blog/disk-management-in-linux","blog/disk-management-in-linux",{"title":42,"path":43,"stem":44},"Docker Devtools Stage | Powerlevel, OhMyZSH, tmux, fuzzy finder, autocomplete etc","/blog/docker-devtools","blog/docker-devtools",{"title":46,"path":47,"stem":48},"Docker container | Resolving Permission Denied Woes: A Decade-Long Struggle Unraveled","/blog/docker-non-root-user-perms","blog/docker-non-root-user-perms",{"title":50,"path":51,"stem":52},"Git commands | underrated","/blog/git-commands-underrated","blog/git-commands-underrated",{"title":54,"path":55,"stem":56},"Journey: Taming Edge Caching and KV Storage","/blog/journey-github-streak-caching","blog/journey-github-streak-caching",{"title":58,"path":59,"stem":60},"Kubernetes Cluster Setup Guide","/blog/k8s-setup","blog/k8s-setup",{"title":62,"path":63,"stem":64},"Linux WiFi Drivers","/blog/linux-wifi-drivers","blog/linux-wifi-drivers",{"title":66,"path":67,"stem":68},"pfSense basic firewall setup","/blog/pfsense-basic-firewall-setup","blog/pfsense-basic-firewall-setup",{"title":70,"path":71,"stem":72},"pfSense Quickstart","/blog/pfsense-quickstart","blog/pfsense-quickstart",{"title":74,"path":75,"stem":76},"Postmortem: Cloudflare Worker Missing Dependency on Deploy","/blog/postmortem-cloudflare-worker-dependency-deploy","blog/postmortem-cloudflare-worker-dependency-deploy",{"title":78,"path":79,"stem":80},"Postmortem: Serverless HTTP Driver Transaction Failures","/blog/postmortem-neon-http-transactions","blog/postmortem-neon-http-transactions",{"title":82,"path":83,"stem":84},"Postmortem: Nuxt Content 404s on Staging Deployments","/blog/postmortem-nuxt-content-404-staging","blog/postmortem-nuxt-content-404-staging",{"title":86,"path":87,"stem":88},"Postmortem: 500 Internal Server Error on ISR Routes","/blog/postmortem-nuxt-content-payload-extraction","blog/postmortem-nuxt-content-payload-extraction",{"title":90,"path":91,"stem":92},"Post-Mortem: Intrusive Database Driver Refactoring","/blog/postmortem-proxy-re-architecting","blog/postmortem-proxy-re-architecting",{"title":94,"path":95,"stem":96},"Post-Mortem: Cloudflare Worker Connection Hang & Resilient DB Fallbacks","/blog/postmortem-worker-db-connection-hang","blog/postmortem-worker-db-connection-hang",{"title":98,"path":99,"stem":100},"Pro Tip: Sandboxing Cloudflare Workers for AI Agents","/blog/pro-tip-wrangler-local-dev-trick","blog/pro-tip-wrangler-local-dev-trick",{"title":102,"path":103,"stem":104},"Proxmox DNS Management","/blog/proxmox-dns","blog/proxmox-dns",{"title":106,"path":107,"stem":108},"Proxmox Recovery","/blog/proxmox-recovery","blog/proxmox-recovery",{"title":110,"path":111,"stem":112},"Proxmox WiFi Connection Story","/blog/proxmox-wifi","blog/proxmox-wifi",{"title":114,"path":115,"stem":116},"roadauth-rails api jwt cors","/blog/rodauth-jwt","blog/rodauth-jwt",{"title":118,"path":119,"stem":120},"SOCKS5 Proxy Quickstart","/blog/sock5-proxy","blog/sock5-proxy",{"title":122,"path":123,"stem":124},"tmux status bar toggle","/blog/tmux-status","blog/tmux-status",{"title":126,"path":127,"stem":128},"UFW - Cheatsheet","/blog/ufw-cheatsheet","blog/ufw-cheatsheet",false,{"id":131,"title":26,"authors":132,"badge":138,"body":140,"date":185,"description":186,"extension":187,"image":188,"imageComponent":189,"meta":190,"navigation":191,"path":27,"pinned":129,"seo":192,"seoImage":193,"stem":28,"__hash__":195},"posts/blog/blooper-ssr-feedback-form.md",[133],{"name":134,"to":135,"avatar":136},"Rahul Dhole","/",{"src":137},"/profile.png",{"label":139},"Blooper",{"type":141,"value":142,"toc":178},"minimark",[143,148,152,156,167,171],[144,145,147],"h2",{"id":146},"the-blunder","The Blunder",[149,150,151],"p",{},"The support and blog pages started crashing with 500 Server Errors during Server-Side Rendering (SSR). It was a stubborn bug that seemed to appear out of nowhere after some dependency updates.",[144,153,155],{"id":154},"the-duh-moment","The \"Duh\" Moment",[149,157,158,159,163,164,166],{},"The actual culprit was a feedback form component being rendered on the server. The form utilized client-side SDKs which imported ",[160,161,162],"code",{},"axios"," at the module level. This is perfectly fine on the client, but when the framework evaluated it within the Cloudflare Worker during SSR, the worker crashed spectacularly because Node-specific configurations or APIs within ",[160,165,162],{}," aren't fully compatible with edge runtimes.",[144,168,170],{"id":169},"the-fix","The Fix",[149,172,173,174,177],{},"We simply wrapped the feedback form component in ",[160,175,176],{},"\u003CClientOnly>"," tags within the page templates. This prevents the server from attempting to render the component and initialize the problematic SDK, offloading the form rendering entirely to the client side. Sometimes the simplest fix is the one we overlook! 🤦‍♂️",{"title":179,"searchDepth":180,"depth":180,"links":181},"",2,[182,183,184],{"id":146,"depth":180,"text":147},{"id":154,"depth":180,"text":155},{"id":169,"depth":180,"text":170},"2026-06-26","How importing a client-side SDK crashed our Server-Side Rendering edge workers.","md",null,{"type":139},{},true,{"title":26,"description":186},{"src":194},"https://placehold.co/800x400/0f172a/3b82f6?text=SSR+Crash+of+Doom","S1gSvvmkjR-G7x8pBiKEbFFMjG5k65XFiPxPC6tWFXE",[197,202],{"title":22,"path":23,"stem":24,"description":198,"imageComponent":199,"seoImage":200,"children":-1},"How missing production environment variables caused our app to aggressively de-index itself.",{"type":139},{"src":201},"https://placehold.co/800x400/0f172a/3b82f6?text=The+Invisible+SEO",{"title":30,"path":31,"stem":32,"description":203,"imageComponent":204,"seoImage":205,"children":-1},"How server-rendered YouTube iframes destroyed our SEO crawl budget.",{"type":139},{"src":206},"https://placehold.co/800x400/0f172a/3b82f6?text=Crawl+Budget+Killer",1784464468316]