\n\n### Describe the bug\n\nif you use useHead to add `application/ld+json` to the index page, then on another page you add one as well you end up on that other page with both. On index you only get the index one. And my project has 15 pages each with a useHead but ONLY the index.vue one is duplicated.\n\nI've confirmed it's that block duplicating by changing it and watching it change on other pages as well as removing it and watching it disappear\n\n### Additional context\n\nCurrently my work around for this bug is doing this on index.vue instead:\n\n```\nuseHead(() => {\n const headConfig = {\n title: 'VanityCert.com - Effortless Custom Domains & Automated SSL for SaaS',\n meta: [\n {\n hid: 'description',\n name: 'description',\n content: 'VanityCert.com simplifies custom domain management and automated SSL certificate issuance for SaaS businesses. Empower your customers with branded domains and seamless security.',\n },\n {\n hid: 'keywords',\n name: 'keywords',\n content: 'custom domains, automated SSL, SaaS, domain management, SSL certificates, white-label domains, security, infrastructure, B2B SaaS',\n },\n { hid: 'og:title', property: 'og:title', content: 'VanityCert.com - Effortless Custom Domains & Automated SSL for SaaS' },\n { hid: 'og:description', property: 'og:description', content: 'VanityCert.com simplifies custom domain management and automated SSL certificate issuance for SaaS businesses. Empower your customers with branded domains and seamless security.' },\n { hid: 'og:image', property: 'og:image', content: 'https://www.vanitycert.com/img/social-share.png' },\n { hid: 'og:url', property: 'og:url', content: 'https://www.vanitycert.com/' },\n { hid: 'twitter:title', name: 'twitter:title', content: 'VanityCert.com - Effortless Custom Domains & Automated SSL for SaaS' },\n { hid: 'twitter:description', name: 'twitter:description', content: 'VanityCert.com simplifies custom domain management and automated SSL certificate issuance for SaaS businesses. Empower your customers with branded domains and seamless security.' },\n { hid: 'twitter:image', name: 'twitter:image', content: 'https://www.vanitycert.com/img/social-share.png' },\n { hid: 'twitter:url', name: 'twitter:url', content: 'https://www.vanitycert.com/' },\n ],\n link: [\n { rel: 'canonical', href: 'https://www.vanitycert.com/' },\n ],\n script: [] // Initialize script array\n };\n\n // Conditionally add Product schema ONLY if on the homepage route\n if (route.path === '/') {\n headConfig.script.push({\n type: 'application/ld+json',\n innerHTML: JSON.stringify({\n \"@context\": \"https://schema.org\",\n \"@type\": \"Product\",\n \"name\": \"VanityCert.com - Custom Domain & Automated SSL for SaaS\",\n \"description\": \"VanityCert.com simplifies custom domain management and automated SSL certificate issuance for SaaS businesses. Empower your customers with branded domains and seamless security.\",\n \"url\": \"https://www.vanitycert.com/\",\n \"image\": \"https://www.vanitycert.com/img/social-share.png\",\n \"logo\": \"https://www.vanitycert.com/img/logo.png\",\n \"brand\": {\n \"@type\": \"Brand\",\n \"name\": \"VanityCert\"\n },\n \"offers\": {\n \"@type\": \"Offer\",\n \"name\": \"VanityCert SaaS Subscription\",\n \"priceCurrency\": \"USD\",\n \"price\": \"16\",\n \"priceValidUntil\": \"2025-12-31\",\n \"url\": \"https://www.vanitycert.com/pricing\",\n \"availability\": \"https://schema.org/InStock\",\n \"itemCondition\": \"https://schema.org/NewCondition\"\n },\n \"mainEntityOfPage\": {\n \"@type\": \"WebPage\",\n \"@id\": \"https://www.vanitycert.com/\"\n },\n \"publisher\": {\n \"@type\": \"Organization\",\n \"name\": \"VanityCert LLC\",\n \"logo\": {\n \"@type\": \"ImageObject\",\n \"url\": \"https://www.vanitycert.com/img/logo.png\"\n }\n }\n })\n });\n }\n\n return headConfig;\n});\n```\n\n### Logs\n\n```shell-script\n\n```",[3170],{"name":3171,"color":3172},"pending triage","E99695",32766,"useHead on index.vue applies schema globally","2025-07-25T20:46:46Z","https://github.com/nuxt/nuxt/issues/32766",0.79389495,{"description":3179,"labels":3180,"number":3181,"owner":3141,"repository":3151,"state":3182,"title":3183,"updated_at":3184,"url":3185,"score":3186},"The JSDOC comment for it says that the default also includes TS and JS files, but the actual implementation doesn't.\r\n\r\nJSDOC default: `**/*.{vue,js,ts,jsx,tsx,md,mdc,mdx}`\r\nImplementation: `**/*.{vue,jsx,tsx,md,mdc,mdx}`",[],247,"closed","`clientBundle.scan.globInclude` missing `ts` and `js` files","2024-08-27T22:50:17Z","https://github.com/nuxt/icon/issues/247",0.46140584,{"description":3188,"labels":3189,"number":3196,"owner":3141,"repository":3197,"state":3182,"title":3198,"updated_at":3199,"url":3200,"score":3201},"### Environment\n\n------------------------------\n- Operating System: Linux\n- Node Version: v22.11.0\n- Nuxt Version: 3.15.4\n- CLI Version: 3.22.4\n- Nitro Version: 2.11.3\n- Package Manager: pnpm@9.14.4\n- Builder: -\n- User Config: modules, css, future, imports, components, $development, $production, ui, viewport, compatibilityDate\n- Runtime Modules: @nuxt/ui@3.0.0-beta.2, nuxt-viewport@2.2.0, @vueuse/nuxt@11.3.0, @nuxt/eslint@0.7.6\n- Build Modules: -\n------------------------------\n\n### Is this bug related to Nuxt or Vue?\n\nNuxt\n\n### Version\n\nv3.0.0.beta.2\n\n### Reproduction\n\nIve pulled the newest nuxtui version and now the project stops building.\n\ni don't know how this file gets there, but in Link.vue \n\n\n### Description\n\nWhen building the nuxt project this error comes (see Logs)\n\n\n\nI've figured out, that its a problem in the Link.vue file \n`node_modules/.pnpm/@nuxt+ui@3.0.0-beta.2_@babel+parser@7.26.9_change-case@5.4.4_db0@0.3.1_embla-carousel@8.5.2_i_q4qfx5ckzgjf4ev7civq7j4agu/node_modules/@nuxt/ui/dist/runtime/components/Link.vue`\n\n\nwhen i change the \nimport statement in Link.vue \n```\nimport { isEqual, diff } from 'ohash'\n``` \n\n\n```\nimport { isEqual, diff } from 'ohash\\utils'\n``` \n\nand the dependencies in pnpm.lock.yaml\nohash: '2.0.11'\n\n```\n\"@nuxt/ui@3.0.0-beta.2(@babel/parser@7.26.9)(change-case@5.4.4)(db0@0.3.1)(embla-carousel@8.5.2)(ioredis@5.6.0)(magicast@0.3.5)(typescript@5.8.2)(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.2))\":\n dependencies:\n (...)\n ohash: 2.0.11 (here i changed from 1.1.6 to 2.0.11)\n (...)\n transitivePeerDependencies:\n (...)\n ```\n\n### Additional context\n\n_No response_\n\n### Logs\n\n```shell-script\nError Logs\n\n[nitro 2:41:31 PM] ERROR RollupError: node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/Carousel-DXJvwjnI.js (11:18): \"diff\" is not exported by \"node_modules/.pnpm/ohash@2.0.11/node_modules/ohash/dist/index.mjs\", imported by \"node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/Carousel-DXJvwjnI.js\".\n\n\n 9: import { U as UAvatar } from \"./Avatar-CPvn681d.js\";\n10: import { _ as __nuxt_component_0 } from \"./nuxt-link-ax0sRQHE.js\";\n11: import { isEqual, diff } from \"ohash\";\n ^\n12: import { b as useRoute, e as _appConfig, d as useAppConfig } from \"../server.mjs\";\n13: import { t as tv } from \"./tv-DPOvteaS.js\";\n\n\n[2:41:31 PM] ERROR node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/Carousel-DXJvwjnI.js (11:18): \"diff\" is not exported by \"node_modules/.pnpm/ohash@2.0.11/node_modules/ohash/dist/index.mjs\", imported by \"node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/Carousel-DXJvwjnI.js\".\n\n at getRollupError (node_modules/.pnpm/rollup@4.34.9/node_modules/rollup/dist/es/shared/parseAst.js:397:41)\n at error (node_modules/.pnpm/rollup@4.34.9/node_modules/rollup/dist/es/shared/parseAst.js:393:42)\n at Module.error (node_modules/.pnpm/rollup@4.34.9/node_modules/rollup/dist/es/shared/node-entry.js:16603:16)\n at Module.traceVariable (node_modules/.pnpm/rollup@4.34.9/node_modules/rollup/dist/es/shared/node-entry.js:17052:29)\n at ModuleScope.findVariable (node_modules/.pnpm/rollup@4.34.9/node_modules/rollup/dist/es/shared/node-entry.js:14709:39)\n at ChildScope.findVariable (node_modules/.pnpm/rollup@4.34.9/node_modules/rollup/dist/es/shared/node-entry.js:5582:38)\n at FunctionScope.findVariable (node_modules/.pnpm/rollup@4.34.9/node_modules/rollup/dist/es/shared/node-entry.js:5582:38)\n at FunctionBodyScope.findVariable (node_modules/.pnpm/rollup@4.34.9/node_modules/rollup/dist/es/shared/node-entry.js:5582:38)\n at FunctionScope.findVariable (node_modules/.pnpm/rollup@4.34.9/node_modules/rollup/dist/es/shared/node-entry.js:5582:38)\n at FunctionBodyScope.findVariable (node_modules/.pnpm/rollup@4.34.9/node_modules/rollup/dist/es/shared/node-entry.js:5582:38)\n\n\n\n[2:41:31 PM] ERROR node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/Carousel-DXJvwjnI.js (11:18): \"diff\" is not exported by \"node_modules/.pnpm/ohash@2.0.11/node_modules/ohash/dist/index.mjs\", imported by \"node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/Carousel-DXJvwjnI.js\".\n\n ELIFECYCLE Command failed with exit code 1.\n```",[3190,3193],{"name":3191,"color":3192},"bug","d73a4a",{"name":3194,"color":3195},"v3","49DCB8",3470,"ui","Nuxt UI ohash error in Caroussel Component","2025-03-11T08:15:38Z","https://github.com/nuxt/ui/issues/3470",0.76142734,{"description":3203,"labels":3204,"number":3209,"owner":3141,"repository":3210,"state":3182,"title":3211,"updated_at":3212,"url":3213,"score":3214},"We upgraded a few weeks ago to Nuxt Fonts from [Nuxt Google Fonts](https://google-fonts.nuxtjs.org/) but noticed today our Google fonts are not served in Histoire:\r\n\r\n\r\n\r\n```\r\nFailed to decode downloaded font:\r\n\r\nhttp://localhost:6006/_fonts/RLpWK4fy6r6tOBEJg0IAKzqdFZVZxpMkXJMhnB9XjO1o90LEW8siGqWZ-w-hYuQIDRE3D.woff2\r\n```\r\n\r\nThe Network response is actually HTML, and the Histoire index page itself:\r\n\r\n```html\r\n\u003C!DOCTYPE html>\r\n\u003Chtml>\r\n \u003Chead>\r\n \u003Cscript type=\"module\" src=\"/@vite/client\">\u003C/script>\r\n\r\n \u003Ctitle>\u003C/title>\r\n \u003Clink rel=\"icon\" href=\"\"/>\r\n \u003Cmeta charset=\"utf-8\">\r\n \u003Cmeta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\r\n \u003Cmeta name=\"description\" content=\"\">\r\n \r\n \u003C/head>\r\n \u003Cbody>\r\n \u003Cdiv id=\"app\">\u003C/div>\r\n \u003Cscript type=\"module\" src=\"/@fs/Volumes/Data/Work/Clients/Forgd/forgd/node_modules/@histoire/app/dist/bundle-main.js\">\u003C/script>\r\n \u003C/body>\r\n\u003C/html>\r\n```\r\n\r\nThis is the change in requests from package to package:\r\n\r\n```\r\n// before, served from here:\r\nhttp://localhost:6006/node_modules/.cache/nuxt-google-fonts/fonts/Sora-300-12.woff2\r\n\r\n// after, server from here:\r\nhttp://localhost:6006/_fonts/aFTU7PB1QTsUX8KYthqQBK6PYK0-hqxt3dDpcK.woff2\r\n```\r\n\r\nThe only other special thing is that our project uses NX as a monorepo.\r\n\r\nAny ideas?",[3205,3206],{"name":3191,"color":3192},{"name":3207,"color":3208},"good first issue","7057ff",240,"fonts","Nuxt Fonts not loading in Histoire","2024-09-23T14:00:55Z","https://github.com/nuxt/fonts/issues/240",0.7674988,{"description":3216,"labels":3217,"number":3218,"owner":3141,"repository":3141,"state":3182,"title":3219,"updated_at":3220,"url":3221,"score":3222},"How can I use the local domain ? my site will not work, it cannot be reach if I add host, if I remove the host. I can access like this `http://localhost:3000/`. but how can I use the local domain ?\r\n\r\nex: mynuxt.local\r\n\r\n```\r\nexport default defineNuxtConfig({\r\n devtools: { enabled: false },\r\n modules: [\r\n '@pinia/nuxt',\r\n ],\r\n devServer: {\r\n host: 'mynuxt.local', \r\n port: 4000,\r\n https: true\r\n },\r\n})\r\n```\r\n\r\nThank you in advance",[],28064,"Nuxt 3 not working in docker container","2024-07-07T10:36:25Z","https://github.com/nuxt/nuxt/issues/28064",0.7752893,{"description":3224,"labels":3225,"number":3227,"owner":3141,"repository":3141,"state":3182,"title":3228,"updated_at":3229,"url":3230,"score":3231},"### Describe the feature\n\nHello, I'd like to support hostname based multi-tenancy in my nuxt3 app.\n\nEach tenant could choose a theme for their content.\n\n```\nGET localtest.com/ => render pages/=/one-column/\nGET dangerteam.com/some/path => render pages/=/two-column/some/path\nGET examples.com/hello => render pages/=/one-column/hello\n```\n\nThis way, one nuxt app can host different sites with each site having a \"theme\".\n\nBelow is a module that seems to do this using the nuxt-multi-tenancy module as an example.\nhttps://github.com/hieuhani/nuxt-multi-tenancy/blob/main/src/module.ts\n\nThe basic approach is to patch router.options.mjs at runtime on the app:templates hook.\n\nThe hook changes '...configRouterOptions,' to '...hostnameRouterOptions,' at runtime.\n\nhostnameRouterOptions is a filtered list of routes. \n\nThe seems ... fragile. I don't see another way to support this kind of themeing and multi-tenancy without modifying the routing table, and a new hook seems the best way to do it.\n\nAm i missing a simpler way to accomplish this? I tried a variety of other hooks, but couldn't modify the path to be rendered. I would prefer to set event.path = newPath in the 'request' hook, but it's read only.\n\nWhat is the way? Thank you\n\n// modules/hostname-routing.ts\n```\nimport { defineNuxtModule, addTemplate } from '@nuxt/kit';\n\nexport default defineNuxtModule({\n meta: {\n name: 'hostname-routing',\n configKey: 'hostnameRouting',\n },\n setup(_options, nuxt) {\n addTemplate({\n filename: 'hostname-router.options.mjs',\n getContents: () => `\n import { useRequestURL } from 'nuxt/app';\n\n // Async function to get base from hostname (hardcoded for testing)\n async function getBaseFromHostname(hostname) {\n const mappings = {\n 'localtest.localhost:3000': '=/one-column',\n 'dangerteam.localhost:3000': '=/two-column',\n 'examples.localhost:3000': '=/one-column',\n };\n // Simulate async lookup (e.g., future DB call)\n return Promise.resolve(mappings[hostname] || '=/one-column'); // Default to one-column\n }\n\n // Hardcode websiteId mappings for testing\n function getWebsiteId(hostname) {\n const websiteIds = {\n 'localtest.localhost:3000': 'site-001',\n 'dangerteam.localhost:3000': 'site-002',\n 'examples.localhost:3000': 'site-003',\n };\n return websiteIds[hostname] || 'site-default';\n }\n\n export default {\n routes: async (routes) => {\n const { hostname } = useRequestURL();\n const base = await getBaseFromHostname(hostname);\n const websiteId = getWebsiteId(hostname);\n console.log('Server: Hostname:', hostname, 'Base:', base, 'WebsiteId:', websiteId);\n\n // Filter routes: keep root, /base, and anything under /base/\n const tenantRoutes = routes.filter(route => {\n const path = route.path;\n path === '/' + base || path.startsWith('/' + base + '/');\n });\n\n // Rewrite paths and add websiteId to route meta\n return tenantRoutes.map(route => {\n const originalPath = route.path;\n const newPath = originalPath.replace('/' + base, '') || '/';\n console.log('Server: Kept route:', originalPath, '->', newPath);\n return {\n ...route,\n path: newPath,\n meta: { ...route.meta, websiteId }, // Add websiteId to route meta\n };\n });\n },\n };\n `,\n });\n\n nuxt.hook('app:templates', (app) => {\n const routerOptionsTemplate = app.templates.find(\n (t) => t.filename === 'router.options.mjs'\n );\n if (!routerOptionsTemplate || !routerOptionsTemplate.getContents) return;\n\n const originalGetContents = routerOptionsTemplate.getContents;\n routerOptionsTemplate.getContents = async (data) => {\n const content = await originalGetContents(data);\n const patchIndex = content.indexOf('...configRouterOptions,');\n if (patchIndex === -1) return content;\n\n const newPatchPosition = patchIndex + '...configRouterOptions,'.length;\n return [\n 'import hostnameRouterOptions from \"#build/hostname-router.options.mjs\";',\n content.slice(0, newPatchPosition),\n ` ...hostnameRouterOptions,${content.slice(newPatchPosition)}`,\n ].join('\\n');\n };\n });\n },\n});\n```\n\n### Additional information\n\n- [x] Would you be willing to help implement this feature?\n- [ ] Could this feature be implemented as a module?\n\n### Final checks\n\n- [x] Read the [contribution guide](https://nuxt.com/docs/community/contribution).\n- [x] Check existing [discussions](https://github.com/nuxt/nuxt/discussions) and [issues](https://github.com/nuxt/nuxt/issues).",[3226],{"name":3171,"color":3172},31284,"Support multi-tenancy routing","2025-03-16T16:51:15Z","https://github.com/nuxt/nuxt/issues/31284",0.77546895,{"description":3233,"labels":3234,"number":3240,"owner":3141,"repository":3241,"state":3182,"title":3242,"updated_at":3243,"url":3244,"score":3245},"\n",[3235,3237],{"name":3191,"color":3236},"ff281a",{"name":3238,"color":3239},"responsive","1cd1c6",643,"nuxt.com","[Project] Responsive `branches` and `files` modals","2023-02-15T12:32:41Z","https://github.com/nuxt/nuxt.com/issues/643",0.779309,["Reactive",3247],{},["Set"],["ShallowReactive",3250],{"$fTRc1wZytZ_XrK4EfJfei_Sz-An4H4Yy6syhVxH_PVJc":-1,"$f03SRDsY3lWCFTtwidlNy_peDtcypA2c7mDy9mbXrbW0":-1},"/nuxt/scripts/247"]