[{"data":1,"prerenderedAt":499},["ShallowReactive",2],{"blog-nuxt-3-seo-checklist":3},{"id":4,"title":5,"body":6,"date":487,"description":488,"extension":489,"meta":490,"navigation":491,"path":492,"seo":493,"stem":494,"tags":495,"__hash__":498},"blog\u002Fblog\u002Fnuxt-3-seo-checklist.md","A Nuxt 3 SEO Checklist for Developer Portfolios",{"type":7,"value":8,"toc":478},"minimark",[9,13,18,21,89,92,96,103,186,189,193,209,268,275,279,282,345,349,352,416,422,426,467,471,474],[10,11,12],"p",{},"A portfolio can look great and still be invisible to search engines. This is the checklist I use to make a Nuxt 3 site easy for Google to find, crawl and understand.",[14,15,17],"h2",{"id":16},"_1-render-real-html","1. Render real HTML",[10,19,20],{},"Search engines can run JavaScript, but server-rendered or prerendered HTML is indexed faster and more reliably. Nuxt does this by default. For a mostly static site, prerender your routes:",[22,23,28],"pre",{"className":24,"code":25,"language":26,"meta":27,"style":27},"language-ts shiki shiki-themes github-light github-dark","export default defineNuxtConfig({\n  nitro: {\n    prerender: { crawlLinks: true, routes: ['\u002F'] },\n  },\n})\n","ts","",[29,30,31,51,57,77,83],"code",{"__ignoreMap":27},[32,33,36,40,43,47],"span",{"class":34,"line":35},"line",1,[32,37,39],{"class":38},"szBVR","export",[32,41,42],{"class":38}," default",[32,44,46],{"class":45},"sScJk"," defineNuxtConfig",[32,48,50],{"class":49},"sVt8B","({\n",[32,52,54],{"class":34,"line":53},2,[32,55,56],{"class":49},"  nitro: {\n",[32,58,60,63,67,70,74],{"class":34,"line":59},3,[32,61,62],{"class":49},"    prerender: { crawlLinks: ",[32,64,66],{"class":65},"sj4cs","true",[32,68,69],{"class":49},", routes: [",[32,71,73],{"class":72},"sZZnC","'\u002F'",[32,75,76],{"class":49},"] },\n",[32,78,80],{"class":34,"line":79},4,[32,81,82],{"class":49},"  },\n",[32,84,86],{"class":34,"line":85},5,[32,87,88],{"class":49},"})\n",[10,90,91],{},"View the page source in your browser. If your headings and text are in the HTML, crawlers can read them.",[14,93,95],{"id":94},"_2-give-every-page-a-unique-title-and-description","2. Give every page a unique title and description",[10,97,98,99,102],{},"Use ",[29,100,101],{},"useSeoMeta"," in each page so no two pages share the same title or description:",[22,104,108],{"className":105,"code":106,"language":107,"meta":27,"style":27},"language-vue shiki shiki-themes github-light github-dark","\u003Cscript setup>\nuseSeoMeta({\n  title: 'My Page Title',\n  description: 'One or two sentences that describe this page.',\n  ogTitle: 'My Page Title',\n  ogDescription: 'One or two sentences that describe this page.',\n})\n\u003C\u002Fscript>\n","vue",[29,109,110,125,131,142,152,161,171,176],{"__ignoreMap":27},[32,111,112,115,119,122],{"class":34,"line":35},[32,113,114],{"class":49},"\u003C",[32,116,118],{"class":117},"s9eBZ","script",[32,120,121],{"class":45}," setup",[32,123,124],{"class":49},">\n",[32,126,127,129],{"class":34,"line":53},[32,128,101],{"class":45},[32,130,50],{"class":49},[32,132,133,136,139],{"class":34,"line":59},[32,134,135],{"class":49},"  title: ",[32,137,138],{"class":72},"'My Page Title'",[32,140,141],{"class":49},",\n",[32,143,144,147,150],{"class":34,"line":79},[32,145,146],{"class":49},"  description: ",[32,148,149],{"class":72},"'One or two sentences that describe this page.'",[32,151,141],{"class":49},[32,153,154,157,159],{"class":34,"line":85},[32,155,156],{"class":49},"  ogTitle: ",[32,158,138],{"class":72},[32,160,141],{"class":49},[32,162,164,167,169],{"class":34,"line":163},6,[32,165,166],{"class":49},"  ogDescription: ",[32,168,149],{"class":72},[32,170,141],{"class":49},[32,172,174],{"class":34,"line":173},7,[32,175,88],{"class":49},[32,177,179,182,184],{"class":34,"line":178},8,[32,180,181],{"class":49},"\u003C\u002F",[32,183,118],{"class":117},[32,185,124],{"class":49},[10,187,188],{},"Keep titles under about 60 characters and descriptions under about 160, or Google will truncate them.",[14,190,192],{"id":191},"_3-install-the-nuxt-seo-module","3. Install the Nuxt SEO module",[10,194,195,204,205,208],{},[196,197,201],"a",{"href":198,"rel":199},"https:\u002F\u002Fnuxtseo.com",[200],"nofollow",[29,202,203],{},"@nuxtjs\u002Fseo"," bundles a sitemap, robots.txt, canonical URLs and Schema.org helpers. Set your site URL once in ",[29,206,207],{},"nuxt.config.ts",":",[22,210,212],{"className":24,"code":211,"language":26,"meta":27,"style":27},"export default defineNuxtConfig({\n  modules: ['@nuxtjs\u002Fseo'],\n  site: {\n    url: 'https:\u002F\u002Fexample.com',\n    name: 'Your Name',\n  },\n})\n",[29,213,214,224,235,240,250,260,264],{"__ignoreMap":27},[32,215,216,218,220,222],{"class":34,"line":35},[32,217,39],{"class":38},[32,219,42],{"class":38},[32,221,46],{"class":45},[32,223,50],{"class":49},[32,225,226,229,232],{"class":34,"line":53},[32,227,228],{"class":49},"  modules: [",[32,230,231],{"class":72},"'@nuxtjs\u002Fseo'",[32,233,234],{"class":49},"],\n",[32,236,237],{"class":34,"line":59},[32,238,239],{"class":49},"  site: {\n",[32,241,242,245,248],{"class":34,"line":79},[32,243,244],{"class":49},"    url: ",[32,246,247],{"class":72},"'https:\u002F\u002Fexample.com'",[32,249,141],{"class":49},[32,251,252,255,258],{"class":34,"line":85},[32,253,254],{"class":49},"    name: ",[32,256,257],{"class":72},"'Your Name'",[32,259,141],{"class":49},[32,261,262],{"class":34,"line":163},[32,263,82],{"class":49},[32,265,266],{"class":34,"line":173},[32,267,88],{"class":49},[10,269,270,271,274],{},"The ",[29,272,273],{},"site.url"," value is used to build canonical URLs and sitemap entries, so it must match your production domain exactly.",[14,276,278],{"id":277},"_4-keep-preview-deployments-out-of-search-results","4. Keep preview deployments out of search results",[10,280,281],{},"If you deploy to Vercel, preview URLs can get indexed and compete with your real site. Only allow indexing in production:",[22,283,285],{"className":24,"code":284,"language":26,"meta":27,"style":27},"site: {\n  indexable: process.env.VERCEL_ENV\n    ? process.env.VERCEL_ENV === 'production'\n    : process.env.NODE_ENV === 'production',\n}\n",[29,286,287,295,306,323,340],{"__ignoreMap":27},[32,288,289,292],{"class":34,"line":35},[32,290,291],{"class":45},"site",[32,293,294],{"class":49},": {\n",[32,296,297,300,303],{"class":34,"line":53},[32,298,299],{"class":45},"  indexable",[32,301,302],{"class":49},": process.env.",[32,304,305],{"class":65},"VERCEL_ENV\n",[32,307,308,311,314,317,320],{"class":34,"line":59},[32,309,310],{"class":38},"    ?",[32,312,313],{"class":49}," process.env.",[32,315,316],{"class":65},"VERCEL_ENV",[32,318,319],{"class":38}," ===",[32,321,322],{"class":72}," 'production'\n",[32,324,325,328,330,333,335,338],{"class":34,"line":79},[32,326,327],{"class":38},"    :",[32,329,313],{"class":49},[32,331,332],{"class":65},"NODE_ENV",[32,334,319],{"class":38},[32,336,337],{"class":72}," 'production'",[32,339,141],{"class":49},[32,341,342],{"class":34,"line":85},[32,343,344],{"class":49},"}\n",[14,346,348],{"id":347},"_5-add-structured-data","5. Add structured data",[10,350,351],{},"Structured data helps Google connect your site to you as a person or organization. With the Nuxt SEO module you can describe yourself in a few lines:",[22,353,355],{"className":24,"code":354,"language":26,"meta":27,"style":27},"useSchemaOrg([\n  definePerson({\n    name: 'Your Name',\n    jobTitle: 'Frontend Developer',\n    sameAs: ['https:\u002F\u002Fgithub.com\u002Fyou', 'https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fyou\u002F'],\n  }),\n])\n",[29,356,357,365,372,380,390,406,411],{"__ignoreMap":27},[32,358,359,362],{"class":34,"line":35},[32,360,361],{"class":45},"useSchemaOrg",[32,363,364],{"class":49},"([\n",[32,366,367,370],{"class":34,"line":53},[32,368,369],{"class":45},"  definePerson",[32,371,50],{"class":49},[32,373,374,376,378],{"class":34,"line":59},[32,375,254],{"class":49},[32,377,257],{"class":72},[32,379,141],{"class":49},[32,381,382,385,388],{"class":34,"line":79},[32,383,384],{"class":49},"    jobTitle: ",[32,386,387],{"class":72},"'Frontend Developer'",[32,389,141],{"class":49},[32,391,392,395,398,401,404],{"class":34,"line":85},[32,393,394],{"class":49},"    sameAs: [",[32,396,397],{"class":72},"'https:\u002F\u002Fgithub.com\u002Fyou'",[32,399,400],{"class":49},", ",[32,402,403],{"class":72},"'https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fyou\u002F'",[32,405,234],{"class":49},[32,407,408],{"class":34,"line":163},[32,409,410],{"class":49},"  }),\n",[32,412,413],{"class":34,"line":173},[32,414,415],{"class":49},"])\n",[10,417,270,418,421],{},[29,419,420],{},"sameAs"," links tie your GitHub and LinkedIn profiles to your site.",[14,423,425],{"id":424},"_6-submit-your-site-to-search-console","6. Submit your site to Search Console",[427,428,429,439,451,460],"ol",{},[430,431,432,433,438],"li",{},"Add your domain as a property in ",[196,434,437],{"href":435,"rel":436},"https:\u002F\u002Fsearch.google.com\u002Fsearch-console",[200],"Google Search Console"," and verify it with a DNS record.",[430,440,441,442,445,446,450],{},"Submit ",[29,443,444],{},"\u002Fsitemap.xml"," under ",[447,448,449],"strong",{},"Sitemaps",".",[430,452,98,453,456,457,450],{},[447,454,455],{},"URL inspection"," on your homepage and click ",[447,458,459],{},"Request indexing",[430,461,462,463,466],{},"Check the ",[447,464,465],{},"Pages"," report to see why any page is not indexed.",[14,468,470],{"id":469},"_7-build-links-and-content","7. Build links and content",[10,472,473],{},"Technical SEO only makes a site eligible to rank. To actually rank, other sites need to link to you and you need pages worth ranking. Link to your site from your GitHub profile, LinkedIn and project READMEs, and publish pages that answer real questions, one topic per URL.",[475,476,477],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}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 .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":27,"searchDepth":53,"depth":53,"links":479},[480,481,482,483,484,485,486],{"id":16,"depth":53,"text":17},{"id":94,"depth":53,"text":95},{"id":191,"depth":53,"text":192},{"id":277,"depth":53,"text":278},{"id":347,"depth":53,"text":348},{"id":424,"depth":53,"text":425},{"id":469,"depth":53,"text":470},"2026-10-03","A practical checklist for getting a Nuxt 3 site indexed by Google, from robots and sitemaps to structured data and Search Console.","md",{},true,"\u002Fblog\u002Fnuxt-3-seo-checklist",{"title":5,"description":488},"blog\u002Fnuxt-3-seo-checklist",[496,497],"nuxt","seo","j5ZaKkkuFnOckZkrPn01OuzcKxGQr0ErIJUCmJqAu_I",1791287285133]