Referencia de docs.json
Referencia completa de cada campo de docs.json: temas, colores, navegación, pestañas, OpenAPI, marca, SEO, analítica y ajustes del chat con IA.
El archivo docs.json es la configuración central de tu sitio de documentación de Jamdesk.
Los ajustes clave de tu docs.json se muestran en el Dashboard, en Project Settings → Configuration Highlights. Esta vista es de solo lectura y se actualiza automáticamente después de cada build correcto.
Campos obligatorios
name
Tipo: string (obligatorio)
El nombre de tu sitio de documentación. Se muestra en el encabezado y en la pestaña del navegador. Para cambiar el formato del título de la pestaña, consulta seo.titleTemplate.
{ "name": "Acme API Docs" }
theme
Tipo: "jam" | "nebula" | "pulsar" | "halo" | "dusk" (obligatorio)
Diseño limpio y moderno con la fuente Inter. Navegación basada en el encabezado.
Ideal para: la mayoría de los sitios de documentación y las referencias de API
colors
Tipo: object (obligatorio)
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
primary | string (hex) | Sí | Color principal de la marca |
light | string (hex) | No | Acento del tema claro |
dark | string (hex) | No | Acento del tema oscuro |
{
"colors": {
"primary": "#635BFF",
"light": "#7C75FF",
"dark": "#4F46E5"
}
}
Marca
favicon
Tipo: string u object
Ruta a tu archivo de favicon (se recomienda SVG). Indica una sola imagen para ambos modos, o variantes light / dark por separado.
| Campo | Tipo | Descripción |
|---|---|---|
light | string | Favicon para el modo claro (obligatorio al usar la forma de objeto) |
dark | string | Favicon para el modo oscuro (opcional, usa light si se omite) |
{ "favicon": "/images/favicon.svg" }
{
"favicon": {
"light": "/images/favicon.svg",
"dark": "/images/favicon-dark.svg"
}
}
logo
Tipo: object
| Campo | Tipo | Descripción |
|---|---|---|
light | string | Logotipo para el modo claro |
dark | string | Logotipo para el modo oscuro |
href | string | URL a la que se va al hacer clic en el logotipo |
{
"logo": {
"light": "/images/logo-light.webp",
"dark": "/images/logo-dark.webp",
"href": "https://yoursite.com"
}
}
Tipografía
fonts
Tipo: object (opcional)
Sustituye la fuente predeterminada del tema para el texto del cuerpo y los títulos. Cada tema incluye una fuente predeterminada ya ajustada. Define fonts solo cuando necesites un aspecto distinto.
Usa la misma fuente en todas partes:
{
"fonts": {
"family": "Lora"
}
}
Separa títulos y cuerpo:
{
"fonts": {
"heading": { "family": "Space Grotesk" },
"body": { "family": "Inter" }
}
}
| Campo | Tipo | Descripción |
|---|---|---|
family | string | Nombre de la familia tipográfica. Sirve cualquier Google Font; el build la descarga automáticamente |
weight | number | Un único peso que cargar (p. ej. 400). Si se omite, se cargan 400, 500, 600, 700 |
source | string | URL o ruta relativa a / de un archivo de fuente alojado por ti. Omite Google Fonts |
format | "woff" | "woff2" | Obligatorio cuando se define source |
Tanto heading como body aceptan los mismos campos. Consulta Temas → Tipografía para elegir fuentes.
Apariencia
appearance
Tipo: object (opcional)
Controla el comportamiento predeterminado del modo oscuro de tu sitio.
{
"appearance": {
"default": "dark",
"strict": true
}
}
| Campo | Tipo | Predeterminado | Descripción |
|---|---|---|---|
default | "system" | "light" | "dark" | "system" | Modo inicial para quienes visitan el sitio por primera vez |
strict | boolean | false | Si es true, oculta el interruptor de la barra de navegación para que los visitantes permanezcan en default |
Consulta Temas → Modo oscuro para ver cómo funciona el interruptor.
Metadatos de página
metadata
Tipo: object (opcional)
Controla los metadatos de página que se muestran en cada página de la documentación.
{
"metadata": {
"timestamp": true
}
}
| Campo | Tipo | Predeterminado | Descripción |
|---|---|---|---|
timestamp | boolean | false | Si es true, muestra en el pie de cada página una línea del estilo "Última actualización: 15 de junio de 2026". La fecha proviene del último commit de Git que modificó esa página, así que se mantiene exacta automáticamente en cada build. |
La fecha se muestra en tu sitio publicado y en jamdesk dev. Refleja el commit más reciente que tocó el archivo de cada página, de modo que las páginas que no has editado conservan su fecha original.
SEO
seo.titleTemplate
Tipo: string (opcional)
Valor predeterminado: %s — <nombre>, donde <nombre> es tu name
Define el formato del título de página en la pestaña del navegador y en los resultados de búsqueda. Coloca %s donde debe ir el título de la página. Se reemplazan todos los %s. La plantilla puede tener hasta 200 caracteres. Si no incluye %s, la compilación falla y jamdesk validate muestra el error.
{
"seo": {
"titleTemplate": "%s | Acme"
}
}
Una página con el título Getting started muestra entonces Getting started | Acme. Usa "%s" solo para omitir el nombre del sitio. No cambia og:title ni twitter:title. Consulta Títulos de página para las páginas sin título.
seo.socialCard
Tipo: object (opcional)
Cambia la tarjeta social que Jamdesk genera para cada página. Sin esta clave, las tarjetas mantienen su aspecto predeterminado.
{
"seo": {
"socialCard": {
"theme": "dark",
"brandColor": true
}
}
}
| Campo | Tipo | Predeterminado | Descripción |
|---|---|---|---|
theme | "light" | "dark" | "light" | "dark" usa texto claro sobre un fondo oscuro y tu imagen logo.dark. |
brandColor | boolean | false | Colorea la barra inferior y la insignia de sección con colors.primary (colors.light en una tarjeta oscura). |
accentBar | boolean | true | false elimina la barra del borde inferior de la tarjeta. |
siteName | boolean | true | false oculta el nombre del sitio bajo el logotipo. El nombre permanece cuando la tarjeta muestra tu favicon en lugar del logotipo. |
customImage | "background" | "replace" | "background" | "replace" usa tu og:image como la tarjeta completa, sin texto encima. |
La tarjeta solo puede dibujar logotipos SVG, PNG y JPG, y Jamdesk convierte los archivos de logotipo PNG y JPG a WebP al compilar tu sitio. Usa un logotipo SVG para mostrar tu logotipo completo en la tarjeta. La tarjeta no puede dibujar el texto dentro de un logotipo SVG, así que convierte cualquier texto en contornos (trazados) en tu herramienta de diseño y exporta el SVG de nuevo.
Consulta Personalizar la tarjeta social para saber qué hace cada opción y qué imagen usa una página.
Localización
localization
Tipo: object (opcional)
Controla cómo llegan los visitantes a la versión traducida de tu documentación.
{
"localization": {
"autoRedirect": true
}
}
| Campo | Tipo | Predeterminado | Descripción |
|---|---|---|---|
autoRedirect | boolean | false | Si es true, un visitante que llega por primera vez a la raíz de tu documentación es enviado al idioma que coincide con el encabezado Accept-Language de su navegador. Requiere dos o más entradas en navigation.languages. |
Solo se redirigen las raíces. Un enlace directo como /guides/authentication siempre sirve la página que nombra, de modo que un enlace que pegues en un ticket abre la misma página para todos. Los rastreadores de los motores de búsqueda nunca son redirigidos, así que tus etiquetas hreflang siguen decidiendo qué se indexa.
El idioma del visitante se recuerda durante un año. Elegir un idioma en el selector de idioma sustituye a partir de entonces la coincidencia automática.
Consulta Idiomas → Enrutamiento automático de idioma para el comportamiento completo.
Banner
banner
Muestra una barra de anuncios para todo el sitio, fijada en la parte superior de cada página, sobre el encabezado, a todo el ancho y con el color de acento de tu tema. Úsala para lanzamientos, migraciones, ventanas de mantenimiento o cualquier mensaje que todos los visitantes deban ver.
{
"banner": {
"content": "🎉 Version 2.0 is live! Read the [changelog](/changelog).",
"dismissible": true
}
}
| Campo | Tipo | Predeterminado | Descripción |
|---|---|---|---|
content | string | - | Obligatorio. El texto del banner. Admite formato en línea básico: enlaces [text](url), negrita (**text**) y cursiva (*text*). No se admiten componentes MDX personalizados. |
dismissible | boolean | false | Si es true, muestra un botón de cierre. Cuando un visitante descarta el banner, este permanece oculto para esa persona hasta que cambies content. Al editar el mensaje, el banner vuelve a aparecer. |
El banner se muestra en tu sitio publicado y en jamdesk dev. Se configura de forma global (un solo banner para todo el sitio); por ahora no se admiten banners por pestaña ni por idioma.
OpenAPI
api.openapi
Tipo: string | string[]
Indica los archivos de especificación OpenAPI 3.x que quieres que Jamdesk valide y use para las páginas de endpoint. Usa rutas relativas a tu docs.json.
{
"api": {
"openapi": ["/openapi/api.yaml"]
}
}Una vez configurado, puedes generar páginas de endpoint añadiendo un campo openapi en el frontmatter de una página:
---
title: Create Ticket
openapi: /openapi/api.yaml POST /tickets
---
Si solo tienes una especificación en la lista, también puedes usar el formato corto:
---
title: Create Ticket
openapi: POST /tickets
---
Consulta Ejemplo de OpenAPI para ver una página de endpoint real y Estructura de directorios para saber dónde colocar los archivos.
Si tu sitio es multilingüe, coloca un archivo <spec>.<lang>.<ext> junto a cada especificación de origen (p. ej., openapi/api.fr.yaml) y Jamdesk lo sirve en las URL de ese idioma. Consulta Traducir especificaciones de OpenAPI.
Se acepta una clave asyncapi en cualquier lugar donde se acepta openapi, pero Jamdesk todavía no renderiza especificaciones AsyncAPI: no se genera nada a partir de ella. jamdesk validate emite una advertencia cuando encuentra una, para que una configuración que parece compatible no siga pareciéndolo hasta que compiles el sitio.
navigation openapi (páginas generadas)
Tipo: object
Añade un objeto openapi a una pestaña de navegación y define generate: true, y Jamdesk crea en el build una página de endpoint por cada operación de esa especificación, además de los grupos de la barra lateral que las contienen. No hay nada que redactar ni que confirmar en el repositorio.
{
"navigation": {
"tabs": [
{
"tab": "API Reference",
"openapi": { "source": "/openapi/api.yaml", "generate": true }
}
]
}
}| Clave | Tipo | Descripción |
|---|---|---|
source | string | Ruta a la especificación, relativa a tu docs.json |
generate | boolean | true crea las páginas y la barra lateral. Sin él, la clave no tiene efecto |
Las páginas generadas viven bajo el nombre de la propia pestaña, convertido en slug, con un slug construido a partir del método y la ruta: la pestaña anterior coloca POST /tickets en /api-reference/post-tickets. Las operaciones se agrupan por su primer tag; las especificaciones sin tags recurren al primer segmento significativo de la ruta, de modo que /api/v1/auctions/{auctionId} queda bajo Auctions. Los títulos provienen del summary de la operación cuando la especificación lo tiene y, si no, del método y la ruta; y una operación que apunta a un único recurso lleva el título en singular (GET /users/{id} → "Get User").
generate es opcional por diseño. Un "openapi": "/openapi/api.yaml" suelto en una pestaña, o un objeto sin generate: true, sigue haciendo exactamente lo que hacía antes, así que ninguna configuración existente gana cien páginas en su próximo build.
Un archivo .mdx confirmado en el repositorio siempre gana ante una colisión de slug, por lo que puedes adoptar la generación de forma gradual: actívala y luego elimina tus páginas de endpoint escritas a mano una por una, cuando estés listo.
Si más adelante renombras una ruta en tu especificación, el slug generado se mueve con ella. Jamdesk conserva un historial de slugs por operación y emite en cada build una redirección desde cada URL anterior hasta la actual, de modo que los enlaces entrantes y los marcadores sobreviven al cambio de nombre. Tus propias redirecciones y cualquier página activa siguen teniendo prioridad.
Límites actuales. La generación funciona solo sobre navigation.tabs de nivel superior, no sobre grupos, anchors ni pestañas anidadas bajo languages o versions, y genera páginas únicamente para tu idioma predeterminado. El esquema acepta una clave directory, pero no tiene efecto sobre dónde se colocan las páginas.
api.mdx.server
Tipo: string
URL base usada en los ejemplos de código de las páginas con frontmatter api: (las redactadas en MDX, no las páginas openapi:, que toman sus servidores de la especificación).
{
"api": {
"mdx": {
"server": "https://api.example.com"
}
}
}
Se acepta un array por compatibilidad, pero solo se usa la primera entrada; todo lo que viene después se descarta. jamdesk validate emite una advertencia cuando indicas más de una.
api.examples.languages
Tipo: string[]
Predeterminado: ["curl", "python", "javascript"]
Elige qué lenguajes de programación aparecen en los ejemplos de código de API generados automáticamente en las páginas openapi:. El orden del array determina el orden de las pestañas, y el primer lenguaje queda seleccionado de forma predeterminada.
Valores admitidos: curl, bash, python, javascript, go, ruby, csharp, java, rust, php
bash es un alias de curl; ambos producen el mismo resultado. Usa la etiqueta que prefieras.{
"api": {
"examples": {
"languages": ["curl", "python", "javascript", "go", "ruby", "csharp", "java", "rust", "php"]
}
}
}{
"api": {
"examples": {
"languages": ["python", "javascript", "go"]
}
}
}api.examples.defaults
Tipo: "required" | "all"
Predeterminado: "all"
Controla qué parámetros aparecen en los ejemplos de código generados automáticamente.
| Valor | Comportamiento |
|---|---|
"all" | Los ejemplos incluyen todos los parámetros con valores de marcador de posición |
"required" | Los ejemplos solo incluyen los parámetros marcados como required en la especificación |
{
"api": {
"examples": {
"defaults": "required"
}
}
}
api.examples.prefill
Tipo: boolean
Predeterminado: false
Si es true, el API Playground rellena previamente los campos de parámetros con los valores example de tu especificación OpenAPI.
{
"api": {
"examples": {
"prefill": true
}
}
}
api.playground.display
Tipo: "interactive" | "simple" | "none"
Predeterminado: "interactive"
Controla el API Playground en las páginas de endpoint. De forma predeterminada, aparece un botón "Try it" en todas las páginas openapi: y api:.
| Valor | Comportamiento |
|---|---|
"interactive" | playground completo: rellenar parámetros, generar código y enviar solicitudes (predeterminado) |
"simple" | Rellenar parámetros y copiar el código, pero sin botón Send |
"none" | Playground desactivado |
{
"api": {
"playground": {
"display": "interactive"
}
}
}
Consulta API Playground para ver los detalles de uso y las anulaciones por página.
api.mdx.auth.method
Tipo: "bearer" | "basic" | "key" | "cobo"
Método de autenticación usado en los ejemplos de código generados automáticamente. Cuando se define, los ejemplos incluyen el encabezado de autenticación correspondiente.
| Valor | Formato del encabezado |
|---|---|
"bearer" | Authorization: Bearer <token> |
"basic" | Authorization: Basic <base64> |
"key" | Encabezado personalizado (consulta api.mdx.auth.name) |
"cobo" | Autenticación específica de Cobo |
{
"api": {
"mdx": {
"auth": {
"method": "bearer"
}
}
}
}
api.mdx.auth.name
Tipo: string
Nombre de encabezado personalizado para la autenticación basada en clave. Solo se usa cuando api.mdx.auth.method es "key".
{
"api": {
"mdx": {
"auth": {
"method": "key",
"name": "X-API-Key"
}
}
}
}
Navegación
tabsPosition
Tipo: "top" | "left"
Controla dónde se muestran las pestañas de navegación.
| Valor | Descripción |
|---|---|
"top" | Las pestañas aparecen en la barra de pestañas del encabezado |
"left" | Las pestañas aparecen en la parte superior de la barra lateral |
El valor predeterminado depende de tu tema:
| Tema | Predeterminado |
|---|---|
| jam | "left" |
| nebula | "left" |
| pulsar | "top" |
| halo | "left" |
| dusk | "left" |
{ "tabsPosition": "left" }
tabsAlignment
Tipo: "start" | "center" | "end"
Define la alineación horizontal de la fila de pestañas cuando están en el encabezado (tabsPosition: "top"). No tiene efecto con tabsPosition: "left" ni en el tema Pulsar, que coloca las pestañas superiores en el lado derecho del encabezado.
| Valor | Descripción |
|---|---|
"start" | Las pestañas quedan a la izquierda del encabezado (predeterminado) |
"center" | Las pestañas se centran en el encabezado |
"end" | Las pestañas quedan a la derecha del encabezado |
{ "tabsPosition": "top", "tabsAlignment": "center" }
anchors
Tipo: array
Enlaces externos que aparecen en la parte superior de la barra lateral en todas las páginas.
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
name | string | Sí | Texto que se muestra |
href | string | Sí | URL (enlace externo) |
icon | string | No | Nombre de icono de Font Awesome |
{
"anchors": [
{ "name": "Blog", "href": "https://blog.example.com", "icon": "newspaper" }
]
}
navigation (estructura)
Tipo: object
La estructura de navegación de tu documentación. Consulta Navegación para ver la documentación detallada.
Las páginas pueden ser cadenas (el título se genera automáticamente a partir del nombre del archivo) u objetos con un título personalizado:
"pages": [
"introduction",
{ "page": "content/mdx-basics", "title": "MDX Basics" }
]
{
"navigation": {
"tabs": [
{
"tab": "Docs",
"icon": "book-open",
"groups": [
{
"group": "Getting Started",
"pages": ["introduction", "quickstart"]
}
]
}
]
}
}Barra de navegación y pie de página
navbar
Tipo: object
| Campo | Tipo | Descripción |
|---|---|---|
links | array | Enlaces de navegación |
links[].label | string | Texto predeterminado del botón |
links[].labels | object | Anulaciones opcionales por idioma, indexadas por código de idioma (p. ej. fr, es). Si falta, se usa label |
links[].icon | icon | Icono opcional que se muestra junto a la etiqueta |
links[].href | string | URL de destino |
primary | object | Botón principal de llamada a la acción |
primary.label | string | Texto predeterminado del botón |
primary.labels | object | Anulaciones opcionales por idioma, indexadas por código de idioma. Si falta, se usa 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 es opcional. La documentación de un solo idioma puede omitirlo. Cuando se define, el idioma de la URL actual (p. ej. /fr/...) selecciona la anulación correspondiente.
footer
Tipo: object
Configura el pie de página con enlaces a redes sociales y columnas de enlaces personalizadas.
{
"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" }
]
}
]
}
}
| Campo | Tipo | Descripción |
|---|---|---|
socials | object | URL de las plataformas de redes sociales |
links | array | Configuraciones de las columnas de enlaces |
links[].header | string | Encabezado de la columna |
links[].items | array | Array de objetos { label, href } |
Plataformas sociales admitidas: github, x, twitter, linkedin, discord, slack, youtube, instagram, facebook, reddit, telegram, bluesky, threads, medium, hacker-news, website
Estilos
styling.latex
Tipo: boolean
Activa el renderizado de matemáticas con LaTeX mediante KaTeX. Cuando está activado, puedes usar $...$ para matemáticas en línea y $$...$$ para ecuaciones en bloque.
{
"styling": {
"latex": true
}
}
Consulta Matemáticas y LaTeX para ver los detalles de uso.
styling.js
Tipo: string | string[]
Archivos JavaScript personalizados que se incluyen en cada página. Las rutas son relativas a tu directorio de documentación y deben empezar por /.
{
"styling": {
"js": "/script.js"
}
}
Pasa un array para varios archivos:
{
"styling": {
"js": ["/chat.js", "/analytics.js"]
}
}
Sin este campo, Jamdesk detecta automáticamente los archivos .js en la raíz de tu proyecto. Consulta JavaScript personalizado para más detalles.
Búsqueda
search
Tipo: object (opcional)
Personaliza la barra de búsqueda de la documentación. La búsqueda funciona de inmediato; solo necesitas este campo para cambiar el texto de marcador de posición o mostrar páginas populares en el estado vacío.
| Campo | Tipo | Predeterminado | Descripción |
|---|---|---|---|
prompt | string | Search documentation… | Texto de marcador de posición que se muestra en el campo de búsqueda |
popularPages | array | Quick Start, Introduction | Enlaces de acceso rápido que se muestran antes de que el visitante escriba una consulta |
{
"search": {
"prompt": "Ask me anything…",
"popularPages": [
{ "title": "Quick Start", "slug": "quickstart", "icon": "rocket" },
{ "title": "Authentication", "slug": "guides/authentication", "icon": "key" }
]
}
}
Páginas populares
Cada entrada de popularPages acepta:
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
title | string | Sí | Etiqueta que se muestra para el enlace |
slug | string | Sí | Ruta de la página, sin barra inicial ni extensión .mdx (por ejemplo quickstart, o guides/authentication para el archivo guides/authentication.mdx) |
icon | string | No | Nombre de icono de Font Awesome que se muestra junto al enlace (por ejemplo rocket o bell) |
El campo icon también acepta el objeto completo { "name", "style", "library" }. Consulta Forma de objeto de icono. Cuando se omite popularPages, Jamdesk muestra Quick Start e Introduction de forma predeterminada.
Chat
chat
Tipo: object (opcional)
Configura el asistente de chat con IA integrado. El chat está activado de forma predeterminada en todos los sitios; solo necesitas este campo para personalizar las preguntas iniciales, el nombre y el icono del botón, o para desactivarlo.
| Campo | Tipo | Predeterminado | Descripción |
|---|---|---|---|
enabled | boolean | true | Define false para quitar el panel de chat de tu sitio |
starterQuestions | string[] | generadas automáticamente | Hasta 4 preguntas que se muestran al abrir el chat (de 5 a 200 caracteres cada una). Se generan automáticamente durante los builds cuando se omite. Define [] para no mostrar ninguna |
label | string | "Ask AI" en el idioma de la página | Sustituye "Ask AI" en el botón del chat, el encabezado del panel y el atajo de búsqueda. Hasta 40 caracteres. Se aplica a todos los idiomas. |
icon | string | sparkles | Un nombre de icono de Font Awesome, una URL de imagen o una ruta a una imagen de tu proyecto. Un icono de Font Awesome sigue tu color de acento; una imagen se muestra tal cual, así que usa una que se lea bien sobre fondos claros y oscuros. |
{
"chat": {
"label": "Acme Assistant",
"icon": "/images/assistant.svg",
"starterQuestions": [
"How do I get started?",
"What API endpoints are available?"
]
}
}
Consulta Chat con IA para ver cómo funciona el chat y qué ven los visitantes.
Menú de acciones de IA
contextual
Tipo: object (opcional)
Configura el menú desplegable de acciones de IA que aparece en cada página. Está activado de forma predeterminada con todas las opciones; solo necesitas este campo para personalizar qué opciones aparecen o para desactivarlo.
| Campo | Tipo | Predeterminado | Descripción |
|---|---|---|---|
enabled | boolean | true | Define false para quitar el menú de acciones de IA de tu sitio |
options | array | todas las integradas | Lista de claves de opción y/o objetos de opciones personalizadas |
Claves de opción integradas: copy, view, chatgpt, claude, perplexity, gemini, mcp, cursor, vscode
{
"contextual": {
"options": ["copy", "claude", "mcp", "cursor"]
}
}
Añade opciones personalizadas junto a las integradas:
{
"contextual": {
"options": [
"copy",
"claude",
{
"title": "Ask on Discord",
"description": "Get help from the community",
"icon": "discord",
"href": "https://discord.gg/your-server"
}
]
}
}
Consulta Menú de acciones de IA para ver la lista completa de opciones y el formato de las opciones personalizadas.
Corrector ortográfico
spellcheck
Tipo: object (opcional)
Configura el comando jamdesk spellcheck de la CLI. Solo necesitas este campo para añadir palabras específicas del proyecto a la lista de ignoradas.
| Campo | Tipo | Descripción |
|---|---|---|
ignore | string[] | Palabras que se omiten durante la revisión ortográfica (nombres de producto, términos técnicos, etc.) |
{
"spellcheck": {
"ignore": ["Acme", "kubectl", "Terraform"]
}
}
La CLI incluye más de 180 términos tecnológicos integrados (API, GraphQL, Kubernetes, React, etc.) e ignora automáticamente el nombre de tu proyecto tomado del campo name. Añade solo las palabras específicas de tu proyecto.
Consulta Visión general de la CLI: Spellcheck para ver los detalles de uso y el modo interactivo de corrección.
Imágenes
images.convertToWebp
Tipo: boolean (opcional, valor predeterminado false)
Activa la conversión automática a WebP de los recursos PNG y JPG durante los builds. Los archivos convertidos suelen pesar entre un 60 y un 80 % menos que los originales, sin pérdida visible de calidad. Las referencias en tu MDX, tu CSS personalizado, tu JS personalizado y docs.json se reescriben automáticamente, así que no tienes que cambiar ninguna ruta.
Los favicons, og:image y twitter:image se quedan en su formato original. No todos los rastreadores sociales ni clientes de correo renderizan WebP de forma fiable, y una tarjeta de vista previa rota es peor que un JPG ligeramente más grande.
{
"images": {
"convertToWebp": true
}
}
Consulta Conversión automática de imágenes para saber qué se convierte, cómo funciona la caché y cómo es el indicador de progreso del build.
Control de acceso
auth.password
Tipo: object (opcional)
Activa la protección del sitio con una contraseña compartida. Es solo configuración declarativa. La contraseña en sí la defines en el dashboard después de que se ejecute el siguiente build.
Define auth.password.enabled: true para bloquear todo el sitio, o enumera rutas en auth.password.private[] para proteger solo esas páginas. Ambas opciones activan el mismo aviso de contraseña en el dashboard en el siguiente build.
{
"auth": {
"password": {
"enabled": true,
"hint": "Ask your account manager",
"public": ["/marketing/**", "/changelog"]
}
}
}
| Campo | Tipo | Descripción |
|---|---|---|
enabled | boolean | Modo de sitio completo. Si es true, todas las páginas requieren la contraseña (excepto las marcadas como públicas). |
hint | string (máx. 200 caracteres) | Pista en texto plano que se muestra en la pantalla de desbloqueo. Sin HTML. |
public | string[] | Patrones glob de rutas que omiten la contraseña. Admite * (un segmento) y ** (recursivo). Un / solo se rechaza. |
private | string[] | Rutas exactas que requieren la contraseña. Definirlo sin enabled activa el modo de páginas específicas. |
Consulta Protección con contraseña para ver el recorrido completo, incluido el flujo del dashboard y cómo interactúan con estos arrays los valores public: true / private: true del frontmatter.
auth.jwt
Tipo: object (opcional)
Protege todo el sitio con tu propio sistema de inicio de sesión. Tu backend firma un token de corta duración para cada usuario que ha iniciado sesión y Jamdesk lo intercambia por una cookie de sesión. La clave de firma se genera en el dashboard, no en este archivo. auth.jwt y auth.password no pueden estar activados a la vez; un build con ambos activados falla con un config_error.
{
"auth": {
"jwt": {
"enabled": true,
"loginUrl": "https://app.example.com/docs-login",
"public": ["/changelog/**", "/status"]
}
}
}
| Campo | Tipo | Descripción |
|---|---|---|
enabled | boolean | Activa la autenticación JWT. Todas las páginas requieren una sesión, excepto las marcadas como públicas. |
loginUrl | string | Obligatorio cuando enabled es true. Una URL https:// absoluta de tu lado. Los visitantes sin sesión son enviados aquí con ?redirect=<path> para que puedas devolverlos a la página que pidieron. |
public | string[] | Patrones glob de rutas que siguen siendo accesibles sin iniciar sesión. Misma sintaxis que auth.password.public, y se combinan con public: true del frontmatter y con "public": true en los grupos de navegación. |
El acceso por página, además de esto, proviene de groups en el frontmatter de la página. Consulta Autenticación JWT para ver el formato del token, el flujo de redirección y cómo funcionan los grupos.
Ejemplo completo
{
"$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"]
}
]
}
]
}
}