[{"data":1,"prerenderedAt":1127},["ShallowReactive",2],{"docs-navigation:en":3,"blog-posts:en":242},[4,23,44,78,119,152,172,198,222],{"title":5,"id":6,"canonicalKey":7,"locale":8,"draft":9,"navigation":10,"icon":12,"sidebar":13,"path":14,"children":15},"Documentation","content:en:1.docs:1.getting-started:.navigation.yml","1","en",false,{"icon":11},"lucide:rocket","lucide:book-open","section","\u002Fdocs\u002Fgetting-started",[16],{"title":17,"id":18,"canonicalKey":19,"locale":8,"draft":9,"navigation":20,"icon":21,"path":22},"Installation","content:en:1.docs:1.getting-started:2.installation.md","1\u002F2",{"title":17,"icon":21},"lucide:download","\u002Fdocs\u002Fgetting-started\u002Finstallation",{"title":24,"page":9,"canonicalKey":25,"locale":8,"id":26,"draft":9,"icon":27,"sidebar":28,"children":29},"Concepts","2","content:en:1.docs:2.concepts:.navigation.yml","lucide:boxes","group",[30,37],{"title":31,"id":32,"canonicalKey":33,"locale":8,"draft":9,"navigation":34,"icon":35,"path":36},"How it works","content:en:1.docs:2.concepts:1.how-ginko-docs-works.md","2\u002F1",{"title":31,"icon":35},"lucide:workflow","\u002Fdocs\u002Fconcepts\u002Fhow-ginko-docs-works",{"title":38,"id":39,"canonicalKey":40,"locale":8,"draft":9,"navigation":41,"icon":42,"path":43},"Content and routes","content:en:1.docs:2.concepts:2.content-and-routes.md","2\u002F2",{"icon":42},"lucide:route","\u002Fdocs\u002Fconcepts\u002Fcontent-and-routes",{"title":45,"page":9,"canonicalKey":46,"locale":8,"id":47,"draft":9,"icon":48,"sidebar":28,"children":49},"Authoring","3","content:en:1.docs:3.authoring:.navigation.yml","lucide:pen-line",[50,57,64,71],{"title":51,"id":52,"canonicalKey":53,"locale":8,"draft":9,"navigation":54,"icon":55,"path":56},"Write content","content:en:1.docs:3.authoring:1.write-content.md","3\u002F1",{"title":51,"icon":55},"lucide:file-pen-line","\u002Fdocs\u002Fauthoring\u002Fwrite-content",{"title":58,"id":59,"canonicalKey":60,"locale":8,"draft":9,"navigation":61,"icon":62,"path":63},"Navigation","content:en:1.docs:3.authoring:2.navigation.md","3\u002F2",{"title":58,"icon":62},"lucide:panel-left","\u002Fdocs\u002Fauthoring\u002Fnavigation",{"title":65,"id":66,"canonicalKey":67,"locale":8,"draft":9,"navigation":68,"icon":69,"path":70},"Links","content:en:1.docs:3.authoring:3.links.md","3\u002F3",{"title":65,"icon":69},"lucide:link","\u002Fdocs\u002Fauthoring\u002Flinks",{"title":72,"id":73,"canonicalKey":74,"locale":8,"draft":9,"navigation":75,"icon":76,"path":77},"Use components","content:en:1.docs:3.authoring:4.use-components.md","3\u002F4",{"title":72,"icon":76},"lucide:blocks","\u002Fdocs\u002Fauthoring\u002Fuse-components",{"title":79,"page":9,"canonicalKey":80,"locale":8,"id":81,"draft":9,"icon":82,"sidebar":28,"children":83},"Features","4","content:en:1.docs:4.features:.navigation.yml","lucide:sparkles",[84,91,98,105,112],{"title":85,"id":86,"canonicalKey":87,"locale":8,"draft":9,"navigation":88,"icon":89,"path":90},"Localization","content:en:1.docs:4.features:1.localization.md","4\u002F1",{"title":85},"lucide:languages","\u002Fdocs\u002Ffeatures\u002Flocalization",{"title":92,"id":93,"canonicalKey":94,"locale":8,"draft":9,"navigation":95,"icon":96,"path":97},"Search","content:en:1.docs:4.features:2.search.md","4\u002F2",{"title":92},"lucide:search","\u002Fdocs\u002Ffeatures\u002Fsearch",{"title":99,"id":100,"canonicalKey":101,"locale":8,"draft":9,"navigation":102,"icon":103,"path":104},"Blog","content:en:1.docs:4.features:3.blog.md","4\u002F3",{"title":99},"lucide:newspaper","\u002Fdocs\u002Ffeatures\u002Fblog",{"title":106,"id":107,"canonicalKey":108,"locale":8,"draft":9,"navigation":109,"icon":110,"path":111},"SEO and social cards","content:en:1.docs:4.features:4.seo-and-social-cards.md","4\u002F4",{"title":106},"lucide:globe-2","\u002Fdocs\u002Ffeatures\u002Fseo-and-social-cards",{"title":113,"id":114,"canonicalKey":115,"locale":8,"draft":9,"navigation":116,"icon":117,"path":118},"Agent-readable output","content:en:1.docs:4.features:5.agent-readable-output.md","4\u002F5",{"title":113},"lucide:bot","\u002Fdocs\u002Ffeatures\u002Fagent-readable-output",{"title":120,"page":9,"canonicalKey":121,"locale":8,"id":122,"draft":9,"icon":123,"sidebar":28,"children":124},"Customization","5","content:en:1.docs:5.customization:.navigation.yml","lucide:paintbrush",[125,132,139,146],{"title":126,"id":127,"canonicalKey":128,"locale":8,"draft":9,"navigation":129,"icon":130,"path":131},"Site configuration","content:en:1.docs:5.customization:1.site-configuration.md","5\u002F1",{"title":126},"lucide:settings-2","\u002Fdocs\u002Fcustomization\u002Fsite-configuration",{"title":133,"id":134,"canonicalKey":135,"locale":8,"draft":9,"navigation":136,"icon":137,"path":138},"Landing page","content:en:1.docs:5.customization:2.landing-page.md","5\u002F2",{"title":133},"lucide:layout-template","\u002Fdocs\u002Fcustomization\u002Flanding-page",{"title":140,"id":141,"canonicalKey":142,"locale":8,"draft":9,"navigation":143,"icon":144,"path":145},"Theming and overrides","content:en:1.docs:5.customization:3.theming-and-overrides.md","5\u002F3",{"title":140},"lucide:palette","\u002Fdocs\u002Fcustomization\u002Ftheming-and-overrides",{"title":147,"id":148,"canonicalKey":149,"locale":8,"draft":9,"navigation":150,"icon":76,"path":151},"Custom components","content:en:1.docs:5.customization:4.custom-components.md","5\u002F4",{"title":147},"\u002Fdocs\u002Fcustomization\u002Fcustom-components",{"title":153,"page":9,"canonicalKey":154,"locale":8,"id":155,"draft":9,"icon":156,"sidebar":28,"children":157},"Operations","6","content:en:1.docs:6.operations:.navigation.yml","lucide:cloud-cog",[158,165],{"title":159,"id":160,"canonicalKey":161,"locale":8,"draft":9,"navigation":162,"icon":163,"path":164},"Deployment","content:en:1.docs:6.operations:1.deployment.md","6\u002F1",{"title":159,"icon":163},"lucide:cloud-upload","\u002Fdocs\u002Foperations\u002Fdeployment",{"title":166,"id":167,"canonicalKey":168,"locale":8,"draft":9,"navigation":169,"icon":170,"path":171},"Troubleshooting","content:en:1.docs:6.operations:2.troubleshooting.md","6\u002F2",{"title":166,"icon":170},"lucide:wrench","\u002Fdocs\u002Foperations\u002Ftroubleshooting",{"title":173,"page":9,"canonicalKey":174,"locale":8,"id":175,"draft":9,"icon":176,"sidebar":13,"children":177},"Reference","7","content:en:1.docs:7.reference:.navigation.yml","lucide:braces",[178,185,191],{"title":179,"id":180,"canonicalKey":181,"locale":8,"draft":9,"navigation":182,"icon":183,"path":184},"Content configuration","content:en:1.docs:7.reference:1.content-config.md","7\u002F1",{"title":179,"icon":183},"lucide:database","\u002Fdocs\u002Freference\u002Fcontent-config",{"title":186,"id":187,"canonicalKey":188,"locale":8,"draft":9,"navigation":189,"icon":130,"path":190},"App configuration","content:en:1.docs:7.reference:2.app-config.md","7\u002F2",{"title":186,"icon":130},"\u002Fdocs\u002Freference\u002Fapp-config",{"title":192,"id":193,"canonicalKey":194,"locale":8,"draft":9,"navigation":195,"icon":196,"path":197},"Frontmatter and schemas","content:en:1.docs:7.reference:3.frontmatter.md","7\u002F3",{"title":192,"icon":196},"lucide:file-json-2","\u002Fdocs\u002Freference\u002Ffrontmatter",{"title":199,"page":9,"canonicalKey":200,"locale":8,"id":201,"draft":9,"icon":76,"sidebar":28,"children":202},"Components","8","content:en:1.docs:8.components:.navigation.yml",[203,209,216],{"title":204,"id":205,"canonicalKey":206,"locale":8,"draft":9,"navigation":207,"icon":76,"path":208},"MDC components","content:en:1.docs:8.components:1.mdc-components.md","8\u002F1",{"title":204,"icon":76},"\u002Fdocs\u002Fcomponents\u002Fmdc-components",{"title":210,"id":211,"canonicalKey":212,"locale":8,"draft":9,"navigation":213,"icon":214,"path":215},"API reference panels","content:en:1.docs:8.components:2.api-reference.md","8\u002F2",{"title":210,"icon":214},"lucide:table-properties","\u002Fdocs\u002Fcomponents\u002Fapi-reference",{"title":217,"id":218,"canonicalKey":219,"locale":8,"draft":9,"navigation":220,"icon":76,"path":221},"Component showcase","content:en:1.docs:8.components:3.component-showcase.md","8\u002F3",{"title":217,"icon":76},"\u002Fdocs\u002Fcomponents\u002Fcomponent-showcase",{"title":223,"page":9,"canonicalKey":224,"locale":8,"id":225,"draft":9,"icon":226,"sidebar":28,"children":227},"Resources","9","content:en:1.docs:9.resources:.navigation.yml","lucide:library",[228,235],{"title":229,"id":230,"canonicalKey":231,"locale":8,"draft":9,"navigation":232,"icon":233,"path":234},"Public exports","content:en:1.docs:9.resources:1.public-exports.md","9\u002F1",{"title":229,"icon":233},"lucide:package-open","\u002Fdocs\u002Fresources\u002Fpublic-exports",{"title":236,"id":237,"canonicalKey":238,"locale":8,"draft":9,"navigation":239,"icon":240,"path":241},"Requirements and upgrades","content:en:1.docs:9.resources:2.requirements-and-upgrades.md","9\u002F2",{"title":236,"icon":240},"lucide:refresh-cw","\u002Fdocs\u002Fresources\u002Frequirements-and-upgrades",[243,455,674,825],{"title":244,"description":245,"badge":246,"date":247,"readingTime":248,"author":249,"body":275,"type":437,"id":438,"canonicalKey":80,"draft":9,"partial":9,"locale":8,"collection":439,"navigationFile":9,"file":440,"sitemap":444,"route":446,"resolution":452},"Use images without breaking the reading flow","Choose Markdown images, figures, dimensions, captions, and bleed from the image's role in the article.","Images","2026-06-02","6 min read",{"slug":250,"name":251,"role":252,"bio":253,"avatar":254,"id":255,"type":256,"title":251,"canonicalKey":257,"draft":9,"partial":9,"locale":8,"collection":258,"navigationFile":9,"file":259,"body":263,"route":264,"resolution":272},"ginko-docs-team","Ginko Docs Team","Documentation engineering","Maintainers of the Ginko Docs Nuxt layer and its bilingual reference site.","\u002Ffavicon.svg","content:en:authors:ginko-docs-team.json","json","authors\u002Fginko-docs-team","authors",{"source":260,"path":261,"stem":262,"dir":258,"extension":256},"content","en\u002Fauthors\u002Fginko-docs-team.json","en\u002Fauthors\u002Fginko-docs-team",null,{"resolvedPath":265,"alternates":266},"\u002Fauthors\u002Fginko-docs-team",[267,269],{"locale":8,"path":265,"source":268},"variant",{"locale":270,"path":271,"source":268},"de","\u002Fde\u002Fauthors\u002Fginko-docs-team",{"requested":273,"resolved":274,"usedFallback":9},{"locale":8},{"locale":8},{"type":276,"children":277,"toc":428},"root",[278,286,299,306,311,320,325,331,336,345,377,383,388,396,401,407,412,417],{"type":279,"tag":280,"props":281,"children":282},"element","p",{},[283],{"type":284,"value":285},"text","An image earns its place in documentation when it explains a state, sequence, relationship, or result faster than prose. Its presentation should follow that job. A screenshot that supports one sentence needs a different treatment from a diagram readers must inspect closely.",{"type":279,"tag":280,"props":287,"children":288},{},[289,291,297],{"type":284,"value":290},"Ginko Docs renders ordinary Markdown images through Nuxt Image and can add click-to-zoom behavior. The ",{"type":279,"tag":292,"props":293,"children":294},"code",{},[295],{"type":284,"value":296},"figure",{"type":284,"value":298}," component adds explicit dimensions, a caption, aspect-ratio control, and optional bleed without requiring a page-specific Vue template.",{"type":279,"tag":300,"props":301,"children":303},"h2",{"id":302},"use-markdown-for-an-image-in-the-reading-flow",[304],{"type":284,"value":305},"Use Markdown for an image in the reading flow",{"type":279,"tag":280,"props":307,"children":308},{},[309],{"type":284,"value":310},"Use standard image syntax when the surrounding paragraph already supplies the context and the image does not need a caption.",{"type":279,"tag":280,"props":312,"children":313},{},[314],{"type":279,"tag":315,"props":316,"children":319},"img",{"src":317,"alt":318},"\u002Fimages\u002Fcontent-demo-workspace.jpg","Bright workspace prepared for an editorial planning session",[],{"type":279,"tag":280,"props":321,"children":322},{},[323],{"type":284,"value":324},"Write alt text for the information a reader needs from the image. Do not repeat “image of” or use the filename. If the image is decorative and carries no information, use empty alt text rather than inventing a description.",{"type":279,"tag":300,"props":326,"children":328},{"id":327},"use-a-figure-for-a-caption-and-stable-geometry",[329],{"type":284,"value":330},"Use a figure for a caption and stable geometry",{"type":279,"tag":280,"props":332,"children":333},{},[334],{"type":284,"value":335},"Add a figure when the caption contributes meaning or when you need explicit dimensions to prevent layout shift.",{"type":279,"tag":296,"props":337,"children":344},{"src":338,"alt":339,"caption":340,"width":341,"height":342,"aspect":343},"\u002Fimages\u002Fcontent-demo-detail.png","Detailed planning material arranged for a website content session","A caption can identify the state or decision the reader should notice.","1200","800","video",[],{"type":279,"tag":280,"props":346,"children":347},{},[348,350,355,357,362,364,369,370,375],{"type":284,"value":349},"The ",{"type":279,"tag":292,"props":351,"children":352},{},[353],{"type":284,"value":354},"width",{"type":284,"value":356}," and ",{"type":279,"tag":292,"props":358,"children":359},{},[360],{"type":284,"value":361},"height",{"type":284,"value":363}," props describe the source image. They let the browser reserve the correct space before the file loads. The ",{"type":279,"tag":292,"props":365,"children":366},{},[367],{"type":284,"value":368},"aspect",{"type":284,"value":356},{"type":279,"tag":292,"props":371,"children":372},{},[373],{"type":284,"value":374},"fit",{"type":284,"value":376}," props control presentation; they should not compensate for an incorrectly cropped source asset.",{"type":279,"tag":300,"props":378,"children":380},{"id":379},"reserve-bleed-for-important-detail",[381],{"type":284,"value":382},"Reserve bleed for important detail",{"type":279,"tag":280,"props":384,"children":385},{},[386],{"type":284,"value":387},"A wider figure can help with dense diagrams, comparison screenshots, or editorial photography that loses useful detail inside the text measure.",{"type":279,"tag":296,"props":389,"children":395},{"src":390,"alt":391,"caption":392,"width":341,"height":393,"bleed":394,"aspect":343},"\u002Fimages\u002Fcontent-demo-workshop.jpg","Workshop table with notes for a multilingual documentation launch","A controlled bleed adds inspection space on wide screens while returning to the content width on mobile.","900","outside",[],{"type":279,"tag":280,"props":397,"children":398},{},[399],{"type":284,"value":400},"Do not use bleed as decoration on every page. Repeated width changes interrupt scanning and make ordinary screenshots look more important than the instructions around them.",{"type":279,"tag":300,"props":402,"children":404},{"id":403},"keep-text-and-media-in-sync",[405],{"type":284,"value":406},"Keep text and media in sync",{"type":279,"tag":280,"props":408,"children":409},{},[410],{"type":284,"value":411},"Place an image after the sentence that introduces it. Explain the conclusion in text as well; a screenshot should not be the only place a required value or error message appears. Update screenshots when labels, routes, or defaults change.",{"type":279,"tag":280,"props":413,"children":414},{},[415],{"type":284,"value":416},"For zoomable images, make sure the reduced view still exposes the main subject and the original asset is sharp enough to inspect. A larger blurred screenshot does not become more useful when opened in a dialog.",{"type":279,"tag":280,"props":418,"children":419},{},[420,422,426],{"type":284,"value":421},"The final asset should have a stable public path, meaningful alt text, intrinsic dimensions when using ",{"type":279,"tag":292,"props":423,"children":424},{},[425],{"type":284,"value":296},{"type":284,"value":427},", and a caption only when the caption adds information not already present in the paragraph.",{"title":429,"searchDepth":430,"depth":430,"links":431},"",4,[432,434,435,436],{"id":302,"depth":433,"text":305},2,{"id":327,"depth":433,"text":330},{"id":379,"depth":433,"text":382},{"id":403,"depth":433,"text":406},"markdown","content:en:2.blog:4.editorial-image-systems.md","blog",{"source":260,"path":441,"stem":442,"dir":439,"extension":443},"en\u002F2.blog\u002F4.editorial-image-systems.md","en\u002F2.blog\u002F4.editorial-image-systems","md",{"lastmod":445},"2026-06-02T00:00:00.000Z",{"resolvedPath":447,"alternates":448},"\u002Fblog\u002Feditorial-image-systems",[449,450],{"locale":8,"path":447,"source":268},{"locale":270,"path":451,"source":268},"\u002Fde\u002Fblog\u002Fredaktionelle-bildstrecken",{"requested":453,"resolved":454,"usedFallback":9},{"locale":8},{"locale":8},{"title":456,"description":457,"badge":458,"date":459,"readingTime":248,"author":249,"body":460,"type":437,"id":658,"canonicalKey":46,"draft":9,"partial":9,"locale":8,"collection":439,"navigationFile":9,"file":659,"sitemap":662,"resolvedRefs":664,"route":665,"resolution":671},"Publish documentation for humans and agents","Serve rendered pages and machine-readable Markdown from one canonical content source.","Agents","2026-05-27",{"type":276,"children":461,"toc":652},[462,467,472,478,511,539,544,550,567,572,578,611,616,622,627,639],{"type":279,"tag":280,"props":463,"children":464},{},[465],{"type":284,"value":466},"Agent-readable documentation should not be a second, shortened copy of the site. Separate content pipelines drift: a corrected example reaches the rendered page while an old answer remains in a generated prompt file or private index.",{"type":279,"tag":280,"props":468,"children":469},{},[470],{"type":284,"value":471},"Ginko Docs starts from one document model and projects it into several representations. Readers get the full Nuxt page. Search gets normalized records. Static deployments receive raw Markdown and catalogs. Server deployments can add request-time negotiation and MCP tools.",{"type":279,"tag":300,"props":473,"children":475},{"id":474},"keep-explicit-markdown-urls",[476],{"type":284,"value":477},"Keep explicit Markdown URLs",{"type":279,"tag":280,"props":479,"children":480},{},[481,483,488,490,495,497,502,504,509],{"type":284,"value":482},"Every public content route has an explicit raw counterpart under ",{"type":279,"tag":292,"props":484,"children":485},{},[486],{"type":284,"value":487},"\u002Fraw",{"type":284,"value":489}," with a ",{"type":279,"tag":292,"props":491,"children":492},{},[493],{"type":284,"value":494},".md",{"type":284,"value":496}," suffix. A link to that file works on a static host, in ",{"type":279,"tag":292,"props":498,"children":499},{},[500],{"type":284,"value":501},"curl",{"type":284,"value":503},", and in tools that cannot send custom ",{"type":279,"tag":292,"props":505,"children":506},{},[507],{"type":284,"value":508},"Accept",{"type":284,"value":510}," headers.",{"type":279,"tag":512,"props":513,"children":517},"pre",{"language":514,"filename":515,"class":516},"bash","Terminal","shiki shiki-themes light-plus dark-plus dark:dark-plus",[518],{"type":279,"tag":292,"props":519,"children":521},{"class":520},"language-bash",[522],{"type":279,"tag":523,"props":524,"children":527},"span",{"class":525,"style":526},"line","display: inline",[528,533],{"type":279,"tag":523,"props":529,"children":531},{"style":530},"color:#795E26;--shiki-dark:#DCDCAA",[532],{"type":284,"value":501},{"type":279,"tag":523,"props":534,"children":536},{"style":535},"color:#A31515;--shiki-dark:#CE9178",[537],{"type":284,"value":538}," https:\u002F\u002Fdocs.example.com\u002Fraw\u002Fdocs\u002Fgetting-started.md",{"type":279,"tag":280,"props":540,"children":541},{},[542],{"type":284,"value":543},"This is the most portable agent interface because it behaves like an ordinary generated file.",{"type":279,"tag":300,"props":545,"children":547},{"id":546},"use-catalogs-for-discovery",[548],{"type":284,"value":549},"Use catalogs for discovery",{"type":279,"tag":280,"props":551,"children":552},{},[553,558,560,565],{"type":279,"tag":292,"props":554,"children":555},{},[556],{"type":284,"value":557},"\u002Fllms.txt",{"type":284,"value":559}," provides a compact list of available pages. ",{"type":279,"tag":292,"props":561,"children":562},{},[563],{"type":284,"value":564},"\u002Fllms-full.txt",{"type":284,"value":566}," combines the public corpus for clients that prefer one larger context. Localized sites also generate locale-specific catalogs.",{"type":279,"tag":280,"props":568,"children":569},{},[570],{"type":284,"value":571},"Catalogs solve discovery, not ranking or authorization. Keep private documentation out of the public collection instead of expecting an LLM catalog to enforce access control.",{"type":279,"tag":300,"props":573,"children":575},{"id":574},"add-runtime-interfaces-deliberately",[576],{"type":284,"value":577},"Add runtime interfaces deliberately",{"type":279,"tag":280,"props":579,"children":580},{},[581,583,588,590,595,597,602,604,609],{"type":284,"value":582},"A Nitro server can return Markdown from a normal page URL when the request sends ",{"type":279,"tag":292,"props":584,"children":585},{},[586],{"type":284,"value":587},"Accept: text\u002Fmarkdown",{"type":284,"value":589},". It can also expose ",{"type":279,"tag":292,"props":591,"children":592},{},[593],{"type":284,"value":594},"\u002Fmcp",{"type":284,"value":596},", where ",{"type":279,"tag":292,"props":598,"children":599},{},[600],{"type":284,"value":601},"list-pages",{"type":284,"value":603}," returns the default catalog and ",{"type":279,"tag":292,"props":605,"children":606},{},[607],{"type":284,"value":608},"get-page",{"type":284,"value":610}," reads the raw Markdown for an explicit public path.",{"type":279,"tag":280,"props":612,"children":613},{},[614],{"type":284,"value":615},"These features require server code. A static host still has the explicit raw routes and catalogs but cannot negotiate responses or execute MCP tools.",{"type":279,"tag":300,"props":617,"children":619},{"id":618},"preserve-meaning-in-custom-components",[620],{"type":284,"value":621},"Preserve meaning in custom components",{"type":279,"tag":280,"props":623,"children":624},{},[625],{"type":284,"value":626},"Standard Markdown converts naturally. A custom component may need more care. Ginko Docs registers safe default serializers for its built-in tags, producing an XML-style component representation with static props and rendered children.",{"type":279,"tag":280,"props":628,"children":629},{},[630,632,637],{"type":284,"value":631},"When a component represents something semantic that should read differently—an API explorer, benchmark, or product state—register a serializer through ",{"type":279,"tag":292,"props":633,"children":634},{},[635],{"type":284,"value":636},"@lupinum\u002Fginko-content\u002Fagent-registry",{"type":284,"value":638},". Keep the serializer beside the component contract so visual and machine-readable changes are reviewed together.",{"type":279,"tag":280,"props":640,"children":641},{},[642,643,650],{"type":284,"value":349},{"type":279,"tag":644,"props":645,"children":647},"a",{"href":646},"$docs\u002Ffeatures\u002Fagent-readable-output",[648],{"type":284,"value":649},"agent-readable output guide",{"type":284,"value":651}," includes the deployment matrix and configuration boundaries. Check the rendered page, raw route, and catalog entry after changing a component that carries meaning; all three should describe the same fact.",{"title":429,"searchDepth":430,"depth":430,"links":653},[654,655,656,657],{"id":474,"depth":433,"text":477},{"id":546,"depth":433,"text":549},{"id":574,"depth":433,"text":577},{"id":618,"depth":433,"text":621},"content:en:2.blog:3.prerender-seo-search.md",{"source":260,"path":660,"stem":661,"dir":439,"extension":443},"en\u002F2.blog\u002F3.prerender-seo-search.md","en\u002F2.blog\u002F3.prerender-seo-search",{"lastmod":663},"2026-05-27T00:00:00.000Z",{"$docs\u002Ffeatures\u002Fagent-readable-output":118},{"resolvedPath":666,"alternates":667},"\u002Fblog\u002Fprerender-seo-search",[668,669],{"locale":8,"path":666,"source":268},{"locale":270,"path":670,"source":268},"\u002Fde\u002Fblog\u002Fprerender-seo-suche",{"requested":672,"resolved":673,"usedFallback":9},{"locale":8},{"locale":8},{"title":675,"description":676,"badge":677,"date":678,"readingTime":679,"author":249,"body":680,"type":437,"id":809,"canonicalKey":25,"draft":9,"partial":9,"locale":8,"collection":439,"navigationFile":9,"file":810,"sitemap":813,"resolvedRefs":815,"route":816,"resolution":822},"Design documentation navigation that scales","Use sections, groups, and page order to keep a growing sidebar predictable.","Information architecture","2026-05-20","5 min read",{"type":276,"children":681,"toc":803},[682,687,692,698,703,708,714,733,738,754,759,765,770,775,781,786,791],{"type":279,"tag":280,"props":683,"children":684},{},[685],{"type":284,"value":686},"Readers use a documentation sidebar to answer three questions: Where am I? What sits beside this page? Where should I look for a different kind of answer? A useful structure makes those answers visible without turning every folder into a control.",{"type":279,"tag":280,"props":688,"children":689},{},[690],{"type":284,"value":691},"Ginko Docs derives the sidebar from the content tree. That keeps file order, public routes, breadcrumbs, previous and next links, and search navigation aligned. The design work therefore happens in the content structure, not in a second frontend menu.",{"type":279,"tag":300,"props":693,"children":695},{"id":694},"start-with-reader-intent",[696],{"type":284,"value":697},"Start with reader intent",{"type":279,"tag":280,"props":699,"children":700},{},[701],{"type":284,"value":702},"Separate pages that teach from pages that list. A quickstart should lead to a working result. A guide should complete one task. A reference page should describe one public surface exhaustively.",{"type":279,"tag":280,"props":704,"children":705},{},[706],{"type":284,"value":707},"When these page types share an undifferentiated list, readers cannot tell whether a link will teach a workflow or present an option table. Broad sections such as Documentation and Reference provide that first decision. Local groups such as Authoring, Features, or Components make the next decision smaller.",{"type":279,"tag":300,"props":709,"children":711},{"id":710},"give-each-level-one-job",[712],{"type":284,"value":713},"Give each level one job",{"type":279,"tag":280,"props":715,"children":716},{},[717,719,724,726,731],{"type":284,"value":718},"Use ",{"type":279,"tag":292,"props":720,"children":721},{},[722],{"type":284,"value":723},"sidebar: section",{"type":284,"value":725}," for the major areas shown by the section switcher. Use ",{"type":279,"tag":292,"props":727,"children":728},{},[729],{"type":284,"value":730},"sidebar: group",{"type":284,"value":732}," for a visible heading within the current section. Leave an ordinary folder unmarked only when its children form a real nested topic that readers should expand and collapse.",{"type":279,"tag":280,"props":734,"children":735},{},[736],{"type":284,"value":737},"Keep the common path shallow:",{"type":279,"tag":512,"props":739,"children":741},{"language":284,"filename":740,"class":516},"Navigation depth",[742],{"type":279,"tag":292,"props":743,"children":745},{"class":744},"language-text",[746],{"type":279,"tag":523,"props":747,"children":748},{"class":525,"style":526},[749],{"type":279,"tag":523,"props":750,"children":751},{},[752],{"type":284,"value":753},"section → group → page",{"type":279,"tag":280,"props":755,"children":756},{},[757],{"type":284,"value":758},"A fourth level can be useful for genuine variants, such as separate Nuxt and Vue installation instructions. It should not exist only because the source files were convenient to store in another folder.",{"type":279,"tag":300,"props":760,"children":762},{"id":761},"make-index-pages-earn-their-route",[763],{"type":284,"value":764},"Make index pages earn their route",{"type":279,"tag":280,"props":766,"children":767},{},[768],{"type":284,"value":769},"An index page is useful when it orients the reader, defines a concept shared by its children, or helps someone choose among several paths. An index page that only lists the same links already visible in the sidebar adds another stop without adding information.",{"type":279,"tag":280,"props":771,"children":772},{},[773],{"type":284,"value":774},"Structural groups do not need an index page. The sidebar can show the label while the section switcher resolves to the first real page.",{"type":279,"tag":300,"props":776,"children":778},{"id":777},"design-desktop-and-mobile-together",[779],{"type":284,"value":780},"Design desktop and mobile together",{"type":279,"tag":280,"props":782,"children":783},{},[784],{"type":284,"value":785},"Desktop has room for the document tree and the current page's table of contents at the same time. Mobile does not. Keep those controls separate: one answers “Which page?” and the other answers “Which heading on this page?” Combining them saves one button but mixes two navigation models.",{"type":279,"tag":280,"props":787,"children":788},{},[789],{"type":284,"value":790},"Search is a third path, not a replacement for structure. It helps readers who know the words they want. The sidebar still serves readers who are learning the vocabulary of the product.",{"type":279,"tag":280,"props":792,"children":793},{},[794,795,801],{"type":284,"value":349},{"type":279,"tag":644,"props":796,"children":798},{"href":797},"$docs\u002Fauthoring\u002Fnavigation",[799],{"type":284,"value":800},"navigation guide",{"type":284,"value":802}," describes the exact sidecar metadata. When the corpus changes, review the structure by reader task and scan depth—not by whether every folder appears somewhere on screen.",{"title":429,"searchDepth":430,"depth":430,"links":804},[805,806,807,808],{"id":694,"depth":433,"text":697},{"id":710,"depth":433,"text":713},{"id":761,"depth":433,"text":764},{"id":777,"depth":433,"text":780},"content:en:2.blog:2.navigation-quality.md",{"source":260,"path":811,"stem":812,"dir":439,"extension":443},"en\u002F2.blog\u002F2.navigation-quality.md","en\u002F2.blog\u002F2.navigation-quality",{"lastmod":814},"2026-05-20T00:00:00.000Z",{"$docs\u002Fauthoring\u002Fnavigation":63},{"resolvedPath":817,"alternates":818},"\u002Fblog\u002Fnavigation-quality",[819,820],{"locale":8,"path":817,"source":268},{"locale":270,"path":821,"source":268},"\u002Fde\u002Fblog\u002Fnavigationsqualitaet",{"requested":823,"resolved":824,"usedFallback":9},{"locale":8},{"locale":8},{"title":826,"description":827,"badge":159,"date":828,"readingTime":679,"author":249,"body":829,"type":437,"id":1111,"canonicalKey":7,"draft":9,"partial":9,"locale":8,"collection":439,"navigationFile":9,"file":1112,"sitemap":1115,"resolvedRefs":1117,"route":1118,"resolution":1124},"Choose a static or server deployment for your docs","Decide between generated files and a Nitro server from the behavior your documentation needs.","2026-05-14",{"type":276,"children":830,"toc":1106},[831,836,841,847,852,903,908,913,919,936,941,946,952,1083,1094],{"type":279,"tag":280,"props":832,"children":833},{},[834],{"type":284,"value":835},"A documentation site is a strong candidate for static hosting, but “the pages are mostly Markdown” is not enough to make the decision. Choose the deployment model from the request-time behavior you need after the build has finished.",{"type":279,"tag":280,"props":837,"children":838},{},[839],{"type":284,"value":840},"Ginko Docs supports both models. The important distinction is not visual: generated and server-rendered sites use the same routes, navigation, search interface, and content components. The distinction is which responses require a running Nitro server.",{"type":279,"tag":300,"props":842,"children":844},{"id":843},"what-a-static-build-keeps",[845],{"type":284,"value":846},"What a static build keeps",{"type":279,"tag":280,"props":848,"children":849},{},[850],{"type":284,"value":851},"A generated site includes the parts readers use most often:",{"type":279,"tag":853,"props":854,"children":855},"ul",{},[856,862,867,872,882,898],{"type":279,"tag":857,"props":858,"children":859},"li",{},[860],{"type":284,"value":861},"prerendered docs, blog, and landing pages;",{"type":279,"tag":857,"props":863,"children":864},{},[865],{"type":284,"value":866},"Nuxt payloads for client-side navigation;",{"type":279,"tag":857,"props":868,"children":869},{},[870],{"type":284,"value":871},"the MiniSearch data used by the command center;",{"type":279,"tag":857,"props":873,"children":874},{},[875,880],{"type":279,"tag":292,"props":876,"children":877},{},[878],{"type":284,"value":879},"\u002Fraw\u002F**.md",{"type":284,"value":881}," copies of public pages;",{"type":279,"tag":857,"props":883,"children":884},{},[885,890,891,896],{"type":279,"tag":292,"props":886,"children":887},{},[888],{"type":284,"value":889},"llms.txt",{"type":284,"value":356},{"type":279,"tag":292,"props":892,"children":893},{},[894],{"type":284,"value":895},"llms-full.txt",{"type":284,"value":897}," catalogs;",{"type":279,"tag":857,"props":899,"children":900},{},[901],{"type":284,"value":902},"sitemap, robots, and generated PNG social cards.",{"type":279,"tag":280,"props":904,"children":905},{},[906],{"type":284,"value":907},"Browser features still run after deployment. Search, image zoom, the language switcher, banner dismissal, Plausible analytics, and the feedback interface do not require a Node server.",{"type":279,"tag":280,"props":909,"children":910},{},[911],{"type":284,"value":912},"This makes static output a good default for public documentation whose content changes through a build and deploy.",{"type":279,"tag":300,"props":914,"children":916},{"id":915},"what-a-nitro-server-adds",[917],{"type":284,"value":918},"What a Nitro server adds",{"type":279,"tag":280,"props":920,"children":921},{},[922,924,928,930,934],{"type":284,"value":923},"Some capabilities depend on the incoming HTTP request. A Nitro deployment can inspect an ",{"type":279,"tag":292,"props":925,"children":926},{},[927],{"type":284,"value":587},{"type":284,"value":929}," header and return Markdown from the normal page URL. It can also emit response link headers and serve the read-only MCP endpoint at ",{"type":279,"tag":292,"props":931,"children":932},{},[933],{"type":284,"value":594},{"type":284,"value":935},".",{"type":279,"tag":280,"props":937,"children":938},{},[939],{"type":284,"value":940},"A file host cannot reproduce those behaviors from the generated directory alone. It can serve the explicit raw files and LLM catalogs, but it cannot negotiate a different representation for one URL or execute MCP tools.",{"type":279,"tag":280,"props":942,"children":943},{},[944],{"type":284,"value":945},"Use a server deployment when those request-time interfaces are part of the product rather than optional conveniences.",{"type":279,"tag":300,"props":947,"children":949},{"id":948},"make-the-choice-explicit",[950],{"type":284,"value":951},"Make the choice explicit",{"type":279,"tag":953,"props":954,"children":955},"table",{},[956,980],{"type":279,"tag":957,"props":958,"children":959},"thead",{},[960],{"type":279,"tag":961,"props":962,"children":963},"tr",{},[964,970,975],{"type":279,"tag":965,"props":966,"children":967},"th",{},[968],{"type":284,"value":969},"Requirement",{"type":279,"tag":965,"props":971,"children":972},{},[973],{"type":284,"value":974},"Static output",{"type":279,"tag":965,"props":976,"children":977},{},[978],{"type":284,"value":979},"Nitro server",{"type":279,"tag":981,"props":982,"children":983},"tbody",{},[984,1002,1018,1034,1051,1067],{"type":279,"tag":961,"props":985,"children":986},{},[987,993,998],{"type":279,"tag":988,"props":989,"children":990},"td",{},[991],{"type":284,"value":992},"Rendered docs and blog pages",{"type":279,"tag":988,"props":994,"children":995},{},[996],{"type":284,"value":997},"Yes",{"type":279,"tag":988,"props":999,"children":1000},{},[1001],{"type":284,"value":997},{"type":279,"tag":961,"props":1003,"children":1004},{},[1005,1010,1014],{"type":279,"tag":988,"props":1006,"children":1007},{},[1008],{"type":284,"value":1009},"Client-side search",{"type":279,"tag":988,"props":1011,"children":1012},{},[1013],{"type":284,"value":997},{"type":279,"tag":988,"props":1015,"children":1016},{},[1017],{"type":284,"value":997},{"type":279,"tag":961,"props":1019,"children":1020},{},[1021,1026,1030],{"type":279,"tag":988,"props":1022,"children":1023},{},[1024],{"type":284,"value":1025},"Raw Markdown and LLM catalogs",{"type":279,"tag":988,"props":1027,"children":1028},{},[1029],{"type":284,"value":997},{"type":279,"tag":988,"props":1031,"children":1032},{},[1033],{"type":284,"value":997},{"type":279,"tag":961,"props":1035,"children":1036},{},[1037,1042,1047],{"type":279,"tag":988,"props":1038,"children":1039},{},[1040],{"type":284,"value":1041},"Markdown content negotiation",{"type":279,"tag":988,"props":1043,"children":1044},{},[1045],{"type":284,"value":1046},"No",{"type":279,"tag":988,"props":1048,"children":1049},{},[1050],{"type":284,"value":997},{"type":279,"tag":961,"props":1052,"children":1053},{},[1054,1059,1063],{"type":279,"tag":988,"props":1055,"children":1056},{},[1057],{"type":284,"value":1058},"Runtime link headers",{"type":279,"tag":988,"props":1060,"children":1061},{},[1062],{"type":284,"value":1046},{"type":279,"tag":988,"props":1064,"children":1065},{},[1066],{"type":284,"value":997},{"type":279,"tag":961,"props":1068,"children":1069},{},[1070,1075,1079],{"type":279,"tag":988,"props":1071,"children":1072},{},[1073],{"type":284,"value":1074},"MCP endpoint",{"type":279,"tag":988,"props":1076,"children":1077},{},[1078],{"type":284,"value":1046},{"type":279,"tag":988,"props":1080,"children":1081},{},[1082],{"type":284,"value":997},{"type":279,"tag":280,"props":1084,"children":1085},{},[1086,1088,1092],{"type":284,"value":1087},"Do not advertise ",{"type":279,"tag":292,"props":1089,"children":1090},{},[1091],{"type":284,"value":594},{"type":284,"value":1093}," on a site that only deploys static files. The page action settings can hide that menu entry, but they do not change which routes the build creates.",{"type":279,"tag":280,"props":1095,"children":1096},{},[1097,1098,1104],{"type":284,"value":349},{"type":279,"tag":644,"props":1099,"children":1101},{"href":1100},"$docs\u002Foperations\u002Fdeployment",[1102],{"type":284,"value":1103},"deployment guide",{"type":284,"value":1105}," lists the commands and output checks for both targets. Test the deployed artifact rather than assuming that a successful development server proves the chosen hosting behavior.",{"title":429,"searchDepth":430,"depth":430,"links":1107},[1108,1109,1110],{"id":843,"depth":433,"text":846},{"id":915,"depth":433,"text":918},{"id":948,"depth":433,"text":951},"content:en:2.blog:1.static-docs-pipeline.md",{"source":260,"path":1113,"stem":1114,"dir":439,"extension":443},"en\u002F2.blog\u002F1.static-docs-pipeline.md","en\u002F2.blog\u002F1.static-docs-pipeline",{"lastmod":1116},"2026-05-14T00:00:00.000Z",{"$docs\u002Foperations\u002Fdeployment":164},{"resolvedPath":1119,"alternates":1120},"\u002Fblog\u002Fstatic-docs-pipeline",[1121,1122],{"locale":8,"path":1119,"source":268},{"locale":270,"path":1123,"source":268},"\u002Fde\u002Fblog\u002Fstatische-docs-pipeline",{"requested":1125,"resolved":1126,"usedFallback":9},{"locale":8},{"locale":8},1786530426620]