Un sitio duxt es una aplicación Nuxt. Cualquier cosa que ejecute Nuxt lo
ejecuta.

## Pasos

:::steps
1. **Prefiere estático.** `nuxt generate` produce una carpeta de HTML — sin
   servidor, sin coste de ejecución, cada página cacheada en el borde. Es la
   opción correcta por defecto para documentación.

   ::package-managers{command="run generate"}
   ::

   `nuxt build` produce un servidor Node, que solo necesitas si una página debe
   reaccionar a una petición.

2. **Dale a la compilación lo que necesita.** Node 24 (la base de datos se lee
   mediante `node:sqlite`, así que no se instala ningún controlador nativo),
   acceso de red a cualquier fuente remota y un token para las privadas.

3. **Define el origen.** `NUXT_PUBLIC_I18N_BASE_URL`, o `i18n.baseUrl` en la
   configuración. Sin él, `hreflang`, `canonical`, el sitemap y las tarjetas
   sociales recaen en salida relativa.

4. **Define un secreto de imagen OG si despliegas más de una instancia.**
   `NUXT_OG_IMAGE_SECRET`, generado una vez. Sin él cada compilación firma las
   URL de imagen con un secreto propio, y una tarjeta firmada por una instancia
   es rechazada por la siguiente.

5. **Programa una recompilación.** Un sitio que lee otro repositorio recoge sus
   cambios cuando compila, no cuando se publican.

:::

## Por qué no hay refresco en ejecución

Content descarga un repositorio remoto al compilar y lo compila en la base de
datos que la compilación entrega. Refrescar eso en ejecución significaría
reconstruir la base de datos dentro de un servidor vivo — Content no ofrece
ninguna vía soportada para ello, y la única disponible es la misma base de datos
de cliente que lee la búsqueda. Una recompilación programada, o disparada desde
el repositorio de origen, mantiene el despliegue inmutable y el contenido
reproducible.

## Cuando una compilación dice `database is locked`

Content guarda su caché de análisis en `.data/content/contents.sqlite`, y una
compilación que el kernel o un `Ctrl-C` dejó atrás puede seguir reteniéndola.
Cada compilación posterior falla entonces con `database is locked` — un mensaje
que no nombra ni el archivo ni el proceso.

duxt pone esa base de datos en [modo WAL](https://www.sqlite.org/wal.html) antes
de que Content la abra, lo que permite que un lector y un escritor convivan y
elimina por completo la versión cotidiana de esto. Lo que no puede eliminar es
un segundo proceso todavía en marcha:

```bash
pgrep -af 'nuxt (build|dev|generate)'   # el proceso huérfano, si lo hay
kill <pid>
```

Si no aparece nada y el error persiste, borra `.data/content/`: es una caché, y
la siguiente compilación la reconstruye desde las fuentes.

## Qué sirve el sitio además de páginas

`/llms.txt`, `/llms-full.txt`, el código `.md` de cualquier página, `/mcp`,
`/sitemap.xml`, `/robots.txt` y — una vez configurado — `/rss.xml`. La lista
completa con sus salvedades está en la
[referencia de endpoints](/reference/endpoints).

## Lista de comprobación

- [ ] `nuxt generate` termina sin error del validador
- [ ] El origen está definido en el despliegue, no solo en local
- [ ] `/sitemap.xml` lista URL absolutas en el dominio real
- [ ] Hay una recompilación programada, o disparada desde cada repositorio de
      origen
- [ ] `NUXT_OG_IMAGE_SECRET` está definido si más de una instancia sirve el
      sitio