[{"data":1,"prerenderedAt":680},["ShallowReactive",2],{"blog-tag-en-nuxt":3},[4,86,161,213,283,337,410,481,538,626],{"slug":5,"published":6,"minutes":7,"category":8,"tags":9,"tagPages":15,"keywords":18,"about":30,"sources":39,"cover":76,"og":77,"expertise":78,"locales":79,"lang":80,"title":83,"description":84,"coverAlt":85},"schema-org-structured-data-b2b-shop","2026-10-17",10,"web",[10,11,12,13,14],"Schema.org","Structured data","B2B e-commerce","Technical SEO","Nuxt",[16,17],"b2b-e-commerce","nuxt",[19,20,21,22,23,24,25,26,27,28,29],"schema.org b2b shop","product structured data b2b","merchant listing structured data","product snippet vs merchant listing","unitpricespecification referencequantity","productgroup variants structured data","organization schema vatid","b2b prices behind login seo","json-ld nuxt schema org","merchant return policy structured data","mpn gtin structured data",[31,33,36],{"name":10,"url":32},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSchema.org",{"name":34,"url":35},"JSON-LD","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FJSON-LD",{"name":37,"url":38},"Business-to-business","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FBusiness-to-business",[40,43,46,49,52,55,58,61,64,67,70,73],{"title":41,"url":42},"Google Search Central: Introduction to Product structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fproduct",{"title":44,"url":45},"Google Search Central: Merchant listing (Product, Offer) structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fmerchant-listing",{"title":47,"url":48},"Google Search Central: Product snippet structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fproduct-snippet",{"title":50,"url":51},"Google Search Central: Product variant structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fproduct-variants",{"title":53,"url":54},"Google Search Central: Organization structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Forganization",{"title":56,"url":57},"Google Search Central: Merchant return policy structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Freturn-policy",{"title":59,"url":60},"Google Search Central: General structured data guidelines","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fsd-policies",{"title":62,"url":63},"Google Search Central: Generate structured data with JavaScript","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fgenerate-structured-data-with-javascript",{"title":65,"url":66},"Schema.org: Offer","https:\u002F\u002Fschema.org\u002FOffer",{"title":68,"url":69},"Schema.org: UnitPriceSpecification","https:\u002F\u002Fschema.org\u002FUnitPriceSpecification",{"title":71,"url":72},"Unhead: Product schema (defineProduct)","https:\u002F\u002Funhead.unjs.io\u002Fdocs\u002Fschema-org\u002Fapi\u002Fschema\u002Fproduct",{"title":74,"url":75},"Nuxt SEO: Schema.org identity setup","https:\u002F\u002Fnuxtseo.com\u002Fdocs\u002Fschema-org\u002Fguides\u002Fsetup-identity","\u002Fimages\u002Fblog\u002Fschema-org-structured-data-b2b-shop\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fschema-org-structured-data-b2b-shop\u002Fog.jpg","b2b-ecommerce-developer",[80,81,82],"en","de","hu","Schema.org structured data for B2B shops: prices behind logins, units and variants","Product markup for B2B shops: snippet or merchant listing, which price to publish, part numbers, unit pricing, variants, Organization and SSR in Nuxt.","Schema.org for B2B shops: a robot reads a product tag on a shop shelf, one box behind a locked glass door.",{"slug":87,"published":6,"minutes":88,"category":8,"tags":89,"tagPages":94,"keywords":95,"about":107,"sources":117,"cover":154,"og":155,"expertise":156,"locales":157,"lang":80,"title":158,"description":159,"coverAlt":160},"vue-ai-chat-ui-streaming-accessibility",11,[90,14,91,92,93],"Vue","Accessibility","Streaming","AI chat",[17],[96,97,98,99,100,101,102,103,104,105,106],"vue ai chat ui","nuxt llm streaming","sse vs fetch streaming","aria-live streaming text","accessible chat interface","abort fetch stream vue","dompurify markdown llm","role log chat","reduced motion chat ui","wcag 2.2 chat","screen reader streaming",[108,111,114],{"name":109,"url":110},"Web accessibility","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWeb_accessibility",{"name":112,"url":113},"Server-sent events","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FServer-sent_events",{"name":115,"url":116},"Vue.js","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FVue.js",[118,121,124,127,130,133,136,139,142,145,148,151],{"title":119,"url":120},"MDN: Using server-sent events","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FServer-sent_events\u002FUsing_server-sent_events",{"title":122,"url":123},"MDN: AbortController","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FAbortController",{"title":125,"url":126},"MDN: ReadableStream","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FReadableStream",{"title":128,"url":129},"MDN: TextDecoderStream","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FTextDecoderStream",{"title":131,"url":132},"MDN: ARIA log role","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAccessibility\u002FARIA\u002FReference\u002FRoles\u002Flog_role",{"title":134,"url":135},"W3C: Understanding SC 4.1.3 Status Messages","https:\u002F\u002Fwww.w3.org\u002FWAI\u002FWCAG22\u002FUnderstanding\u002Fstatus-messages.html",{"title":137,"url":138},"W3C WAI: What's new in WCAG 2.2","https:\u002F\u002Fwww.w3.org\u002FWAI\u002Fstandards-guidelines\u002Fwcag\u002Fnew-in-22\u002F",{"title":140,"url":141},"MDN: prefers-reduced-motion","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FCSS\u002F@media\u002Fprefers-reduced-motion",{"title":143,"url":144},"DOMPurify README","https:\u002F\u002Fgithub.com\u002Fcure53\u002FDOMPurify",{"title":146,"url":147},"markdown-it README","https:\u002F\u002Fgithub.com\u002Fmarkdown-it\u002Fmarkdown-it",{"title":149,"url":150},"AI SDK docs: useChat","https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Fai-sdk-ui\u002Fchatbot",{"title":152,"url":153},"Vue docs: nextTick","https:\u002F\u002Fvuejs.org\u002Fapi\u002Fgeneral.html#nexttick","\u002Fimages\u002Fblog\u002Fvue-ai-chat-ui-streaming-accessibility\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fvue-ai-chat-ui-streaming-accessibility\u002Fog.jpg","vue-nuxt-developer",[80,81,82],"Streaming AI chat in Vue and Nuxt: accessible by design","Streaming AI chat UI in Vue and Nuxt: fetch streams, abort and retry, safe markdown, aria-live announcements, keyboard support and reduced motion.","Streaming AI chat in Vue and Nuxt: chat bubbles appear one by one in a window, headphones and a keyboard key in front.",{"slug":162,"published":163,"minutes":164,"category":8,"tags":165,"tagPages":170,"keywords":171,"about":182,"sources":191,"cover":207,"og":208,"expertise":156,"locales":209,"lang":80,"title":210,"description":211,"coverAlt":212},"nuxt-i18n-multilingual-seo-hreflang","2026-10-16",8,[14,166,167,168,169],"i18n","SEO","hreflang","Multilingual",[17],[172,173,174,175,176,177,178,179,180,181],"nuxt i18n seo","nuxt hreflang","useLocaleHead","nuxt i18n canonical","hreflang x-default","prefix_except_default","multilingual seo nuxt","nuxt i18n sitemap hreflang","hreflang self-referencing","nuxt i18n baseUrl",[183,185,188],{"name":14,"url":184},"https:\u002F\u002Fnuxt.com\u002F",{"name":186,"url":187},"Hreflang","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FHreflang",{"name":189,"url":190},"Internationalization and localization","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FInternationalization_and_localization",[192,195,198,201,204],{"title":193,"url":194},"Nuxt i18n docs: SEO (useLocaleHead)","https:\u002F\u002Fi18n.nuxtjs.org\u002Fdocs\u002Fguide\u002Fseo",{"title":196,"url":197},"Nuxt i18n docs: Routing strategies","https:\u002F\u002Fi18n.nuxtjs.org\u002Fdocs\u002Fguide",{"title":199,"url":200},"Google Search Central: Tell Google about localized versions of your page","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fspecialty\u002Finternational\u002Flocalized-versions",{"title":202,"url":203},"Google Search Central: Managing multi-regional and multilingual sites","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fspecialty\u002Finternational\u002Fmanaging-multi-regional-sites",{"title":205,"url":206},"Google Search Central: How to specify a canonical URL","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fcrawling-indexing\u002Fconsolidate-duplicate-urls","\u002Fimages\u002Fblog\u002Fnuxt-i18n-multilingual-seo-hreflang\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fnuxt-i18n-multilingual-seo-hreflang\u002Fog.jpg",[80,81,82],"Multilingual SEO with Nuxt i18n: URL strategy, hreflang, canonicals and sitemaps","How to set up Nuxt i18n so search engines index every language: routing strategy, useLocaleHead, hreflang rules, partial translations and sitemaps.","Multilingual SEO with Nuxt i18n: a signpost with three arrows points to three houses, a globe at its foot.",{"slug":214,"published":163,"minutes":215,"category":8,"tags":216,"tagPages":221,"keywords":223,"about":236,"sources":243,"cover":277,"og":278,"expertise":156,"locales":279,"lang":80,"title":280,"description":281,"coverAlt":282},"llm-endpoint-abuse-denial-of-wallet",14,[14,217,218,219,220],"LLM security","Rate limiting","OWASP","Cost control",[17,222],"llm-security",[224,225,226,227,228,229,230,231,232,233,234,235],"denial of wallet llm","owasp llm10 unbounded consumption","rate limit llm api nuxt","nuxt security rate limiter","protect openai api key frontend","llm token budget per user","limit llm cost per user","nitro api rate limiting","cloudflare turnstile nuxt","anthropic spend limit","openai hard spend limit","llm prompt size limit",[237,239,242],{"name":218,"url":238},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FRate_limiting",{"name":240,"url":241},"Denial-of-service attack","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FDenial-of-service_attack",{"name":14,"url":184},[244,247,250,253,256,259,262,265,268,271,274],{"title":245,"url":246},"OWASP GenAI Security Project: LLM10:2025 Unbounded Consumption","https:\u002F\u002Fgenai.owasp.org\u002Fllmrisk\u002Fllm102025-unbounded-consumption\u002F",{"title":248,"url":249},"Nuxt Security: Rate Limiter middleware","https:\u002F\u002Fnuxt-security.vercel.app\u002Fmiddleware\u002Frate-limiter",{"title":251,"url":252},"Nuxt Security: Request Size Limiter middleware","https:\u002F\u002Fnuxt-security.vercel.app\u002Fmiddleware\u002Frequest-size-limiter",{"title":254,"url":255},"nuxt-auth-utils: README (GitHub)","https:\u002F\u002Fgithub.com\u002Fatinux\u002Fnuxt-auth-utils",{"title":257,"url":258},"h3: request utilities (getRequestIP, readValidatedBody)","https:\u002F\u002Fh3.dev\u002Futils\u002Frequest",{"title":260,"url":261},"Upstash: Ratelimiting algorithms","https:\u002F\u002Fupstash.com\u002Fdocs\u002Fredis\u002Fsdks\u002Fratelimit-ts\u002Falgorithms",{"title":263,"url":264},"Cloudflare Turnstile: Validate the token","https:\u002F\u002Fdevelopers.cloudflare.com\u002Fturnstile\u002Fget-started\u002Fserver-side-validation\u002F",{"title":266,"url":267},"Claude Platform Docs: Rate limits and spend limits","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fapi\u002Frate-limits",{"title":269,"url":270},"Claude Platform Docs: Token counting","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fbuild-with-claude\u002Ftoken-counting",{"title":272,"url":273},"OpenAI API Docs: Spend limits","https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fguides\u002Fspend-limits",{"title":275,"url":276},"OpenAI API Docs: Rate limits","https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fguides\u002Frate-limits","\u002Fimages\u002Fblog\u002Fllm-endpoint-abuse-denial-of-wallet\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fllm-endpoint-abuse-denial-of-wallet\u002Fog.jpg",[80,81,82],"Denial of wallet: protecting public LLM endpoints in a Nuxt app","How to stop abuse and runaway cost on a public LLM route in Nuxt: auth, per-user rate limits, prompt caps, token budgets, Turnstile and spend limits.","Denial of wallet on LLM endpoints: a turnstile slows a queue of tiny robots heading for an open wallet.",{"slug":284,"published":285,"minutes":286,"category":8,"tags":287,"tagPages":291,"keywords":293,"about":301,"sources":308,"cover":330,"og":331,"expertise":332,"locales":333,"lang":80,"title":334,"description":335,"coverAlt":336},"llms-txt-vs-markdown-content-negotiation","2026-10-07",9,[288,289,290,14],"llms.txt","Content negotiation","AI agents",[292,17],"ai-agents",[288,294,295,296,297,298,299,300],"markdown for agents","content negotiation","AI crawlers","generative engine optimization","Accept text\u002Fmarkdown header","llms-full.txt","agent-ready website",[302,305],{"name":303,"url":304},"Markdown","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMarkdown",{"name":306,"url":307},"Hypertext Transfer Protocol","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FHypertext_Transfer_Protocol",[309,312,315,318,321,324,327],{"title":310,"url":311},"llmstxt.org: The \u002Fllms.txt file (proposal, version 2)","https:\u002F\u002Fllmstxt.org\u002F",{"title":313,"url":314},"llmstxt.org: Changes from v1 to v2","https:\u002F\u002Fllmstxt.org\u002Fchanges.html",{"title":316,"url":317},"Cloudflare changelog: Markdown for Agents (12 February 2026)","https:\u002F\u002Fdevelopers.cloudflare.com\u002Fchangelog\u002Fpost\u002F2026-02-12-markdown-for-agents\u002F",{"title":319,"url":320},"Cloudflare docs: Markdown for Agents","https:\u002F\u002Fdevelopers.cloudflare.com\u002Ffundamentals\u002Freference\u002Fmarkdown-for-agents\u002F",{"title":322,"url":323},"Ahrefs: 137K sites analyzed, 97% of llms.txt files never get read (June 2026)","https:\u002F\u002Fahrefs.com\u002Fblog\u002Fllmstxt-study\u002F",{"title":325,"url":326},"Checkly: The current state of content negotiation for AI agents (February 2026)","https:\u002F\u002Fwww.checklyhq.com\u002Fblog\u002Fstate-of-ai-agent-content-negotation\u002F",{"title":328,"url":329},"Suganthan: tracking Cloudflare Markdown for Agents on one site","https:\u002F\u002Fsuganthan.com\u002Fblog\u002Fcloudflare-markdown-for-agents\u002F","\u002Fimages\u002Fblog\u002Fllms-txt-vs-markdown-content-negotiation\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fllms-txt-vs-markdown-content-negotiation\u002Fog.jpg","ai-engineer",[80,81,82],"llms.txt vs Markdown content negotiation: what agents actually fetch","llms.txt is a proposal, Markdown content negotiation is a header. What AI agents fetch, what the logs show, and how to serve both from Nuxt and nginx.","llms.txt vs Markdown content negotiation: a robot at a counter reaches past a short menu card for a full page.",{"slug":338,"published":339,"updated":163,"minutes":88,"category":8,"tags":340,"tagPages":345,"keywords":346,"about":357,"sources":367,"cover":404,"og":405,"expertise":156,"locales":406,"lang":80,"title":407,"description":408,"coverAlt":409},"nuxt-caching-isr-commerce","2026-10-05",[14,341,342,343,344],"Caching","ISR","Headless commerce","Cache invalidation",[17],[347,348,349,350,351,352,353,354,355,356],"nuxt route rules caching","nuxt isr","nitro cache swr","cache invalidation purge by cache tag","nuxt isr cloudflare","stale while revalidate commerce","headless commerce caching","vercel isr pricing","cdn cache key vary","personalized prices cached pages",[358,361,364],{"name":359,"url":360},"Content delivery network","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FContent_delivery_network",{"name":362,"url":363},"Cache (computing)","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCache_(computing)",{"name":365,"url":366},"Static site generator","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FStatic_site_generator",[368,371,374,377,380,383,386,389,392,395,398,401],{"title":369,"url":370},"Nuxt docs: rendering modes and route rules (v4)","https:\u002F\u002Fnuxt.com\u002Fdocs\u002F4.x\u002Fguide\u002Fconcepts\u002Frendering",{"title":372,"url":373},"Nuxt blog: Nuxt 4.3 release (ISR and SWR payload extraction)","https:\u002F\u002Fnuxt.com\u002Fblog\u002Fv4-3",{"title":375,"url":376},"Nitro docs: caching","https:\u002F\u002Fnitro.build\u002Fguide\u002Fcache",{"title":378,"url":379},"Cloudflare docs: default cache behavior","https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcache\u002Fconcepts\u002Fdefault-cache-behavior\u002F",{"title":381,"url":382},"Cloudflare docs: purge by tags","https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcache\u002Fhow-to\u002Fpurge-cache\u002Fpurge-by-tags\u002F",{"title":384,"url":385},"Cloudflare docs: Workers Cache","https:\u002F\u002Fdevelopers.cloudflare.com\u002Fworkers\u002Fcache\u002F",{"title":387,"url":388},"Cloudflare docs: cache responses (CF-Cache-Status)","https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcache\u002Fconcepts\u002Fcache-responses\u002F",{"title":390,"url":391},"Vercel docs: incremental static regeneration","https:\u002F\u002Fvercel.com\u002Fdocs\u002Fincremental-static-regeneration",{"title":393,"url":394},"Vercel docs: response headers (x-vercel-cache)","https:\u002F\u002Fvercel.com\u002Fdocs\u002Fheaders\u002Fresponse-headers",{"title":396,"url":397},"Shopify docs: Hydrogen caching strategies","https:\u002F\u002Fshopify.dev\u002Fdocs\u002Fstorefronts\u002Fheadless\u002Fhydrogen\u002Fcaching",{"title":399,"url":400},"RFC 5861: HTTP Cache-Control extensions for stale content","https:\u002F\u002Fwww.rfc-editor.org\u002Frfc\u002Frfc5861",{"title":402,"url":403},"Regulation (EU) 2016\u002F679 (GDPR), EUR-Lex","https:\u002F\u002Feur-lex.europa.eu\u002Feli\u002Freg\u002F2016\u002F679\u002Foj","\u002Fimages\u002Fblog\u002Fnuxt-caching-isr-commerce\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fnuxt-caching-isr-commerce\u002Fog.jpg",[80,81,82],"Caching a headless commerce front end in Nuxt: route rules, ISR and purge","Caching a headless commerce front end in Nuxt: route rules, Nitro and CDN keys, ISR limits, tag purge, and keeping customer prices out of shared caches.","Nuxt caching for headless commerce: a page slides out of stacked cache trays, with a clock at the side.",{"slug":411,"published":412,"updated":163,"minutes":88,"category":8,"tags":413,"tagPages":417,"keywords":418,"about":429,"sources":438,"cover":475,"og":476,"expertise":156,"locales":477,"lang":80,"title":478,"description":479,"coverAlt":480},"nuxt-security-module","2026-10-02",[14,414,415,218,416],"Content Security Policy","HTTP security headers","Nitro",[17],[419,420,421,422,423,424,425,426,427,428],"nuxt security module","nuxt content security policy nonce","nuxt security headers","nitro route rules security","nuxt rate limiter","nuxt cors server routes","csp report-uri nuxt","nuxt csrf protection","secure nuxt app checklist","nuxt csp strict-dynamic breakage",[430,432,435],{"name":414,"url":431},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FContent_Security_Policy",{"name":433,"url":434},"Cross-site scripting","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCross-site_scripting",{"name":436,"url":437},"Cross-origin resource sharing","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCross-origin_resource_sharing",[439,442,445,448,451,454,457,460,463,466,469,472],{"title":440,"url":441},"Nuxt Security README (main branch)","https:\u002F\u002Fgithub.com\u002FBaroshem\u002Fnuxt-security\u002Fblob\u002Fmain\u002FREADME.md",{"title":443,"url":444},"Nuxt Security default configuration (src\u002FdefaultConfig.ts)","https:\u002F\u002Fraw.githubusercontent.com\u002FBaroshem\u002Fnuxt-security\u002Fmain\u002Fsrc\u002FdefaultConfig.ts",{"title":446,"url":447},"Nuxt Security docs: Content Security Policy","https:\u002F\u002Fraw.githubusercontent.com\u002FBaroshem\u002Fnuxt-security\u002Fmain\u002Fdocs\u002Fcontent\u002F2.headers\u002F1.csp.md",{"title":449,"url":450},"Nuxt Security docs: rate limiter","https:\u002F\u002Fraw.githubusercontent.com\u002FBaroshem\u002Fnuxt-security\u002Fmain\u002Fdocs\u002Fcontent\u002F3.middleware\u002F1.rate-limiter.md",{"title":452,"url":453},"Nuxt Security docs: CORS handler","https:\u002F\u002Fraw.githubusercontent.com\u002FBaroshem\u002Fnuxt-security\u002Fmain\u002Fdocs\u002Fcontent\u002F3.middleware\u002F4.cors-handler.md",{"title":455,"url":456},"Nuxt Security docs: CSRF","https:\u002F\u002Fraw.githubusercontent.com\u002FBaroshem\u002Fnuxt-security\u002Fmain\u002Fdocs\u002Fcontent\u002F3.middleware\u002F7.csrf.md",{"title":458,"url":459},"Nuxt Security docs: hooks","https:\u002F\u002Fraw.githubusercontent.com\u002FBaroshem\u002Fnuxt-security\u002Fmain\u002Fdocs\u002Fcontent\u002F5.advanced\u002F4.hooks.md",{"title":461,"url":462},"Nuxt Security docs: security headers","https:\u002F\u002Fraw.githubusercontent.com\u002FBaroshem\u002Fnuxt-security\u002Fmain\u002Fdocs\u002Fcontent\u002F5.advanced\u002F5.security-headers.md",{"title":464,"url":465},"Nuxt Security docs: improving security","https:\u002F\u002Fraw.githubusercontent.com\u002FBaroshem\u002Fnuxt-security\u002Fmain\u002Fdocs\u002Fcontent\u002F5.advanced\u002F7.improve-security.md",{"title":467,"url":468},"Nuxt Security release v2.6.0 (12 May 2026)","https:\u002F\u002Fgithub.com\u002FBaroshem\u002Fnuxt-security\u002Freleases\u002Ftag\u002Fv2.6.0",{"title":470,"url":471},"MDN: HTTP Observatory","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fobservatory",{"title":473,"url":474},"Playwright: Response class","https:\u002F\u002Fplaywright.dev\u002Fdocs\u002Fapi\u002Fclass-response","\u002Fimages\u002Fblog\u002Fnuxt-security-module\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fnuxt-security-module\u002Fog.jpg",[80,81,82],"Locking down a Nuxt app: CSP, headers and rate limits with Nuxt Security","How the Nuxt Security module behaves in practice: safe defaults, strict mode trade-offs, nonce CSP in SSR and SSG, route rules and limits.","Nuxt Security module: a shield with three locks guards a browser window.",{"slug":482,"published":483,"minutes":484,"category":8,"tags":485,"tagPages":487,"keywords":488,"about":499,"sources":506,"cover":532,"og":533,"expertise":78,"locales":534,"lang":80,"title":535,"description":536,"coverAlt":537},"headless-product-configurator-b2b","2026-09-14",12,[486,12,14,343],"Product configurator",[16,17],[489,490,491,492,493,494,495,496,497,498],"B2B product configurator","Produktkonfigurator","Produktkonfigurator TYPO3","B2B Konfigurator","headless product configurator","CPQ configure price quote","rule engine vs constraint solver","Nuxt Spryker Glue API","product configurator 100000 variants","accessible product configurator",[500,502,504],{"name":486,"url":501},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FProduct_configurator",{"name":343,"url":503},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FHeadless_commerce",{"name":14,"url":505},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FNuxt",[507,509,512,515,518,521,524,526,529],{"title":508,"url":501},"Wikipedia: Knowledge-based configuration (product configurator)",{"title":510,"url":511},"Google OR-Tools: The CP-SAT solver","https:\u002F\u002Fdevelopers.google.com\u002Foptimization\u002Fcp\u002Fcp_solver",{"title":513,"url":514},"Spryker documentation: Glue API, Product Configuration feature integration","https:\u002F\u002Fdocs.spryker.com\u002Fdocs\u002Fscos\u002Fdev\u002Ffeature-integration-guides\u002F202108.0\u002Fglue-api\u002Fglue-api-product-configuration-feature-integration.html",{"title":516,"url":517},"OWASP: Input Validation Cheat Sheet","https:\u002F\u002Fcheatsheetseries.owasp.org\u002Fcheatsheets\u002FInput_Validation_Cheat_Sheet.html",{"title":519,"url":520},"web.dev: Virtualize large lists","https:\u002F\u002Fweb.dev\u002Farticles\u002Fvirtualize-long-lists-react-window",{"title":522,"url":523},"W3C: Understanding SC 3.3.1 Error Identification (WCAG 2.2)","https:\u002F\u002Fwww.w3.org\u002FWAI\u002FWCAG22\u002FUnderstanding\u002Ferror-identification.html",{"title":525,"url":135},"W3C: Understanding SC 4.1.3 Status Messages (WCAG 2.2)",{"title":527,"url":528},"W3C: Understanding SC 2.5.8 Target Size (Minimum) (WCAG 2.2)","https:\u002F\u002Fwww.w3.org\u002FWAI\u002FWCAG22\u002FUnderstanding\u002Ftarget-size-minimum.html",{"title":530,"url":531},"W3C WAI-ARIA Authoring Practices: Combobox pattern","https:\u002F\u002Fwww.w3.org\u002FWAI\u002FARIA\u002Fapg\u002Fpatterns\u002Fcombobox\u002F","\u002Fimages\u002Fblog\u002Fheadless-product-configurator-b2b\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fheadless-product-configurator-b2b\u002Fog.jpg",[80,81,82],"Headless B2B product configurator: rules, pricing and Nuxt on a commerce API","Headless B2B product configurator: rule engine or solver, where rules live, server-side pricing, Nuxt on a commerce API, TYPO3 and 100k+ variants.","Headless B2B product configurator: a hand fits a knob onto a machine, interchangeable parts and a price tag beside it.",{"slug":539,"published":540,"minutes":541,"category":8,"tags":542,"tagPages":546,"keywords":547,"about":558,"sources":563,"cover":620,"og":621,"expertise":156,"locales":622,"lang":80,"title":623,"description":624,"coverAlt":625},"nuxt-core-web-vitals-performance","2026-07-21",13,[543,14,544,545],"Core Web Vitals","Performance","E-commerce",[17],[548,549,550,551,552,553,554,555,556,557],"Core Web Vitals Nuxt","Nuxt performance optimization","improve LCP Nuxt","INP Nuxt hydration","fix CLS Vue","Nuxt lazy hydration","Nuxt Image LCP","Nuxt Scripts third-party scripts","Nuxt prerender vs SSR vs ISR","Core Web Vitals e-commerce",[559,561,562],{"name":543,"url":560},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCore_Web_Vitals",{"name":14,"url":505},{"name":115,"url":116},[564,567,570,573,576,579,582,585,588,591,593,596,599,602,605,608,611,614,617],{"title":565,"url":566},"web.dev: Web Vitals","https:\u002F\u002Fweb.dev\u002Farticles\u002Fvitals",{"title":568,"url":569},"web.dev: Largest Contentful Paint (LCP)","https:\u002F\u002Fweb.dev\u002Farticles\u002Flcp",{"title":571,"url":572},"web.dev: Optimize Largest Contentful Paint","https:\u002F\u002Fweb.dev\u002Farticles\u002Foptimize-lcp",{"title":574,"url":575},"web.dev: Interaction to Next Paint (INP)","https:\u002F\u002Fweb.dev\u002Farticles\u002Finp",{"title":577,"url":578},"web.dev: Optimize Cumulative Layout Shift","https:\u002F\u002Fweb.dev\u002Farticles\u002Foptimize-cls",{"title":580,"url":581},"web.dev: Optimize long tasks","https:\u002F\u002Fweb.dev\u002Farticles\u002Foptimize-long-tasks",{"title":583,"url":584},"Chrome for Developers: Chrome UX Report (CrUX)","https:\u002F\u002Fdeveloper.chrome.com\u002Fdocs\u002Fcrux",{"title":586,"url":587},"Chrome for Developers: CrUX methodology","https:\u002F\u002Fdeveloper.chrome.com\u002Fdocs\u002Fcrux\u002Fmethodology",{"title":589,"url":590},"GitHub: GoogleChrome\u002Fweb-vitals","https:\u002F\u002Fgithub.com\u002FGoogleChrome\u002Fweb-vitals",{"title":592,"url":370},"Nuxt docs: Rendering modes",{"title":594,"url":595},"Nuxt docs: Components (Lazy prefix, delayed hydration, client components)","https:\u002F\u002Fnuxt.com\u002Fdocs\u002F4.x\u002Fguide\u002Fdirectory-structure\u002Fapp\u002Fcomponents",{"title":597,"url":598},"Nuxt docs: Experimental features (lazyHydration, payloadExtraction)","https:\u002F\u002Fnuxt.com\u002Fdocs\u002F4.x\u002Fguide\u002Fgoing-further\u002Fexperimental-features",{"title":600,"url":601},"Nuxt docs: Data fetching (pick, transform, lazy)","https:\u002F\u002Fnuxt.com\u002Fdocs\u002F4.x\u002Fgetting-started\u002Fdata-fetching",{"title":603,"url":604},"Nuxt blog: Nuxt 4.5","https:\u002F\u002Fnuxt.com\u002Fblog\u002Fv4-5",{"title":606,"url":607},"GitHub: Nuxt releases","https:\u002F\u002Fgithub.com\u002Fnuxt\u002Fnuxt\u002Freleases",{"title":609,"url":610},"Nuxt Image: NuxtImg","https:\u002F\u002Fimage.nuxt.com\u002Fusage\u002Fnuxt-img",{"title":612,"url":613},"Nuxt Fonts module","https:\u002F\u002Fnuxt.com\u002Fmodules\u002Ffonts",{"title":615,"url":616},"Nuxt Scripts: Getting started","https:\u002F\u002Fscripts.nuxt.com\u002Fdocs\u002Fgetting-started",{"title":618,"url":619},"Nuxt Scripts: Script triggers","https:\u002F\u002Fscripts.nuxt.com\u002Fdocs\u002Fguides\u002Fscript-triggers","\u002Fimages\u002Fblog\u002Fnuxt-core-web-vitals-performance\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fnuxt-core-web-vitals-performance\u002Fog.jpg",[80,81,82],"Core Web Vitals for Nuxt sites and shops: fixing LCP, INP and CLS","How to fix LCP, INP and CLS in Nuxt 4 sites and shops: images, hydration, fonts, third-party scripts, prerender vs SSR vs ISR, and measuring real users.","Core Web Vitals for Nuxt sites: three dashboard gauges with needles in the calm zone behind a steering wheel.",{"slug":627,"published":628,"updated":285,"minutes":286,"category":8,"tags":629,"tagPages":633,"keywords":634,"about":645,"sources":652,"cover":674,"og":675,"expertise":156,"locales":676,"lang":80,"title":677,"description":678,"coverAlt":679},"nuxt-llm-features-ai-sdk-streaming","2026-05-14",[14,630,92,631,632,416],"AI SDK","Structured output","Tool approval",[17],[635,636,637,638,639,640,641,642,643,644],"Nuxt AI","AI SDK Vue","Nuxt server route LLM","streaming chat Nuxt","useChat @ai-sdk\u002Fvue","structured output JSON Schema limits","human in the loop tool approval","Nitro API route model key","AI Act Article 50 chatbot","stopWhen isStepCount",[646,647,649],{"name":14,"url":505},{"name":630,"url":648},"https:\u002F\u002Fai-sdk.dev",{"name":650,"url":651},"Zod","https:\u002F\u002Fzod.dev",[653,656,659,662,665,668,671],{"title":654,"url":655},"AI SDK docs: Vue.js (Nuxt) quickstart","https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Fgetting-started\u002Fnuxt",{"title":657,"url":658},"AI SDK docs: Generating structured data","https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Fai-sdk-core\u002Fgenerating-structured-data",{"title":660,"url":661},"AI SDK docs: Tool approvals","https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Fagents\u002Ftool-approvals",{"title":663,"url":664},"Claude API docs: Structured outputs","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fbuild-with-claude\u002Fstructured-outputs",{"title":666,"url":667},"AI SDK docs: Telemetry","https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Fai-sdk-core\u002Ftelemetry",{"title":669,"url":670},"EU AI Act, Article 50: Transparency obligations","https:\u002F\u002Fartificialintelligenceact.eu\u002Farticle\u002F50\u002F",{"title":672,"url":673},"Faegre Drinker: Commission confirms the Transparency Code of Practice (Jul 2026)","https:\u002F\u002Fwww.faegredrinker.com\u002Fen\u002Finsights\u002Fpublications\u002F2026\u002F7\u002Feu-ai-act-commission-confirms-transparency-code-of-practice-as-adequate-and-publishes-final-version-of-its-guidelines-on-transparency-obligations","\u002Fimages\u002Fblog\u002Fnuxt-llm-features-ai-sdk-streaming\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fnuxt-llm-features-ai-sdk-streaming\u002Fog.jpg",[80,81,82],"Shipping LLM features in Nuxt: streaming, structured output, tool approval","Nuxt AI end to end: a server route that holds the API key, streaming parts, strict structured output, tools needing approval, errors and Article 50.","Streaming LLM features in Nuxt: a tap fills a glass in a steady stream next to a hand over an approve button.",1793451238151]