Una **fuente** es una carpeta con Markdown: en este repositorio o en otro, en el
checkout actual o en refs con nombre. La lista `sources` es el único sitio donde
se declaran, y todo lo demás se genera a partir de ella.

```ts [app/app.config.ts]
sources: [
  { path: 'docs', slug: 'acme' },
  { repo: 'acme/api', path: 'docs', refs: ['main', 'v2.0.0', 'v1.4.0'] }
]
```

Dos repositorios y tres refs: cinco colecciones, los prefijos de URL que las
sirven, un selector de versiones, las reglas de redirección y las entradas del
sitemap. Nada de eso se escribe a mano. Cada campo está en la
[referencia de fuentes](/reference/sources).

## Cómo funciona

Content v3 ya hace la mitad difícil. La fuente de una colección acepta una URL
de repositorio, una rama o etiqueta y credenciales, y Content la descarga y la
cachea por hash — múltiples repositorios, repositorios privados y leer desde una
etiqueta ya existen ahí. duxt no reimplementa nada de eso.

Lo que duxt añade ocurre al cargar la configuración. `content.config.ts` es
código ejecutado, no un archivo de datos, así que puede leer el `app.config.ts`
del sitio y calcular sus colecciones a partir de esa lista — una colección por
repositorio × ref, cada una con un `cwd` absoluto, un nombre derivado del slug y
el esquema de página que necesita el tema. La misma lista la resuelve una
segunda vez la compilación, en el **manifiesto**: qué colección sirve qué
prefijo de URL, qué ref es la predeterminada, de dónde vino cada página. Ese
manifiesto es lo que lee el tema, y se escribe de vuelta en la configuración de
la app como `resolvedSources`.

## Por qué está construido así

Declarar las colecciones a mano no escala en la única dirección en la que la
documentación realmente crece: tres versiones en catorce repositorios son
cuarenta y dos declaraciones, y cada publicación edita las catorce. El atajo
mantiene la lista tan larga como el número de proyectos.

El coste es que una lista de fuentes expresa menos que una colección escrita a
mano. Es un intercambio deliberado: quien necesite algo que el atajo no sepa
decir escribe su propio `content.config.ts` y toma el control por completo,
porque Content combina el archivo de cada capa y gana el posterior.

## Lo que se obtiene de paso

Como una fuente nombra un repositorio, una ref y una carpeta, varias funciones
no necesitan configuración propia: «Editar esta página», la fecha de última
actualización y la lista de personas que han contribuido se derivan de ahí. Leer
el historial de una fuente **remota** cuesta un clon completo, así que espera a
`history: true` — un clon superficial informaría del autor de la punta para cada
archivo, y eso son datos erróneos, no datos ausentes.