app.config.ts
Complete reference for live Ginko Docs presentation options and their layer defaults.
app/app.config.ts owns public identity, navigation, optional UI, analytics, and landing-page copy. Nuxt merges consumer values over the layer defaults, so set only fields you intend to change.
export default defineAppConfig({
ginkoDocs: {
site: {
name: { en: "Example Docs", de: "Example-Dokumentation" },
description: {
en: "Documentation for Example.",
de: "Dokumentation für Example.",
},
url: "https://docs.example.com",
logo: { light: "/logo.svg", dark: "/logo-dark.svg" },
},
},
});Localized values use { en: string, de?: string }. When de is absent, the layer falls back to en.
Theme palettes
| Field | Type | Default | Behavior |
|---|---|---|---|
theme.neutral | Neutral palette name | 'zinc' | Surfaces, text, borders, inputs, and code |
theme.primary | Primary palette name | 'neutral' | Primary actions, focus rings, and one chart color |
Neutral palettes are slate, gray, zinc, neutral, stone, taupe, mauve, mist, and olive. Primary palettes are neutral, red, orange, amber, yellow, lime, green, emerald, teal, cyan, sky, blue, indigo, violet, purple, fuchsia, pink, and rose. Both fields also accept custom for a consumer-defined palette.
export default defineAppConfig({
ginkoDocs: {
theme: {
neutral: "stone",
primary: "blue",
},
},
});primary: 'neutral' follows the selected neutral ramp and keeps the default monochrome appearance. See Theme and override the layer for custom-palette variables and direct token overrides.
Prose appearance
| Field | Type | Default |
|---|---|---|
prose.appearance | 'quiet' | 'tint' | 'quiet' |
prose.components | Partial family-to-appearance map | callout, aside, excerpt, and tabs use 'tint' |
An authored component appearance prop overrides its family value; the family value overrides prose.appearance. Families are callout, aside, excerpt, cards, readMore, accordion, tabs, code, files, api, figure, quiz, steps, and timeline.
Site
| Field | Type | Default | Used for |
|---|---|---|---|
site.name | Localized text | Ginko Docs in both locales | Header, metadata, structured data, social images |
site.description | Localized text | Documentation sites built with Nuxt and Ginko Content. / Dokumentations-Sites auf Basis von Nuxt und Ginko Content. | Metadata and structured data |
site.url | string | http://localhost:3000 | Canonical, alternate, raw, and MCP URLs |
site.logo.light | string | /logo.svg | Light-mode header and social-image logo |
site.logo.dark | string | /logo-dark.svg | Dark-mode header logo |
site.docsSidebarSwitcher | 'dropdown' | 'list' | 'tabs' | 'tabs' | Documentation section selector |
site.lupinumAttribution | boolean | true | Lupinum credit in the footer |
Use a production site.url; local defaults would produce incorrect canonical and agent links after deployment.
Main navigation
| Field | Type | Default |
|---|---|---|
nav.links | 'auto' | GinkoDocsLink[] | 'auto' |
nav.socialIcons | boolean | false |
'auto' adds Documentation and adds Blog only when blog routes exist. An array replaces the generated links completely.
nav.socialIcons renders the configured social links as icon buttons in the header bar, and switches the mobile menu from labelled pills to the same icons. It stays off by default so upgrading never adds links to an existing header.
export default defineAppConfig({
ginkoDocs: {
nav: {
links: [
{
label: { en: "Guides", de: "Anleitungen" },
to: { en: "/docs", de: "/de/dokumentation" },
icon: "lucide:book-open",
description: {
en: "Learn to use Example.",
de: "Example kennenlernen.",
},
},
],
},
},
});A link requires localized label and to; icon and localized description are optional. URLs beginning with http:// or https:// are treated as external.
Announcement banner
| Field | Type | Default | Behavior |
|---|---|---|---|
banner.enabled | boolean | false | Show or hide the banner explicitly |
banner.id | string | 'default' | Forms the dismissal key ginko-docs:banner:<id> |
banner.text | Localized text | unset; runtime fallback: Introducing the Ginko Content docs pipeline. / Neu: die Ginko-Content-Dokumentationspipeline. | Announcement copy |
banner.link.label | Localized text | unset; runtime fallback: Read the announcement / Ankündigung lesen | Optional linked label |
banner.link.to | Localized text | unset | Optional destination |
banner.showOnLanding | boolean | true | Show the banner on the landing page |
Change banner.id when an updated announcement should reappear after a reader dismissed an earlier one.
Analytics and social links
Analytics is disabled until a Plausible site script ID is set.
| Field | Type | Default |
|---|---|---|
analytics.plausible.scriptId | string | unset |
social.github | GinkoDocsSocialEntry | unset |
social.discord | GinkoDocsSocialEntry | unset |
social.linkedin | GinkoDocsSocialEntry | unset |
Social entries render in the order they are configured, so listing Discord first puts it first in the header. A plain URL uses the platform's built-in label and icon; an object overrides either:
export default defineAppConfig({
ginkoDocs: {
nav: { socialIcons: true },
social: {
discord: { href: "https://discord.gg/example", icon: "brand:discord" },
github: "https://github.com/example/repo",
},
},
});icon accepts any Iconify name the application has registered. The layer bundles a closed icon set with no API fallback, so a site that wants true brand marks registers them through Nuxt Icon's customCollections and names them here. Lucide has no Discord mark; the built-in default is a generic chat icon.
Copy scriptId from the site-specific script URL in Plausible. For https://plausible.io/js/pa-ExampleSiteScriptId.js, use only ExampleSiteScriptId. The ID is public and safe to commit. Do not put it in an environment variable or secret.
Plausible owns enhanced measurements such as outbound links, file downloads, and 404 pages. Configure them in the Plausible Site Installation settings. Ginko Docs loads no analytics script when scriptId is unset.
Page features
| Field | Type | Default | Behavior |
|---|---|---|---|
feedback.enabled | boolean | false | Show the helpful/not-helpful prompt |
ogImage.enabled | boolean | true | Generate per-page social images |
ogImage.component | string | 'GinkoDocs' | Nuxt OG Image template component |
markdownActions.chatGpt | boolean | true | Show the ChatGPT action |
markdownActions.claude | boolean | true | Show the Claude action |
markdownActions.mcp | boolean | true | Show the MCP URL action |
images.zoom | boolean | true | Enable click-to-zoom prose images |
toc.depth | 2 | 3 | 4 | 3 | Include headings through h2, h3, or h4 |
The feedback control appears only when feedback.enabled is true and a Plausible script ID is set. Feedback events use the name docs-feedback with path, helpful, and locale properties. Add the matching custom-event goal and properties in Plausible. A negative answer can link to a prefilled issue when repository is set.
The Markdown action fields affect only the menu. Agent routes, Markdown negotiation, link headers, and MCP registration are controlled by Nuxt module configuration and the deployment target.
Repository links
repository is unset by default.
| Field | Type | Runtime default |
|---|---|---|
repository.url | string | required when repository is set |
repository.branch | string | 'main' |
repository.contentDirectory | string | 'content' |
The URL must be the repository base URL. Ginko Docs derives edit links and new-issue links from it.
Landing page
The layer provides localized title, description, and primary action copy. Its initial landing configuration is:
| Field | Default |
|---|---|
landing.title | Publish structured documentation. / Veröffentliche strukturierte Dokumentation. |
landing.description | A Nuxt layer for searchable, localized documentation with stable routes and agent-readable output. / Ein Nuxt-Layer für durchsuchbare, lokalisierte Dokumentation mit stabilen Routen und agentenlesbarer Ausgabe. |
landing.primary.label | “Get started” / “Erste Schritte” |
landing.primary.to | /docs / /de/dokumentation |
landing.secondary | unset |
landing.hero | unset |
landing.install | unset |
landing.features | [] |
landing.agent | unset |
landing.cta | unset |
The full landing shape is:
title: LocalizedText required description: LocalizedText required primary: Link required label and to.secondary?: Linkhero.media?: HeroMediainstall.command?: stringfeatures: FeatureCard[] = []agent?: AgentBandcta?: ClosingCtalanding.primary.Hero media is a union discriminated by type; each tab of the panel below documents one accepted form:
type: "image" required src: string required alt: string required