Jamdesk Documentation logo

Référence docs.json

Référence complète de chaque champ de docs.json : thèmes, couleurs, navigation, onglets, OpenAPI, branding, SEO, analytique et chat IA.

Le fichier docs.json est la configuration centrale de votre site de documentation Jamdesk.

Les paramètres clés de votre docs.json apparaissent dans le dashboard sous Project Settings → Configuration Highlights. Cette vue est en lecture seule et se met à jour automatiquement après chaque build réussi.

Champs obligatoires

name

Type : string (obligatoire)

Le nom de votre site de documentation. Il s'affiche dans l'en-tête et dans l'onglet du navigateur. Pour changer le format du titre de l'onglet, consultez seo.titleTemplate.

{ "name": "Acme API Docs" }

theme

Type : "jam" | "nebula" | "pulsar" | "halo" | "dusk" (obligatoire)

Design épuré et moderne avec la police Inter. Navigation dans l'en-tête.

Idéal pour : la plupart des sites de documentation, les références d'API

colors

Type : object (obligatoire)

ChampTypeObligatoireDescription
primarystring (hex)OuiCouleur principale de la marque
lightstring (hex)NonCouleur d'accent du thème clair
darkstring (hex)NonCouleur d'accent du thème sombre
{
  "colors": {
    "primary": "#635BFF",
    "light": "#7C75FF",
    "dark": "#4F46E5"
  }
}

Image de marque

favicon

Type : string ou object

Chemin vers votre fichier favicon (SVG recommandé). Fournissez une seule image pour les deux modes, ou des variantes light / dark distinctes.

ChampTypeDescription
lightstringFavicon du mode clair (obligatoire avec la forme objet)
darkstringFavicon du mode sombre (facultatif, retombe sur light)
{ "favicon": "/images/favicon.svg" }
{
  "favicon": {
    "light": "/images/favicon.svg",
    "dark": "/images/favicon-dark.svg"
  }
}

Type : object

ChampTypeDescription
lightstringLogo du mode clair
darkstringLogo du mode sombre
hrefstringURL ouverte au clic sur le logo
{
  "logo": {
    "light": "/images/logo-light.webp",
    "dark": "/images/logo-dark.webp",
    "href": "https://yoursite.com"
  }
}

Typographie

fonts

Type : object (facultatif)

Remplacez la police par défaut du thème pour le corps de texte et les titres. Chaque thème est livré avec une police par défaut soigneusement choisie. Ne définissez fonts que si vous voulez un autre rendu.

Utiliser la même police partout :

{
  "fonts": {
    "family": "Lora"
  }
}

Séparer les titres et le corps de texte :

{
  "fonts": {
    "heading": { "family": "Space Grotesk" },
    "body": { "family": "Inter" }
  }
}
ChampTypeDescription
familystringNom de la famille de polices. N'importe quelle police Google Fonts convient ; le build la récupère automatiquement
weightnumberGraisse unique à charger (par exemple 400). Omettez-la pour charger 400, 500, 600, 700
sourcestringURL ou chemin relatif commençant par / vers un fichier de police auto-hébergé. Contourne Google Fonts
format"woff" | "woff2"Obligatoire lorsque source est défini

heading et body acceptent les mêmes champs. Consultez Thèmes → Typographie pour des conseils sur le choix des polices.

Apparence

appearance

Type : object (facultatif)

Contrôlez le comportement par défaut du mode sombre sur votre site.

{
  "appearance": {
    "default": "dark",
    "strict": true
  }
}
ChampTypePar défautDescription
default"system" | "light" | "dark""system"Mode initial pour les nouveaux visiteurs
strictbooleanfalseLorsque la valeur est true, masque le bouton de bascule de la barre de navigation : les visiteurs restent sur default

Consultez Thèmes → Mode sombre pour le fonctionnement du bouton de bascule.

Métadonnées de page

metadata

Type : object (facultatif)

Contrôlez les métadonnées affichées sur chaque page de la documentation.

{
  "metadata": {
    "timestamp": true
  }
}
ChampTypePar défautDescription
timestampbooleanfalseLorsque la valeur est true, affiche dans le pied de page de chaque page une ligne du type « Last updated on June 15, 2026 ». La date provient du dernier commit Git ayant modifié cette page, elle reste donc exacte automatiquement à chaque build.

La date s'affiche sur votre site publié et dans jamdesk dev. Elle reflète le commit le plus récent ayant touché le fichier de chaque page : les pages que vous n'avez pas modifiées conservent donc leur date d'origine.

SEO

seo.titleTemplate

Type : string (facultatif) Valeur par défaut : %s — <nom>, où <nom> est votre name

Définissez le format du titre de page dans l'onglet du navigateur et dans les résultats de recherche. Placez %s à l'endroit où le titre de la page doit apparaître. Chaque %s est remplacé. Le modèle peut contenir jusqu'à 200 caractères. S'il ne contient pas %s, le build échoue et jamdesk validate affiche l'erreur.

{
  "seo": {
    "titleTemplate": "%s | Acme"
  }
}

Une page intitulée Getting started affiche alors Getting started | Acme. Utilisez "%s" seul pour omettre le nom du site. Cela ne modifie pas og:title ni twitter:title. Consultez Titres de page pour les pages sans titre.

seo.socialCard

Type : object (facultatif)

Modifiez la carte sociale que Jamdesk génère pour chaque page. Sans cette clé, les cartes conservent leur apparence par défaut.

{
  "seo": {
    "socialCard": {
      "theme": "dark",
      "brandColor": true
    }
  }
}
ChampTypePar défautDescription
theme"light" | "dark""light""dark" utilise un texte clair sur un fond sombre, ainsi que votre image logo.dark.
brandColorbooleanfalseColore la barre du bas et le badge de section avec colors.primary (colors.light sur une carte sombre).
accentBarbooleantruefalse supprime la barre située en bas de la carte.
siteNamebooleantruefalse masque le nom du site sous le logo. Le nom reste affiché lorsque la carte montre votre favicon à la place du logo.
customImage"background" | "replace""background""replace" utilise votre og:image comme carte entière, sans aucun texte dessus.

La carte ne peut dessiner que des logos SVG, PNG et JPG, et Jamdesk convertit les fichiers de logo PNG et JPG en WebP lors du build de votre site. Utilisez un logo SVG pour afficher votre logo complet sur la carte. La carte ne peut pas dessiner le texte d'un logo SVG : convertissez tout texte en contours (tracés) dans votre outil de conception, puis exportez de nouveau le SVG.

Consultez Personnaliser la carte sociale pour le détail de chaque option et l'image utilisée par une page.

Localisation

localization

Type : object (facultatif)

Contrôlez la manière dont les visiteurs accèdent à la version traduite de votre documentation.

{
  "localization": {
    "autoRedirect": true
  }
}
ChampTypePar défautDescription
autoRedirectbooleanfalseLorsque la valeur est true, un visiteur qui arrive pour la première fois à la racine de votre documentation est redirigé vers la langue correspondant à l'en-tête Accept-Language de son navigateur. Nécessite au moins deux entrées dans navigation.languages.

Seules les racines sont redirigées. Un lien profond tel que /guides/authentication renvoie toujours la page qu'il désigne : un lien que vous collez dans un ticket ouvre donc la même page pour tout le monde. Les robots des moteurs de recherche ne sont jamais redirigés, de sorte que vos balises hreflang continuent de déterminer ce qui est indexé.

La langue du visiteur est mémorisée pendant un an. Choisir une langue dans le sélecteur de langue remplace ensuite la correspondance automatique.

Consultez Support multilingue → Routage automatique de la langue pour le comportement complet.

Bannière

Affichez une barre d'annonce sur tout le site, épinglée en haut de chaque page, au-dessus de l'en-tête, sur toute la largeur et dans la couleur d'accent de votre thème. Utilisez-la pour les lancements, les migrations, les fenêtres de maintenance ou tout message que chaque visiteur doit voir.

{
  "banner": {
    "content": "🎉 Version 2.0 is live! Read the [changelog](/changelog).",
    "dismissible": true
  }
}
ChampTypePar défautDescription
contentstring-Obligatoire. Le texte de la bannière. Prend en charge la mise en forme en ligne de base : liens [text](url), gras (**text**) et italique (*text*). Les composants MDX personnalisés ne sont pas pris en charge.
dismissiblebooleanfalseLorsque la valeur est true, affiche un bouton de fermeture. Une fois la bannière fermée par un visiteur, elle reste masquée pour lui jusqu'à ce que vous modifiiez content. Modifier le message la fait réapparaître.

La bannière s'affiche sur votre site publié et dans jamdesk dev. Elle est configurée globalement (une seule bannière pour tout le site) ; les bannières par onglet et par langue ne sont pas prises en charge pour le moment.

OpenAPI

api.openapi

Type : string | string[]

Listez les fichiers de spécification OpenAPI 3.x que Jamdesk doit valider et utiliser pour les pages d'endpoint. Utilisez des chemins relatifs à votre docs.json.

docs.json
{
  "api": {
    "openapi": ["/openapi/api.yaml"]
  }
}

Une fois cette option configurée, vous pouvez générer des pages d'endpoint en ajoutant un champ openapi dans le frontmatter d'une page :

---
title: Create Ticket
openapi: /openapi/api.yaml POST /tickets
---

Si vous ne listez qu'une seule spécification, vous pouvez aussi utiliser le format court :

---
title: Create Ticket
openapi: POST /tickets
---

Consultez Exemple OpenAPI pour une page d'endpoint réelle et Structure des répertoires pour l'emplacement des fichiers.

Si votre site est multilingue, placez un fichier <spec>.<lang>.<ext> à côté de chaque spécification source (par exemple openapi/api.fr.yaml) et Jamdesk le sert sur les URL de cette langue. Consultez Traduire les spécifications OpenAPI.

Une clé asyncapi est acceptée partout où openapi l'est, mais Jamdesk ne génère pas encore de rendu des spécifications AsyncAPI : rien n'est généré à partir de cette clé. jamdesk validate émet un avertissement lorsqu'il en trouve une, afin qu'une configuration qui semble prise en charge ne le reste pas jusqu'au build du site.

Type : object

Ajoutez un objet openapi à un onglet de navigation et définissez generate: true : Jamdesk crée au moment du build une page d'endpoint par opération de cette spécification, ainsi que les groupes de la barre latérale pour les accueillir. Rien à rédiger, rien à committer.

docs.json
{
  "navigation": {
    "tabs": [
      {
        "tab": "API Reference",
        "openapi": { "source": "/openapi/api.yaml", "generate": true }
      }
    ]
  }
}
CléTypeDescription
sourcestringChemin vers la spécification, relatif à votre docs.json
generatebooleantrue génère les pages et la barre latérale. Sans cette valeur, la clé reste inerte

Les pages générées se placent sous le nom de l'onglet, converti en slug, avec un slug construit à partir de la méthode et du chemin : l'onglet ci-dessus place POST /tickets à l'adresse /api-reference/post-tickets. Les opérations sont regroupées selon leur premier tag ; les spécifications sans tags se rabattent sur le premier segment de chemin significatif, de sorte que /api/v1/auctions/{auctionId} se retrouve sous Auctions. Les titres proviennent du summary de l'opération lorsque la spécification en fournit un, sinon de la méthode et du chemin. Une opération qui cible une seule ressource reçoit un titre au singulier (GET /users/{id} → « Get User »).

generate est opt-in par construction. Un simple "openapi": "/openapi/api.yaml" sur un onglet, ou un objet sans generate: true, continue de faire exactement ce qu'il faisait auparavant : aucune configuration existante ne gagne donc une centaine de pages à son prochain build.

Un fichier .mdx committé l'emporte toujours en cas de collision de slug : vous pouvez donc adopter la génération progressivement, en l'activant puis en supprimant vos pages d'endpoint écrites à la main une par une, à votre rythme.

Si vous renommez plus tard un chemin dans votre spécification, le slug généré suit le changement. Jamdesk conserve un historique des slugs par opération et émet à chaque build une redirection de chaque ancienne URL vers l'URL actuelle, afin que les liens entrants et les favoris survivent au renommage. Vos propres redirections et toute page existante restent prioritaires.

Limites actuelles. La génération ne fonctionne que sur les navigation.tabs de premier niveau, pas sur les groupes, les ancres ni les onglets imbriqués sous languages ou versions, et elle ne produit des pages que pour votre langue par défaut. Une clé directory est acceptée par le schéma mais n'a aucun effet sur l'emplacement des pages.

api.mdx.server

Type : string

URL de base utilisée dans les exemples de code des pages à frontmatter api: (celles rédigées en MDX, et non les pages openapi:, qui tirent leurs serveurs de la spécification).

{
  "api": {
    "mdx": {
      "server": "https://api.example.com"
    }
  }
}

Un tableau est accepté pour des raisons de compatibilité, mais seule la première entrée est utilisée : tout ce qui suit est ignoré. jamdesk validate émet un avertissement si vous en listez plusieurs.

api.examples.languages

Type : string[] Par défaut : ["curl", "python", "javascript"]

Choisissez les langages de programmation qui apparaissent dans les exemples de code d'API générés automatiquement sur les pages openapi:. L'ordre du tableau détermine l'ordre d'affichage des onglets, et le premier langage est sélectionné par défaut.

Valeurs prises en charge : curl, bash, python, javascript, go, ruby, csharp, java, rust, php

bash est un alias de curl ; les deux produisent le même résultat. Utilisez le libellé que vous préférez.
All supported languages
{
  "api": {
    "examples": {
      "languages": ["curl", "python", "javascript", "go", "ruby", "csharp", "java", "rust", "php"]
    }
  }
}
Custom subset
{
  "api": {
    "examples": {
      "languages": ["python", "javascript", "go"]
    }
  }
}

api.examples.defaults

Type : "required" | "all" Par défaut : "all"

Contrôlez les paramètres qui apparaissent dans les exemples de code générés automatiquement.

ValeurComportement
"all"Les exemples incluent tous les paramètres avec des valeurs fictives
"required"Les exemples n'incluent que les paramètres marqués required dans la spécification
{
  "api": {
    "examples": {
      "defaults": "required"
    }
  }
}

api.examples.prefill

Type : boolean Par défaut : false

Lorsque la valeur est true, le playground d'API préremplit les champs de paramètres avec les valeurs example de votre spécification OpenAPI.

{
  "api": {
    "examples": {
      "prefill": true
    }
  }
}

api.playground.display

Type : "interactive" | "simple" | "none" Par défaut : "interactive"

Contrôle le playground d'API sur les pages d'endpoint. Un bouton « Try it » apparaît par défaut sur chaque page openapi: et api:.

ValeurComportement
"interactive"Playground complet : renseigner les paramètres, générer du code, envoyer des requêtes (par défaut)
"simple"Renseigner les paramètres et copier le code, mais sans bouton Send
"none"Playground désactivé
{
  "api": {
    "playground": {
      "display": "interactive"
    }
  }
}

Consultez playground d'API pour les détails d'utilisation et les remplacements par page.

api.mdx.auth.method

Type : "bearer" | "basic" | "key" | "cobo"

Méthode d'authentification utilisée dans les exemples de code générés automatiquement. Lorsqu'elle est définie, les exemples incluent l'en-tête d'authentification correspondant.

ValeurFormat de l'en-tête
"bearer"Authorization: Bearer <token>
"basic"Authorization: Basic <base64>
"key"En-tête personnalisé (voir api.mdx.auth.name)
"cobo"Authentification spécifique à Cobo
{
  "api": {
    "mdx": {
      "auth": {
        "method": "bearer"
      }
    }
  }
}

api.mdx.auth.name

Type : string

Nom d'en-tête personnalisé pour l'authentification par clé. Utilisé uniquement lorsque api.mdx.auth.method vaut "key".

{
  "api": {
    "mdx": {
      "auth": {
        "method": "key",
        "name": "X-API-Key"
      }
    }
  }
}

tabsPosition

Type : "top" | "left"

Contrôle l'emplacement d'affichage des onglets de navigation.

ValeurDescription
"top"Les onglets apparaissent dans la barre d'onglets de l'en-tête
"left"Les onglets apparaissent en haut de la barre latérale

La valeur par défaut dépend de votre thème :

ThèmePar défaut
jam"left"
nebula"left"
pulsar"top"
halo"left"
dusk"left"
{ "tabsPosition": "left" }

tabsAlignment

Type : "start" | "center" | "end"

Définit l'alignement horizontal de la rangée d'onglets lorsque les onglets sont dans l'en-tête (tabsPosition: "top"). Sans effet avec tabsPosition: "left", ni dans le thème Pulsar, qui place les onglets du haut sur le côté droit de l'en-tête.

ValeurDescription
"start"Les onglets sont à gauche de l'en-tête (par défaut)
"center"Les onglets sont centrés dans l'en-tête
"end"Les onglets sont à droite de l'en-tête
{ "tabsPosition": "top", "tabsAlignment": "center" }

anchors

Type : array

Liens externes affichés en haut de la barre latérale sur toutes les pages.

ChampTypeObligatoireDescription
namestringOuiTexte affiché
hrefstringOuiURL (lien externe)
iconstringNonNom d'icône Font Awesome
{
  "anchors": [
    { "name": "Blog", "href": "https://blog.example.com", "icon": "newspaper" }
  ]
}

Type : object

La structure de navigation de votre documentation. Consultez Navigation pour la documentation détaillée.

Les pages peuvent être des chaînes (titre généré automatiquement à partir du nom de fichier) ou des objets avec un titre personnalisé :

"pages": [
  "introduction",
  { "page": "content/mdx-basics", "title": "MDX Basics" }
]
{
  "navigation": {
    "tabs": [
      {
        "tab": "Docs",
        "icon": "book-open",
        "groups": [
          {
            "group": "Getting Started",
            "pages": ["introduction", "quickstart"]
          }
        ]
      }
    ]
  }
}

Barre de navigation et pied de page

Type : object

ChampTypeDescription
linksarrayLiens de navigation
links[].labelstringTexte par défaut du bouton
links[].labelsobjectRemplacements facultatifs par langue, indexés par code de langue (par exemple fr, es). Retombe sur label
links[].iconiconIcône facultative à afficher à côté du libellé
links[].hrefstringURL de destination
primaryobjectBouton d'appel à l'action principal
primary.labelstringTexte par défaut du bouton
primary.labelsobjectRemplacements facultatifs par langue, indexés par code de langue. Retombe sur label
{
  "navbar": {
    "links": [
      {
        "label": "Blog",
        "labels": { "fr": "Blog", "es": "Blog" },
        "href": "/blog"
      },
      {
        "label": "Pricing",
        "labels": { "fr": "Tarifs", "es": "Precios" },
        "href": "/pricing"
      }
    ],
    "primary": {
      "type": "button",
      "label": "Dashboard",
      "labels": { "fr": "Tableau de bord", "es": "Panel" },
      "href": "https://app.example.com"
    }
  }
}

labels est facultatif. Les documentations monolingues peuvent l'omettre. Lorsqu'il est défini, la langue de l'URL courante (par exemple /fr/...) sélectionne le remplacement correspondant.

Type : object

Configurez le pied de page avec des liens vers les réseaux sociaux et des colonnes de liens personnalisées.

{
  "footer": {
    "socials": {
      "github": "https://github.com/yourorg",
      "x": "https://x.com/yourhandle",
      "discord": "https://discord.gg/yourserver"
    },
    "links": [
      {
        "header": "Resources",
        "items": [
          { "label": "Blog", "href": "https://example.com/blog" },
          { "label": "Changelog", "href": "/changelog" }
        ]
      }
    ]
  }
}
ChampTypeDescription
socialsobjectURL des plateformes de réseaux sociaux
linksarrayConfigurations des colonnes de liens
links[].headerstringTitre de la colonne
links[].itemsarrayTableau d'objets { label, href }

Plateformes sociales prises en charge : github, x, twitter, linkedin, discord, slack, youtube, instagram, facebook, reddit, telegram, bluesky, threads, medium, hacker-news, website

Style

styling.latex

Type : boolean

Active le rendu des formules mathématiques LaTeX avec KaTeX. Une fois activé, vous pouvez utiliser $...$ pour les formules en ligne et $$...$$ pour les équations en bloc.

{
  "styling": {
    "latex": true
  }
}

Consultez Mathématiques et LaTeX pour les détails d'utilisation.

styling.js

Type : string | string[]

Fichier(s) JavaScript personnalisé(s) à inclure sur chaque page. Les chemins sont relatifs à votre répertoire de documentation et doivent commencer par /.

{
  "styling": {
    "js": "/script.js"
  }
}

Passez un tableau pour plusieurs fichiers :

{
  "styling": {
    "js": ["/chat.js", "/analytics.js"]
  }
}

Sans ce champ, Jamdesk détecte automatiquement les fichiers .js à la racine de votre projet. Consultez JavaScript personnalisé pour plus de détails.

Recherche

Type : object (facultatif)

Personnalisez la barre de recherche de la documentation. La recherche fonctionne immédiatement ; vous n'avez besoin de ce champ que pour modifier le texte indicatif ou mettre en avant des pages populaires dans l'état vide.

ChampTypePar défautDescription
promptstringSearch documentation…Texte indicatif affiché dans le champ de recherche
popularPagesarrayQuick Start, IntroductionLiens d'accès rapide affichés avant que le visiteur ne saisisse une requête
{
  "search": {
    "prompt": "Ask me anything…",
    "popularPages": [
      { "title": "Quick Start", "slug": "quickstart", "icon": "rocket" },
      { "title": "Authentication", "slug": "guides/authentication", "icon": "key" }
    ]
  }
}

Pages populaires

Chaque entrée de popularPages accepte :

ChampTypeObligatoireDescription
titlestringOuiLibellé affiché pour le lien
slugstringOuiChemin de la page, sans barre oblique initiale ni extension .mdx (par exemple quickstart, ou guides/authentication pour le fichier guides/authentication.mdx)
iconstringNonNom d'icône Font Awesome affiché à côté du lien (par exemple rocket ou bell)

Le champ icon accepte aussi l'objet complet { "name", "style", "library" }. Consultez Forme objet de l'icône. Lorsque popularPages est omis, Jamdesk affiche Quick Start et Introduction par défaut.

Chat

chat

Type : object (facultatif)

Configurez l'assistant de chat IA intégré. Le chat est activé par défaut sur tous les sites ; vous n'avez besoin de ce champ que pour personnaliser les questions de départ, le nom et l'icône du bouton, ou pour le désactiver.

ChampTypePar défautDescription
enabledbooleantrueDéfinissez false pour retirer le panneau de chat de votre site
starterQuestionsstring[]générées automatiquementJusqu'à 4 questions affichées à l'ouverture du chat (5 à 200 caractères chacune). Générées automatiquement pendant les builds lorsqu'elles sont omises. Définissez [] pour n'en avoir aucune
labelstring« Ask AI » dans la langue de la pageRemplace « Ask AI » sur le bouton du chat, dans l'en-tête du panneau et dans le raccourci de recherche. 40 caractères maximum. S'applique à toutes les langues.
iconstringsparklesUn nom d'icône Font Awesome, une URL d'image ou le chemin d'une image de votre projet. Une icône Font Awesome suit votre couleur d'accent ; une image s'affiche telle quelle, choisissez-en donc une lisible sur fond clair comme sur fond sombre.
{
  "chat": {
    "label": "Acme Assistant",
    "icon": "/images/assistant.svg",
    "starterQuestions": [
      "How do I get started?",
      "What API endpoints are available?"
    ]
  }
}

Consultez Chat IA pour savoir comment le chat fonctionne et ce que voient les visiteurs.

contextual

Type : object (facultatif)

Configurez le menu déroulant des actions IA qui apparaît sur chaque page. Il est activé par défaut avec toutes les options ; vous n'avez besoin de ce champ que pour choisir les options affichées ou le désactiver.

ChampTypePar défautDescription
enabledbooleantrueDéfinissez false pour retirer le menu des actions IA de votre site
optionsarraytoutes les options intégréesListe de clés d'options et/ou d'objets d'options personnalisées

Clés d'options intégrées : copy, view, chatgpt, claude, perplexity, gemini, mcp, cursor, vscode

{
  "contextual": {
    "options": ["copy", "claude", "mcp", "cursor"]
  }
}

Ajoutez des options personnalisées en plus de celles qui sont intégrées :

{
  "contextual": {
    "options": [
      "copy",
      "claude",
      {
        "title": "Ask on Discord",
        "description": "Get help from the community",
        "icon": "discord",
        "href": "https://discord.gg/your-server"
      }
    ]
  }
}

Consultez Menu des actions IA pour la liste complète des options et le format des options personnalisées.

Vérification orthographique

spellcheck

Type : object (facultatif)

Configurez la commande CLI jamdesk spellcheck. Vous n'avez besoin de ce champ que pour ajouter à la liste d'exclusion des mots propres à votre projet.

ChampTypeDescription
ignorestring[]Mots à ignorer lors de la vérification orthographique (noms de produits, termes techniques, etc.)
{
  "spellcheck": {
    "ignore": ["Acme", "kubectl", "Terraform"]
  }
}

La CLI inclut plus de 180 termes techniques intégrés (API, GraphQL, Kubernetes, React, etc.) et ignore automatiquement le nom de votre projet indiqué dans le champ name. N'ajoutez que les mots propres à votre projet.

Consultez Présentation de la CLI : vérification orthographique pour les détails d'utilisation et le mode de correction interactif.

Images

images.convertToWebp

Type : boolean (facultatif, false par défaut)

Active la conversion automatique en WebP des ressources PNG et JPG pendant les builds. Les fichiers convertis sont généralement 60 à 80 % plus légers que les originaux, sans perte de qualité visible. Les références dans votre MDX, votre CSS personnalisé, votre JS personnalisé et docs.json sont réécrites automatiquement : vous n'avez à modifier aucun chemin.

Les favicons, og:image et twitter:image conservent leur format d'origine. Certains robots des réseaux sociaux et clients de messagerie n'affichent pas WebP de façon fiable, et une carte d'aperçu cassée est pire qu'un JPG légèrement plus lourd.

{
  "images": {
    "convertToWebp": true
  }
}

Consultez Conversion automatique des images pour savoir ce qui est converti, comment fonctionne le cache et à quoi sert l'indicateur de progression du build.

Contrôle d'accès

auth.password

Type : object (facultatif)

Activez la protection par mot de passe partagé pour votre site. Il s'agit d'une configuration déclarative uniquement : vous définissez le mot de passe lui-même dans le dashboard une fois le build suivant exécuté.

Définissez auth.password.enabled: true pour verrouiller tout le site, ou listez des chemins dans auth.password.private[] pour ne protéger que ces pages. Les deux déclenchent la même invite de mot de passe dans le dashboard au build suivant.

{
  "auth": {
    "password": {
      "enabled": true,
      "hint": "Ask your account manager",
      "public": ["/marketing/**", "/changelog"]
    }
  }
}
ChampTypeDescription
enabledbooleanMode site entier. Lorsque la valeur est true, chaque page exige le mot de passe (sauf celles marquées publiques).
hintstring (200 caractères max.)Indice en texte brut affiché sur l'écran de déverrouillage. Pas de HTML.
publicstring[]Motifs de chemins qui contournent le mot de passe. Prend en charge * (un segment) et ** (récursif). Un simple / est refusé.
privatestring[]Chemins exacts qui exigent le mot de passe. Le définir sans enabled active le mode pages spécifiques.

Consultez Protection par mot de passe pour le guide complet, y compris le parcours dans le dashboard et la manière dont public: true / private: true dans le frontmatter interagissent avec ces tableaux.

auth.jwt

Type : object (facultatif)

Protégez tout le site derrière votre propre système de connexion. Votre backend signe un jeton de courte durée pour chaque utilisateur connecté, et Jamdesk l'échange contre un cookie de session. La clé de signature est générée dans le dashboard, pas dans ce fichier. auth.jwt et auth.password ne peuvent pas être activés tous les deux ; un build où les deux sont activés échoue avec une erreur config_error.

{
  "auth": {
    "jwt": {
      "enabled": true,
      "loginUrl": "https://app.example.com/docs-login",
      "public": ["/changelog/**", "/status"]
    }
  }
}
ChampTypeDescription
enabledbooleanActive l'authentification JWT. Chaque page exige une session, sauf celles marquées publiques.
loginUrlstringObligatoire lorsque enabled vaut true. Une URL https:// absolue de votre côté. Les visiteurs sans session y sont envoyés avec ?redirect=<path>, ce qui vous permet de les ramener à la page qu'ils avaient demandée.
publicstring[]Motifs de chemins qui restent accessibles sans connexion. Même syntaxe que auth.password.public, fusionnés avec public: true dans le frontmatter et "public": true sur les groupes de navigation.

L'accès par page se règle en plus grâce à groups dans le frontmatter des pages. Consultez Authentification JWT pour le format du jeton, le flux de redirection et le fonctionnement des groupes.

Exemple complet

{
  "$schema": "https://jamdesk.com/docs.json",
  "name": "Acme Documentation",
  "description": "Learn how to use Acme",
  "theme": "jam",
  "colors": {
    "primary": "#635BFF"
  },
  "favicon": "/images/favicon.svg",
  "logo": {
    "light": "/images/logo-light.webp",
    "dark": "/images/logo-dark.webp"
  },
  "api": {
    "openapi": ["/openapi/api.yaml"],
    "playground": {
      "display": "interactive"
    },
    "examples": {
      "languages": ["curl", "python", "javascript"],
      "prefill": true
    }
  },
  "styling": {
    "latex": true,
    "js": "/script.js"
  },
  "chat": {
    "starterQuestions": ["How do I get started?", "What endpoints are available?"]
  },
  "contextual": {
    "options": ["copy", "claude", "chatgpt", "mcp", "cursor"]
  },
  "spellcheck": {
    "ignore": ["Acme"]
  },
  "anchors": [
    { "name": "Blog", "href": "https://blog.acme.com", "icon": "newspaper" }
  ],
  "navbar": {
    "links": [
      { "label": "Support", "href": "/support" }
    ],
    "primary": {
      "type": "button",
      "label": "Dashboard",
      "href": "https://app.acme.com"
    }
  },
  "navigation": {
    "tabs": [
      {
        "tab": "Docs",
        "icon": "book-open",
        "groups": [
          {
            "group": "Get Started",
            "pages": ["introduction", "quickstart"]
          }
        ]
      },
      {
        "tab": "API Reference",
        "icon": "code",
        "groups": [
          {
            "group": "Endpoints",
            "pages": ["api/users", "api/posts"]
          }
        ]
      }
    ]
  }
}

Et ensuite ?

Présentation de la navigation

Structurez la navigation de votre documentation

Menu des actions IA

Personnalisez le menu déroulant IA de chaque page