> ## Documentation Index
> Fetch the complete documentation index at: https://docs.camellapp.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Visión general

> El stack de CamellApp y cómo encajan sus piezas.

## Stack

CamellApp corre sobre un stack con varias versiones no obvias:

| Capa          | Tecnología                                |
| ------------- | ----------------------------------------- |
| Framework     | Next.js 16 (App Router)                   |
| UI            | React 19                                  |
| Lenguaje      | TypeScript 7                              |
| Datos         | Prisma 7, con driver adapter para MariaDB |
| Estilos       | Tailwind 4                                |
| Validación    | Zod 4                                     |
| Lint / format | Biome 2                                   |
| Auth          | NextAuth v4                               |
| Tests         | Vitest 4                                  |

## Por qué `useTypeScriptCli`

TypeScript 7 no expone el compiler API que Next.js usa por defecto. Por eso
`next.config.ts` activa una bandera experimental:

```ts theme={null}
const nextConfig: NextConfig = {
  experimental: {
    useTypeScriptCli: true,
  },
  // ...
};
```

<Warning>
  No quites `experimental.useTypeScriptCli` de `next.config.ts`. Sin ella,
  Next.js no puede tipar el proyecto con TypeScript 7.
</Warning>

## Flujo de una petición

A alto nivel, así encajan las piezas:

* Next.js sirve tanto la UI como los route handlers de API (`/api/*`).
* Prisma habla con MySQL/MariaDB.
* NextAuth gestiona la sesión por cookie.
* Los uploads (avatares y fotos de camellos) viven en `public/uploads/`.
* Los trabajos (`Job`) siguen un ciclo propio: el cliente los solicita desde
  Explorar o desde `/trabajos/nuevo`, el admin asigna un camello y el camello
  acepta o rechaza. WhatsApp queda como coordinación secundaria una vez
  aceptado el trabajo.

## Uploads

`public/uploads/` está gitignored y **no se sirve como estático en
producción**: Next.js solo indexa el contenido de `public/` al arrancar, así
que cualquier archivo escrito ahí en runtime queda invisible para el
servidor de estáticos.

Por eso las imágenes subidas en runtime se sirven a través de un route
handler dedicado, `src/app/uploads/[...path]/route.ts`. Toda escritura y
lectura de imágenes pasa por `src/lib/upload-image.ts`, que aplica las mismas
reglas en ambos sentidos:

* Subdirectorios permitidos: `avatars` y `camellos`.
* Tamaño máximo: 2 MB.
* Formatos aceptados: JPEG, PNG o WebP.
* Los nombres de archivo se sanean antes de escribirlos a disco.
