[{"data":1,"prerenderedAt":892},["ShallowReactive",2],{"navigation:en":3,"\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fblog:en":311},[4],{"title":5,"path":6,"stem":7,"children":8,"icon":10},"Nuxfire Docs","\u002Fdocs","docs\u002F0.index",[9,11,152],{"title":5,"path":6,"stem":7,"icon":10},"i-lucide-layout-grid",{"title":12,"path":13,"stem":14,"children":15,"icon":151},"SaaS Starter Kit","\u002Fdocs\u002Fsaas-starter-kit","docs\u002F1.saas-starter-kit\u002F0.index",[16,19,63,129],{"title":17,"path":13,"stem":14,"icon":18},"What is the SaaS Starter Kit?","i-lucide-info",{"title":20,"icon":21,"hide":22,"path":23,"stem":24,"children":25,"page":62},"Getting Started","i-lucide-play",true,"\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started","docs\u002F1.saas-starter-kit\u002F1.getting-started",[26,30,34,38,42,46,50,54,58],{"title":27,"path":28,"stem":29},"Quick Start","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fquick-start","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F0.quick-start",{"title":31,"path":32,"stem":33},"Installation","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Finstallation","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F1.installation",{"title":35,"path":36,"stem":37},"Cloudflare Access","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fcloudflare-access","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F2.cloudflare-access",{"title":39,"path":40,"stem":41},"Configuration","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fconfiguration","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F3.configuration",{"title":43,"path":44,"stem":45},"Secrets","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fsecrets","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F4.secrets",{"title":47,"path":48,"stem":49},"Environment Variables","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fenvironment-variables","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F5.environment-variables",{"title":51,"path":52,"stem":53},"Deploy","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fdeploy","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F6.deploy",{"title":55,"path":56,"stem":57},"Local Development","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Flocal-development","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F7.local-development",{"title":59,"path":60,"stem":61},"Project Structure","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fproject-structure","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F8.project-structure",false,{"title":64,"icon":65,"hide":22,"path":66,"stem":67,"children":68,"page":62},"Features","i-lucide-box","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures","docs\u002F1.saas-starter-kit\u002F2.features",[69,73,77,81,85,89,93,97,101,105,109,113,117,121,125],{"title":70,"path":71,"stem":72},"Authentication","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fauth","docs\u002F1.saas-starter-kit\u002F2.features\u002F1.auth",{"title":74,"path":75,"stem":76},"Rate Limiting","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Frate-limiting","docs\u002F1.saas-starter-kit\u002F2.features\u002F10.rate-limiting",{"title":78,"path":79,"stem":80},"WebSockets","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fwebsockets","docs\u002F1.saas-starter-kit\u002F2.features\u002F11.websockets",{"title":82,"path":83,"stem":84},"Blog","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fblog","docs\u002F1.saas-starter-kit\u002F2.features\u002F14.blog",{"title":86,"path":87,"stem":88},"Documentation","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fdocumentation","docs\u002F1.saas-starter-kit\u002F2.features\u002F15.documentation",{"title":90,"path":91,"stem":92},"Analytics","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fanalytics","docs\u002F1.saas-starter-kit\u002F2.features\u002F16.analytics",{"title":94,"path":95,"stem":96},"Platform Admin Console","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fplatform-admin","docs\u002F1.saas-starter-kit\u002F2.features\u002F17.platform-admin",{"title":98,"path":99,"stem":100},"Database","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fdatabase","docs\u002F1.saas-starter-kit\u002F2.features\u002F2.database",{"title":102,"path":103,"stem":104},"Payments & Billing","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fpayments","docs\u002F1.saas-starter-kit\u002F2.features\u002F3.payments",{"title":106,"path":107,"stem":108},"Emails","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Femails","docs\u002F1.saas-starter-kit\u002F2.features\u002F4.emails",{"title":110,"path":111,"stem":112},"Notifications","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fnotifications","docs\u002F1.saas-starter-kit\u002F2.features\u002F5.notifications",{"title":114,"path":115,"stem":116},"Role-Based Access Control","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Frbac","docs\u002F1.saas-starter-kit\u002F2.features\u002F6.rbac",{"title":118,"path":119,"stem":120},"Async Jobs","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fasync-jobs","docs\u002F1.saas-starter-kit\u002F2.features\u002F7.async-jobs",{"title":122,"path":123,"stem":124},"Storage","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fstorage","docs\u002F1.saas-starter-kit\u002F2.features\u002F8.storage",{"title":126,"path":127,"stem":128},"Internationalization","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Finternationalization","docs\u002F1.saas-starter-kit\u002F2.features\u002F9.internationalization",{"title":130,"icon":131,"path":132,"stem":133,"children":134,"page":62},"Concepts","i-lucide-graduation-cap","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts","docs\u002F1.saas-starter-kit\u002F3.concepts",[135,139,143,147],{"title":136,"path":137,"stem":138},"Technology Stack","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts\u002Ftech-stack","docs\u002F1.saas-starter-kit\u002F3.concepts\u002F0.tech-stack",{"title":140,"path":141,"stem":142},"SST.dev","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts\u002Fsst","docs\u002F1.saas-starter-kit\u002F3.concepts\u002F1.sst",{"title":144,"path":145,"stem":146},"NuxtHub","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts\u002Fnuxt-hub","docs\u002F1.saas-starter-kit\u002F3.concepts\u002F2.nuxt-hub",{"title":148,"path":149,"stem":150},"Design System & Branding","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts\u002Fdesign-system","docs\u002F1.saas-starter-kit\u002F3.concepts\u002F3.design-system","i-lucide-zap",{"title":153,"path":154,"stem":155,"children":156,"icon":159},"Fireskills","\u002Fdocs\u002Ffireskills","docs\u002F2.fireskills\u002F0.index",[157,160,219,249,275,293],{"title":158,"path":154,"stem":155,"icon":159},"What is Fireskills?","i-lucide-flame",{"title":20,"icon":21,"hide":22,"path":161,"stem":162,"children":163,"page":62},"\u002Fdocs\u002Ffireskills\u002Fgetting-started","docs\u002F2.fireskills\u002F1.getting-started",[164,167,171,175,179,183,187,191,195,199,203,207,211,215],{"title":27,"path":165,"stem":166},"\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fquick-start","docs\u002F2.fireskills\u002F1.getting-started\u002F00.quick-start",{"title":168,"path":169,"stem":170},"Workflow & Governance","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fworkflow","docs\u002F2.fireskills\u002F1.getting-started\u002F01.workflow",{"title":172,"path":173,"stem":174},"Project Context","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fproject-context","docs\u002F2.fireskills\u002F1.getting-started\u002F02.project-context",{"title":176,"path":177,"stem":178},"Step 0: Setup","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-setup","docs\u002F2.fireskills\u002F1.getting-started\u002F03.step-setup",{"title":180,"path":181,"stem":182},"Step 1: Inbox","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-inbox","docs\u002F2.fireskills\u002F1.getting-started\u002F04.step-inbox",{"title":184,"path":185,"stem":186},"Step 2: Backlog","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-backlog","docs\u002F2.fireskills\u002F1.getting-started\u002F05.step-backlog",{"title":188,"path":189,"stem":190},"Step 3: Specify","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-specify","docs\u002F2.fireskills\u002F1.getting-started\u002F06.step-specify",{"title":192,"path":193,"stem":194},"Step 4: Validate","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-validate","docs\u002F2.fireskills\u002F1.getting-started\u002F07.step-validate",{"title":196,"path":197,"stem":198},"Step 5: Tasks","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-tasks","docs\u002F2.fireskills\u002F1.getting-started\u002F08.step-tasks",{"title":200,"path":201,"stem":202},"Step 6: TDD\u002FBDD","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-tdd-bdd","docs\u002F2.fireskills\u002F1.getting-started\u002F09.step-tdd-bdd",{"title":204,"path":205,"stem":206},"Step 7: Implement","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-implement","docs\u002F2.fireskills\u002F1.getting-started\u002F10.step-implement",{"title":208,"path":209,"stem":210},"Step 8: Documentator","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-documentator","docs\u002F2.fireskills\u002F1.getting-started\u002F11.step-documentator",{"title":212,"path":213,"stem":214},"Late Changes","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Flate-changes","docs\u002F2.fireskills\u002F1.getting-started\u002F12.late-changes",{"title":216,"path":217,"stem":218},"Other Entry Points","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fother-entry-points","docs\u002F2.fireskills\u002F1.getting-started\u002F13.other-entry-points",{"title":220,"icon":221,"hide":22,"path":222,"stem":223,"children":224,"page":62},"Methodology","i-lucide-git-branch","\u002Fdocs\u002Ffireskills\u002Fmethodology","docs\u002F2.fireskills\u002F2.methodology",[225,229,233,237,241,245],{"title":226,"path":227,"stem":228},"The Three Acts","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Fthree-acts","docs\u002F2.fireskills\u002F2.methodology\u002F0.three-acts",{"title":230,"path":231,"stem":232},"The Three Gates","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Fthree-gates","docs\u002F2.fireskills\u002F2.methodology\u002F1.three-gates",{"title":234,"path":235,"stem":236},"The Canonical Spec","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Fcanonical-spec","docs\u002F2.fireskills\u002F2.methodology\u002F2.canonical-spec",{"title":238,"path":239,"stem":240},"Lifecycle States","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Flifecycle-states","docs\u002F2.fireskills\u002F2.methodology\u002F3.lifecycle-states",{"title":242,"path":243,"stem":244},"Effort Scale","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Feffort-scale","docs\u002F2.fireskills\u002F2.methodology\u002F4.effort-scale",{"title":246,"path":247,"stem":248},"Milestones & Governance","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Fgovernance-and-milestones","docs\u002F2.fireskills\u002F2.methodology\u002F5.governance-and-milestones",{"title":250,"icon":251,"hide":22,"path":252,"stem":253,"children":254,"page":62},"Skills","i-lucide-layers","\u002Fdocs\u002Ffireskills\u002Fskills","docs\u002F2.fireskills\u002F3.skills",[255,259,263,267,271],{"title":256,"path":257,"stem":258},"Catalog","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fcatalog","docs\u002F2.fireskills\u002F3.skills\u002F0.catalog",{"title":260,"path":261,"stem":262},"Act I: Define","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fact-1-define","docs\u002F2.fireskills\u002F3.skills\u002F1.act-1-define",{"title":264,"path":265,"stem":266},"Act II: Design & Prove","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fact-2-design-prove","docs\u002F2.fireskills\u002F3.skills\u002F2.act-2-design-prove",{"title":268,"path":269,"stem":270},"Act III: Deliver","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fact-3-deliver","docs\u002F2.fireskills\u002F3.skills\u002F3.act-3-deliver",{"title":272,"path":273,"stem":274},"Governance & Decisions","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fgovernance-and-decisions","docs\u002F2.fireskills\u002F3.skills\u002F4.governance-and-decisions",{"title":276,"icon":277,"hide":22,"path":278,"stem":279,"children":280,"page":62},"Specialists","i-lucide-sparkles","\u002Fdocs\u002Ffireskills\u002Fspecialists","docs\u002F2.fireskills\u002F4.specialists",[281,285,289],{"title":282,"path":283,"stem":284},"Overview","\u002Fdocs\u002Ffireskills\u002Fspecialists\u002Foverview","docs\u002F2.fireskills\u002F4.specialists\u002F0.overview",{"title":286,"path":287,"stem":288},"Nuxfire Stack","\u002Fdocs\u002Ffireskills\u002Fspecialists\u002Fnuxfire-stack","docs\u002F2.fireskills\u002F4.specialists\u002F1.nuxfire-stack",{"title":290,"path":291,"stem":292},"Engineering Specialists","\u002Fdocs\u002Ffireskills\u002Fspecialists\u002Fengineering-specialists","docs\u002F2.fireskills\u002F4.specialists\u002F2.engineering-specialists",{"title":294,"icon":295,"hide":22,"path":296,"stem":297,"children":298,"page":62},"CLI & Tooling","i-lucide-terminal","\u002Fdocs\u002Ffireskills\u002Fcli","docs\u002F2.fireskills\u002F5.cli",[299,303,307],{"title":300,"path":301,"stem":302},"CLI Overview","\u002Fdocs\u002Ffireskills\u002Fcli\u002Foverview","docs\u002F2.fireskills\u002F5.cli\u002F0.overview",{"title":304,"path":305,"stem":306},"Commands","\u002Fdocs\u002Ffireskills\u002Fcli\u002Fcommands","docs\u002F2.fireskills\u002F5.cli\u002F1.commands",{"title":308,"path":309,"stem":310},"Safety Scripts","\u002Fdocs\u002Ffireskills\u002Fcli\u002Fgovernance-scripts","docs\u002F2.fireskills\u002F5.cli\u002F2.governance-scripts",{"id":312,"title":82,"body":313,"description":887,"extension":888,"meta":889,"navigation":22,"path":83,"seo":890,"stem":84,"__hash__":891},"docs\u002Fdocs\u002F1.saas-starter-kit\u002F2.features\u002F14.blog.md",{"type":314,"value":315,"toc":879},"minimark",[316,328,333,371,375,386,444,447,451,707,710,716,741,751,755,766,786,797,801,804,846,869,875],[317,318,319,320,327],"p",{},"Nuxfire comes with a blog built with ",[321,322,326],"a",{"href":323,"rel":324},"https:\u002F\u002Fcontent.nuxt.com\u002F",[325],"nofollow","Nuxt Content",". Add markdown files to start publishing: the build validates every post and generates its search and social metadata.",[329,330,332],"h2",{"id":331},"whats-included","What's Included",[334,335,336,345,348,358,361,368],"ul",{},[337,338,339,340,344],"li",{},"Blog index and post pages, with one ",[341,342,343],"code",{},"\u003Ch1>"," per post",[337,346,347],{},"Site-wide search integration",[337,349,350,351,354,355],{},"Complete SEO per post: title, description, canonical, Open Graph and Twitter tags, ",[341,352,353],{},"BlogPosting"," structured data, language, hreflang and sitemap ",[341,356,357],{},"lastmod",[337,359,360],{},"Posts in several languages, linked as translations of each other",[337,362,363,364,367],{},"A ",[341,365,366],{},"bun run check:seo"," gate that catches regressions",[337,369,370],{},"Responsive design and dark mode support",[329,372,374],{"id":373},"file-structure","File Structure",[317,376,377,378,381,382,385],{},"Blog posts live in ",[341,379,380],{},"apps\u002Fweb\u002Fcontent\u002Fblog",", as their own Nuxt Content collection (",[341,383,384],{},"apps\u002Fweb\u002Fcontent.config.ts","). Each post is one markdown file whose frontmatter is validated at build time:",[387,388,393],"pre",{"className":389,"code":390,"language":391,"meta":392,"style":392},"language-yaml shiki shiki-themes material-theme-lighter github-light github-dark monokai","---\ntitle: \"Specific title without the brand\"\ndescription: \"One or two sentences that describe this post.\"\ndate: \"2026-09-25\"\nauthor: \"Your Name\"\nlang: en\nogImage: \"\u002Fimages\u002Fblog\u002Fmy-cover.png\"\n---\n","yaml","",[341,394,395,403,409,415,421,427,433,439],{"__ignoreMap":392},[396,397,400],"span",{"class":398,"line":399},"line",1,[396,401,402],{},"---\n",[396,404,406],{"class":398,"line":405},2,[396,407,408],{},"title: \"Specific title without the brand\"\n",[396,410,412],{"class":398,"line":411},3,[396,413,414],{},"description: \"One or two sentences that describe this post.\"\n",[396,416,418],{"class":398,"line":417},4,[396,419,420],{},"date: \"2026-09-25\"\n",[396,422,424],{"class":398,"line":423},5,[396,425,426],{},"author: \"Your Name\"\n",[396,428,430],{"class":398,"line":429},6,[396,431,432],{},"lang: en\n",[396,434,436],{"class":398,"line":435},7,[396,437,438],{},"ogImage: \"\u002Fimages\u002Fblog\u002Fmy-cover.png\"\n",[396,440,442],{"class":398,"line":441},8,[396,443,402],{},[445,446],"folder-tree",{"filter":380},[329,448,450],{"id":449},"frontmatter","Frontmatter",[452,453,454,470],"table",{},[455,456,457],"thead",{},[458,459,460,464,467],"tr",{},[461,462,463],"th",{},"Field",[461,465,466],{},"Required",[461,468,469],{},"Meaning",[471,472,473,490,502,517,540,552,574,603,622,637,652,672,684],"tbody",{},[458,474,475,481,484],{},[476,477,478],"td",{},[341,479,480],{},"title",[476,482,483],{},"Yes",[476,485,486,487,489],{},"The page title and the single ",[341,488,343],{},". The brand is appended for you: do not write it.",[458,491,492,497,499],{},[476,493,494],{},[341,495,496],{},"description",[476,498,483],{},[476,500,501],{},"Search and social description of this post, never the site default.",[458,503,504,509,511],{},[476,505,506],{},[341,507,508],{},"date",[476,510,483],{},[476,512,513,516],{},[341,514,515],{},"YYYY-MM-DD"," or an ISO 8601 datetime with a timezone. A date-only value means midnight UTC.",[458,518,519,524,527],{},[476,520,521],{},[341,522,523],{},"updated",[476,525,526],{},"No",[476,528,529,530,532,533,536,537,539],{},"Same format, not before ",[341,531,508],{},". Feeds ",[341,534,535],{},"article:modified_time"," and the sitemap ",[341,538,357],{},".",[458,541,542,547,549],{},[476,543,544],{},[341,545,546],{},"author",[476,548,483],{},[476,550,551],{},"The author name shown on the page and in the structured data.",[458,553,554,559,561],{},[476,555,556],{},[341,557,558],{},"authorType",[476,560,526],{},[476,562,563,566,567,570,571,573],{},[341,564,565],{},"Person"," or ",[341,568,569],{},"Organization"," (default ",[341,572,569],{},").",[458,575,576,581,583],{},[476,577,578],{},[341,579,580],{},"lang",[476,582,483],{},[476,584,585,588,589,566,592,595,596,588,599,602],{},[341,586,587],{},"en",", ",[341,590,591],{},"pt-br",[341,593,594],{},"es",". It has no default: it sets ",[341,597,598],{},"\u003Chtml lang>",[341,600,601],{},"og:locale"," and hreflang.",[458,604,605,610,612],{},[476,606,607],{},[341,608,609],{},"translations",[476,611,483],{},[476,613,614,615,588,617,619,620,539],{},"Language to slug of every version of the post, itself included: one for each of ",[341,616,587],{},[341,618,591],{}," and ",[341,621,594],{},[458,623,624,629,631],{},[476,625,626],{},[341,627,628],{},"category",[476,630,526],{},[476,632,633,634,539],{},"Shown on the card and used as ",[341,635,636],{},"article:section",[458,638,639,644,646],{},[476,640,641],{},[341,642,643],{},"readTime",[476,645,526],{},[476,647,648,649,539],{},"Shown on the card, for example ",[341,650,651],{},"8 min",[458,653,654,659,661],{},[476,655,656],{},[341,657,658],{},"tags",[476,660,526],{},[476,662,663,664,667,668,671],{},"Used as ",[341,665,666],{},"article:tag"," and as ",[341,669,670],{},"keywords"," in the structured data.",[458,673,674,679,681],{},[476,675,676],{},[341,677,678],{},"image",[476,680,526],{},[476,682,683],{},"The cover shown on the post page. It can be an SVG.",[458,685,686,691,693],{},[476,687,688],{},[341,689,690],{},"ogImage",[476,692,526],{},[476,694,695,696,566,699,702,703,706],{},"The image social networks read: a ",[341,697,698],{},".png",[341,700,701],{},".jpg"," path under ",[341,704,705],{},"apps\u002Fweb\u002Fpublic",". Falls back to the default site image.",[329,708,709],{"id":609},"Translations",[317,711,712,713,715],{},"Every post is written in all three languages, one file per language. Link the versions by repeating the same ",[341,714,609],{}," block in every one of them, with a key for each language; each key is the language of the post it points to:",[387,717,719],{"className":389,"code":718,"language":391,"meta":392,"style":392},"translations:\n  en: my-post-english-slug\n  pt-br: my-post-portuguese-slug\n  es: my-post-spanish-slug\n",[341,720,721,726,731,736],{"__ignoreMap":392},[396,722,723],{"class":398,"line":399},[396,724,725],{},"translations:\n",[396,727,728],{"class":398,"line":405},[396,729,730],{},"  en: my-post-english-slug\n",[396,732,733],{"class":398,"line":411},[396,734,735],{},"  pt-br: my-post-portuguese-slug\n",[396,737,738],{"class":398,"line":417},[396,739,740],{},"  es: my-post-spanish-slug\n",[317,742,743,744,747,748,750],{},"The blog index shows each post once, in the language the visitor is browsing in (English when that language has no version), and a post that was never translated stays visible in its own language. The head and the sitemap list every version reciprocally, with ",[341,745,746],{},"x-default"," pointing to the English one. ",[341,749,366],{}," fails if a version is missing, is written in another language or does not point back, and it rejects a post that does not list all three languages. Give each version its own cover when the image contains text.",[329,752,754],{"id":753},"cover-images","Cover images",[317,756,757,758,761,762,765],{},"Design the cover as a 16:9 SVG in ",[341,759,760],{},"apps\u002Fweb\u002Fpublic\u002Fimages\u002Fblog",", then render the PNG that social networks read. Facebook's sharing documentation lists JPEG, GIF and PNG for ",[341,763,764],{},"og:image","; SVG is not among them.",[387,767,771],{"className":768,"code":769,"language":770,"meta":392,"style":392},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark monokai","bun run generate:og\n","bash",[341,772,773],{"__ignoreMap":392},[396,774,775,779,783],{"class":398,"line":399},[396,776,778],{"class":777},"sR7ES","bun",[396,780,782],{"class":781},"sLACW"," run",[396,784,785],{"class":781}," generate:og\n",[317,787,788,789,792,793,796],{},"The command writes a 1200x675 PNG next to every SVG cover and next to the default site image (",[341,790,791],{},"apps\u002Fweb\u002Fpublic\u002Fimages\u002Fog\u002Fdefault.svg","), and running it twice changes nothing. It runs on your machine with ",[341,794,795],{},"sharp",", so open each PNG and commit it.",[329,798,800],{"id":799},"check-before-you-publish","Check Before You Publish",[317,802,803],{},"Build the site with its real address and run the gate against the generated pages:",[387,805,807],{"className":768,"code":806,"language":770,"meta":392,"style":392},"SITE_URL=https:\u002F\u002Fyour-domain bun run --cwd apps\u002Fweb build\nbun run check:seo\n",[341,808,809,837],{"__ignoreMap":392},[396,810,811,815,819,822,825,827,831,834],{"class":398,"line":399},[396,812,814],{"class":813},"ss--_","SITE_URL",[396,816,818],{"class":817},"sGXK2","=",[396,820,821],{"class":781},"https:\u002F\u002Fyour-domain",[396,823,824],{"class":777}," bun",[396,826,782],{"class":781},[396,828,830],{"class":829},"sFhLe"," --cwd",[396,832,833],{"class":781}," apps\u002Fweb",[396,835,836],{"class":781}," build\n",[396,838,839,841,843],{"class":398,"line":405},[396,840,778],{"class":777},[396,842,782],{"class":781},[396,844,845],{"class":781}," check:seo\n",[334,847,848,854,863],{},[337,849,850,851,853],{},"Every post has a language, valid dates, a raster ",[341,852,690],{}," that exists, and a consistent set of translations.",[337,855,856,857,859,860,862],{},"Every page has its own title and description, one ",[341,858,343],{},", an absolute canonical, a social image and, for posts, ",[341,861,353],{}," structured data in the right language.",[337,864,865,866,868],{},"The sitemap lists every post with ",[341,867,357],{}," and the same hreflang as the page head, and lists nothing that asks not to be indexed.",[317,870,871,872,539],{},"Without a build, the command still lints the frontmatter of every post and says that the page audit was skipped. To write posts with an AI agent, load the content specialist described in ",[321,873,874],{"href":287},"Nuxfire Stack Specialists",[876,877,878],"style",{},"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 .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html pre.shiki code .sR7ES, html code.shiki .sR7ES{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .sLACW, html code.shiki .sLACW{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .ss--_, html code.shiki .ss--_{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sGXK2, html code.shiki .sGXK2{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sFhLe, html code.shiki .sFhLe{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}",{"title":392,"searchDepth":405,"depth":405,"links":880},[881,882,883,884,885,886],{"id":331,"depth":405,"text":332},{"id":373,"depth":405,"text":374},{"id":449,"depth":405,"text":450},{"id":609,"depth":405,"text":709},{"id":753,"depth":405,"text":754},{"id":799,"depth":405,"text":800},"A blog built with Nuxt Content: one markdown file per post, a validated frontmatter contract, complete SEO metadata, translations and a regression gate.","md",{},{"title":82,"description":887},"KhZMCVDUDQaTsWtrLyTTn3_hqc90kdmYvQDqqiqK1-E",1790707485288]