[{"data":1,"prerenderedAt":341},["ShallowReactive",2],{"navigation":3,"/blog/postmortem-nuxt-content-404-staging":130,"surround-postmortem-nuxt-content-404-staging":330},[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":82,"authors":132,"badge":138,"body":140,"date":319,"description":320,"extension":321,"image":322,"imageComponent":323,"meta":324,"navigation":325,"path":83,"pinned":129,"seo":326,"seoImage":327,"stem":84,"__hash__":329},"posts/blog/postmortem-nuxt-content-404-staging.md",[133],{"name":134,"to":135,"avatar":136},"Rahul Dhole","/",{"src":137},"/profile.png",{"label":139},"Postmortem",{"type":141,"value":142,"toc":312},"minimark",[143,148,174,178,207,211,215,250,254,308],[144,145,147],"h2",{"id":146},"_1-the-issue","1. The Issue",[149,150,151,168],"ul",{},[152,153,154,158,159,163,164,167],"li",{},[155,156,157],"strong",{},"Symptom:"," Direct URLs or page reloads to ",[160,161,162],"code",{},"/blog/*"," and ",[160,165,166],{},"/help/*"," threw a 404 error in the Staging environment.",[152,169,170,173],{},[155,171,172],{},"Impact:"," Content routing in Staging was broken for direct links.",[144,175,177],{"id":176},"_2-root-cause","2. Root Cause",[149,179,180,186,196],{},[152,181,182,185],{},[155,183,184],{},"Empty Database:"," The Staging Cloudflare D1 database was completely empty. It lacked all Nuxt Content tables.",[152,187,188,191,192,195],{},[155,189,190],{},"My Mistake:"," I failed to understand that NuxtHub requires the specific ",[160,193,194],{},"nuxthub deploy"," CLI command to automatically sync the database.",[152,197,198,199,202,203,206],{},"Because I was using the vanilla ",[160,200,201],{},"wrangler deploy"," command in my ",[160,204,205],{},"package.json"," scripts, the automated database synchronization was entirely bypassed, leaving the Staging database empty.",[144,208,210],{"id":209},"_3-why-it-was-confusing","3. Why It Was Confusing",[212,213,214],"p",{},"The issue was masked by an illusion that client-side navigation was working:",[149,216,217,235],{},[152,218,219,226,227,230,231,234],{},[155,220,221,222,225],{},"Index Pages (",[160,223,224],{},"/blogs","):"," Code used ",[160,228,229],{},".all()",". Against an empty database, it returned ",[160,232,233],{},"[]",". The page loaded successfully but silently displayed 0 posts.",[152,236,237,226,243,230,246,249],{},[155,238,239,240,225],{},"Individual Posts (",[160,241,242],{},"/blog/post-name",[160,244,245],{},".first()",[160,247,248],{},"null",", which explicitly triggered a 404 error page.",[144,251,253],{"id":252},"_4-the-fix","4. The Fix",[149,255,256,299],{},[152,257,258,261,262],{},[155,259,260],{},"Immediate:"," Manually synced the Staging database using the generated SQL dump:\n",[263,264,269],"pre",{"className":265,"code":266,"language":267,"meta":268,"style":268},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","wrangler d1 execute project-staging --remote --file .nuxt/content/sql_dump.txt\n","bash","",[160,270,271],{"__ignoreMap":268},[272,273,276,280,284,287,290,293,296],"span",{"class":274,"line":275},"line",1,[272,277,279],{"class":278},"sBMFI","wrangler",[272,281,283],{"class":282},"sfazB"," d1",[272,285,286],{"class":282}," execute",[272,288,289],{"class":282}," project-staging",[272,291,292],{"class":282}," --remote",[272,294,295],{"class":282}," --file",[272,297,298],{"class":282}," .nuxt/content/sql_dump.txt\n",[152,300,301,304,305,307],{},[155,302,303],{},"Long-term:"," Hardcoded the database synchronization step directly into the ",[160,306,205],{}," deployment scripts to ensure the deployment command always seeds the D1 database moving forward.",[309,310,311],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":268,"searchDepth":313,"depth":313,"links":314},2,[315,316,317,318],{"id":146,"depth":313,"text":147},{"id":176,"depth":313,"text":177},{"id":209,"depth":313,"text":210},{"id":252,"depth":313,"text":253},"2026-06-15","Debugging missing content and 404 errors when deploying Nuxt Content to Cloudflare D1.","md",null,{"type":139},{},true,{"title":82,"description":320},{"src":328},"https://placehold.co/800x400/0f172a/3b82f6?text=Nuxt+Content+404s","CPnP1k0STEE17x34MoQtMyKXDEXrYc5hGvD5_yzS4yg",[331,336],{"title":78,"path":79,"stem":80,"description":332,"imageComponent":333,"seoImage":334,"children":-1},"Why database transactions fail in serverless HTTP drivers and how to architect around them using compensating transactions.",{"type":139},{"src":335},"https://placehold.co/800x400/0f172a/3b82f6?text=Serverless+HTTP+Transactions",{"title":86,"path":87,"stem":88,"description":337,"imageComponent":338,"seoImage":339,"children":-1},"Resolving Nuxt Content payload extraction issues and hydration crashes on ISR routes.",{"type":139},{"src":340},"https://placehold.co/800x400/0f172a/3b82f6?text=Nuxt+ISR+Payload+Extraction",1784464468339]