# Générateur de portfolios — Figures Libres App **Nuxt 3** (+ Nuxt UI v3) qui lit les projets du CMS Grav de Figures Libres et compose des **portfolios A3 paysage** exportés en PDF, fidèles au gabarit `book_v3`. Dépôt **autonome et déployable seul** : son `Dockerfile` (base Playwright + Ghostscript + ffmpeg + rsync) est inclus. En dev, il se lance via le dépôt d'orchestration `portfolio-stack`, qui le clone en `./generator` et le monte en volume sur le port **8091** (mot de passe partagé : `figureslibres`). ## Lancer Tout tourne dans Docker (rien sur l'hôte). Depuis le dépôt stack : ```bash docker compose up -d # dev (port 8091) docker compose run --rm --no-deps generator npm install # dépendances docker compose exec generator npm run build # build de prod (.output) ``` ## Repères - `server/lib/` — `content-source` (dev FS Grav `:ro` / prod cache rsync), `grav-reader` (parse Grav → `Project`), `pdf-pipeline` (Playwright → PDF A3, images 2× via sharp, post-traitement Ghostscript), `portfolio-store` (gel/dégel). - `server/api/` — auth, projects, portfolios, media, sync, exports, public. - `components/` — `templates/` (cover, toc, projet, grille, page libre), `preview/` (rendu + aperçu), `composer/` (UI de composition). - `pages/print/[id].vue` — rendu print utilisé pour la génération PDF. - `types/index.ts` — modèle de données (source de vérité du schéma). Voir `CLAUDE.md` pour l'architecture détaillée, les contraintes fermes et les pièges Chromium print. ## Données Sur disque dans `data/` (git-ignoré) : `portfolios/*.json`, `exports/*.pdf`, `frozen//` (snapshots figés à la génération), `cache/` (régénérable), `content-cache/` (rsync prod).