[{"data":1,"prerenderedAt":775},["ShallowReactive",2],{"navigation":3,"/blog/postmortem-nuxt-content-payload-extraction":130,"surround-postmortem-nuxt-content-payload-extraction":764},[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":86,"authors":132,"badge":138,"body":140,"date":753,"description":754,"extension":755,"image":756,"imageComponent":757,"meta":758,"navigation":759,"path":87,"pinned":129,"seo":760,"seoImage":761,"stem":88,"__hash__":763},"posts/blog/postmortem-nuxt-content-payload-extraction.md",[133],{"name":134,"to":135,"avatar":136},"Rahul Dhole","/",{"src":137},"/profile.png",{"label":139},"Postmortem",{"type":141,"value":142,"toc":742},"minimark",[143,148,165,168,172,188,190,194,197,273,290,304,312,314,318,323,461,465,468,631,633,637,644,649,698,703,705,709,738],[144,145,147],"h2",{"id":146},"summary","Summary",[149,150,151,152,156,157,160,161,164],"p",{},"A 500 error occurred when reloading or navigating to ISR routes (e.g., ",[153,154,155],"code",{},"/blog/**","). The failure was caused by ",[153,158,159],{},"nuxtApp.payload.data"," being ",[153,162,163],{},"undefined"," during client-side hydration.",[166,167],"hr",{},[144,169,171],{"id":170},"impact","Impact",[173,174,175,182,185],"ul",{},[176,177,178,179,181],"li",{},"Affected routes: ",[153,180,155],{}," and other ISR paths",[176,183,184],{},"Trigger: Page reload or SPA → ISR navigation",[176,186,187],{},"Result: Runtime crash → 500 error",[166,189],{},[144,191,193],{"id":192},"root-cause","Root Cause",[149,195,196],{},"Conflicting route rules in the configuration:",[198,199,204],"pre",{"className":200,"code":201,"language":202,"meta":203,"style":203},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","'/**': { ssr: false }     // SPA catch-all\n'/blog/**': { isr: 3600 } // ISR requires SSR\n","ts","",[153,205,206,246],{"__ignoreMap":203},[207,208,211,215,219,221,225,228,232,235,239,242],"span",{"class":209,"line":210},"line",1,[207,212,214],{"class":213},"sMK4o","'",[207,216,218],{"class":217},"sfazB","/**",[207,220,214],{"class":213},[207,222,224],{"class":223},"sTEyZ",": ",[207,226,227],{"class":213},"{",[207,229,231],{"class":230},"swJcz"," ssr",[207,233,234],{"class":213},":",[207,236,238],{"class":237},"sfNiH"," false",[207,240,241],{"class":213}," }",[207,243,245],{"class":244},"sHwdD","     // SPA catch-all\n",[207,247,249,251,253,255,257,259,262,264,268,270],{"class":209,"line":248},2,[207,250,214],{"class":213},[207,252,155],{"class":217},[207,254,214],{"class":213},[207,256,224],{"class":223},[207,258,227],{"class":213},[207,260,261],{"class":230}," isr",[207,263,234],{"class":213},[207,265,267],{"class":266},"sbssI"," 3600",[207,269,241],{"class":213},[207,271,272],{"class":244}," // ISR requires SSR\n",[173,274,275,278,281],{},[176,276,277],{},"The SPA catch-all disabled SSR globally.",[176,279,280],{},"ISR routes expected SSR + payload.",[176,282,283,284,289],{},"Client hydration attempted to access the missing payload, leading to a crash (",[285,286,288],"a",{"href":287},"#fig-1","Figure 1",").",[149,291,292,295,300],{},[285,293],{"id":294},"fig-1",[296,297],"mermaid",{":config":298,"code":299},"config","sequenceDiagram%0A%20%20%20%20participant%20User%0A%20%20%20%20participant%20Browser%0A%20%20%20%20participant%20Nuxt%20as%20Nuxt%20App%20(Client)%0A%20%20%20%20participant%20Payload%20as%20payload.json%0A%0A%20%20%20%20User-%3E%3EBrowser%3A%20Request%20%2Fblog%2Fpost%0A%20%20%20%20Browser-%3E%3ENuxt%3A%20Load%20JS%20App%20(SPA%20mode)%0A%20%20%20%20Nuxt-%3E%3ENuxt%3A%20Start%20Hydration%0A%20%20%20%20Nuxt-%3E%3EPayload%3A%20Attempt%20to%20read%20nuxtApp.payload.data%0A%20%20%20%20Payload--xNuxt%3A%20Undefined%20(Not%20extracted)%0A%20%20%20%20Nuxt--xBrowser%3A%20500%20Internal%20Server%20Error%20(Crash)",[301,302,303],"em",{},"Figure 1: Payload extraction failure during hydration",[149,305,306,307],{},"Related upstream issue:\n",[285,308,309],{"href":309,"rel":310},"https://github.com/nuxt/nuxt/issues/34856",[311],"nofollow",[166,313],{},[144,315,317],{"id":316},"resolution","Resolution",[319,320,322],"h3",{"id":321},"option-a-official-recommended-solution-applied","Option A: Official Recommended Solution (Applied)",[324,325,326,429,451],"ol",{},[176,327,328,332,333,336,337,234,340],{},[329,330,331],"strong",{},"Explicit Route Rules",": Remove the global SPA catch-all (",[153,334,335],{},"/**: { ssr: false }",") which disables SSR globally. Instead, define explicit rendering modes for each route group in ",[153,338,339],{},"nuxt.config.ts",[198,341,343],{"className":200,"code":342,"language":202,"meta":203,"style":203},"routeRules: {\n  '/app/**': { ssr: false },\n  '/dashboard/**': { ssr: false },\n  '/blog/**': { isr: 3600 }\n}\n",[153,344,345,356,379,401,423],{"__ignoreMap":203},[207,346,347,351,353],{"class":209,"line":210},[207,348,350],{"class":349},"sBMFI","routeRules",[207,352,234],{"class":213},[207,354,355],{"class":213}," {\n",[207,357,358,361,364,366,368,370,372,374,376],{"class":209,"line":248},[207,359,360],{"class":213},"  '",[207,362,363],{"class":217},"/app/**",[207,365,214],{"class":213},[207,367,224],{"class":230},[207,369,227],{"class":213},[207,371,231],{"class":230},[207,373,234],{"class":213},[207,375,238],{"class":237},[207,377,378],{"class":213}," },\n",[207,380,382,384,387,389,391,393,395,397,399],{"class":209,"line":381},3,[207,383,360],{"class":213},[207,385,386],{"class":217},"/dashboard/**",[207,388,214],{"class":213},[207,390,224],{"class":230},[207,392,227],{"class":213},[207,394,231],{"class":230},[207,396,234],{"class":213},[207,398,238],{"class":237},[207,400,378],{"class":213},[207,402,404,406,408,410,412,414,416,418,420],{"class":209,"line":403},4,[207,405,360],{"class":213},[207,407,155],{"class":217},[207,409,214],{"class":213},[207,411,224],{"class":230},[207,413,227],{"class":213},[207,415,261],{"class":230},[207,417,234],{"class":213},[207,419,267],{"class":266},[207,421,422],{"class":213}," }\n",[207,424,426],{"class":209,"line":425},5,[207,427,428],{"class":213},"}\n",[176,430,431,434,435,438,439,442,443,446,447,450],{},[329,432,433],{},"Inline Route Rules",": Enable ",[153,436,437],{},"experimental: { inlineRouteRules: true }"," to allow defining rules (like ",[153,440,441],{},"prerender: true"," for SSG) directly inside ",[153,444,445],{},".vue"," pages using the ",[153,448,449],{},"defineRouteRules"," macro.",[176,452,453,456,457,460],{},[329,454,455],{},"Re-enable Payload Extraction",": Keep ",[153,458,459],{},"payloadExtraction: true"," (default) to ensure efficient data loading and caching.",[319,462,464],{"id":463},"option-b-legacy-trick-alternative","Option B: Legacy \"Trick\" (Alternative)",[149,466,467],{},"If explicit routing is too complex, the following \"trick\" can bypass the hydration crash:",[324,469,470,503],{},[176,471,472,234,475],{},[329,473,474],{},"Disable payload extraction",[198,476,478],{"className":200,"code":477,"language":202,"meta":203,"style":203},"experimental: {\n  payloadExtraction: false\n}\n",[153,479,480,489,499],{"__ignoreMap":203},[207,481,482,485,487],{"class":209,"line":210},[207,483,484],{"class":349},"experimental",[207,486,234],{"class":213},[207,488,355],{"class":213},[207,490,491,494,496],{"class":209,"line":248},[207,492,493],{"class":349},"  payloadExtraction",[207,495,234],{"class":213},[207,497,498],{"class":237}," false\n",[207,500,501],{"class":209,"line":381},[207,502,428],{"class":213},[176,504,505,234,508],{},[329,506,507],{},"Client-side safeguard",[198,509,511],{"className":200,"code":510,"language":202,"meta":203,"style":203},"// app/plugins/payload-fix.ts\nexport default defineNuxtPlugin((nuxtApp) => {\n  if (process.client && !nuxtApp.payload?.data) {\n    nuxtApp.payload.data = reactive({})\n  }\n})\n",[153,512,513,518,549,591,618,623],{"__ignoreMap":203},[207,514,515],{"class":209,"line":210},[207,516,517],{"class":244},"// app/plugins/payload-fix.ts\n",[207,519,520,524,527,531,534,536,540,543,547],{"class":209,"line":248},[207,521,523],{"class":522},"s7zQu","export",[207,525,526],{"class":522}," default",[207,528,530],{"class":529},"s2Zo4"," defineNuxtPlugin",[207,532,533],{"class":223},"(",[207,535,533],{"class":213},[207,537,539],{"class":538},"sHdIc","nuxtApp",[207,541,542],{"class":213},")",[207,544,546],{"class":545},"spNyl"," =>",[207,548,355],{"class":213},[207,550,551,554,557,560,563,566,569,572,574,576,579,582,585,588],{"class":209,"line":381},[207,552,553],{"class":522},"  if",[207,555,556],{"class":230}," (",[207,558,559],{"class":223},"process",[207,561,562],{"class":213},".",[207,564,565],{"class":223},"client",[207,567,568],{"class":213}," &&",[207,570,571],{"class":213}," !",[207,573,539],{"class":223},[207,575,562],{"class":213},[207,577,578],{"class":223},"payload",[207,580,581],{"class":213},"?.",[207,583,584],{"class":223},"data",[207,586,587],{"class":230},") ",[207,589,590],{"class":213},"{\n",[207,592,593,596,598,600,602,604,607,610,612,615],{"class":209,"line":403},[207,594,595],{"class":223},"    nuxtApp",[207,597,562],{"class":213},[207,599,578],{"class":223},[207,601,562],{"class":213},[207,603,584],{"class":223},[207,605,606],{"class":213}," =",[207,608,609],{"class":529}," reactive",[207,611,533],{"class":230},[207,613,614],{"class":213},"{}",[207,616,617],{"class":230},")\n",[207,619,620],{"class":209,"line":425},[207,621,622],{"class":213},"  }\n",[207,624,626,629],{"class":209,"line":625},6,[207,627,628],{"class":213},"}",[207,630,617],{"class":223},[166,632],{},[144,634,636],{"id":635},"trade-offs","Trade-offs",[149,638,639,640,562],{},"A summary of the trade-offs between the two options is detailed in ",[285,641,643],{"href":642},"#table-1","Table 1",[149,645,646],{},[285,647],{"id":648},"table-1",[650,651,652,668],"table",{},[653,654,655],"thead",{},[656,657,658,662,665],"tr",{},[659,660,661],"th",{},"Approach",[659,663,664],{},"Advantages",[659,666,667],{},"Disadvantages",[669,670,671,685],"tbody",{},[656,672,673,679,682],{},[674,675,676],"td",{},[329,677,678],{},"Option A: Official Way",[674,680,681],{},"Cleanest architecture, fully supported by Nuxt, best performance.",[674,683,684],{},"Requires explicit maintenance of route patterns.",[656,686,687,692,695],{},[674,688,689],{},[329,690,691],{},"Option B: Legacy Trick",[674,693,694],{},"Quickest fix, bypasses hydration crashes without strict routing.",[674,696,697],{},"Inlines payloads in HTML (larger responses), bypasses standard Nuxt hydration logic.",[149,699,700],{},[301,701,702],{},"Table 1: Trade-offs between official and legacy solutions",[166,704],{},[144,706,708],{"id":707},"prevention-next-steps","Prevention / Next Steps",[173,710,711,721,729],{},[176,712,713,720],{},[329,714,715,716,719],{},"Never use a global SPA (",[153,717,718],{},"ssr: false",") fallback"," if your app contains ISR or SSG routes.",[176,722,723,728],{},[329,724,725,726],{},"Use ",[153,727,449],{}," in pages for granular control over pre-rendering.",[176,730,731,734,735,737],{},[329,732,733],{},"Maintain explicit route groupings"," in ",[153,736,339],{}," for large modules.",[739,740,741],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":203,"searchDepth":248,"depth":248,"links":743},[744,745,746,747,751,752],{"id":146,"depth":248,"text":147},{"id":170,"depth":248,"text":171},{"id":192,"depth":248,"text":193},{"id":316,"depth":248,"text":317,"children":748},[749,750],{"id":321,"depth":381,"text":322},{"id":463,"depth":381,"text":464},{"id":635,"depth":248,"text":636},{"id":707,"depth":248,"text":708},"2026-06-10","Resolving Nuxt Content payload extraction issues and hydration crashes on ISR routes.","md",null,{"type":139},{},true,{"title":86,"description":754},{"src":762},"https://placehold.co/800x400/0f172a/3b82f6?text=Nuxt+ISR+Payload+Extraction","kGWyO9wFhDPxfWKAb-ewsgKzolCT7ThJc9geOnPSwqs",[765,770],{"title":82,"path":83,"stem":84,"description":766,"imageComponent":767,"seoImage":768,"children":-1},"Debugging missing content and 404 errors when deploying Nuxt Content to Cloudflare D1.",{"type":139},{"src":769},"https://placehold.co/800x400/0f172a/3b82f6?text=Nuxt+Content+404s",{"title":90,"path":91,"stem":92,"description":771,"imageComponent":772,"seoImage":773,"children":-1},"A post-mortem on handling architectural integrity when an AI assistant performs an unauthorized database driver refactoring.",{"type":139},{"src":774},"https://placehold.co/800x400/0f172a/3b82f6?text=Post-Mortem:+Intrusive+Database+Driver+Refactoring",1784464468353]