Pack images HallesX — Nano Banana (gemini-2.5-flash-image)
Générer
GEMINI_API_KEY=xxx node scripts/generate-images.mjs # tout (~100 img, ~3,90 $)
GEMINI_API_KEY=xxx node scripts/generate-images.mjs --only=cat/ # une famille
Relance = ne régénère que les manquantes. Les images tombent dans public/img/** et le site les affiche automatiquement (fallback élégant si absentes : illustrations SVG / dégradés).
Les bonnes pratiques appliquées
- Un STYLE unique verrouillé (bloc de texte identique en tête de chaque prompt) : illustration éditoriale minimale française, palette limitée à la charte (crème/vert jardin/terracotta/miel), lumière du matin à gauche, ombres 45°, grain papier. C'est LA technique de cohérence recommandée : même vocabulaire, même éclairage, même système sur toutes les images.
- Jamais de texte dans les images (
no text, no letters) : la typo reste Fraunces/DM Sans dans le HTML — netteté parfaite, i18n possible, zéro faute générée. - Le bon format par emplacement (ratios natifs du modèle) :
- héros pleine largeur → 21:9 (1536 px)
- héros de landing → 16:9
- cartes filières / halles → 4:3
- scènes métier → 3:2
- La déclinaison, pas la variation : une seule « cagette » déclinée sur les 10 filières (même cadrage, même angle) — la série se lit comme une collection.
L'inventaire (100 images)
- 4 héros (home 21:9, cote 4:3, halles 21:9, pro 16:9)
- 10 cagettes de filière (4:3) — légumes, fruits, herbes, champignons, baies, agrumes, salades, tubercules, marée, viandes
- 8 scènes métier (3:2) — acheteur au marché, tire-palette, camion frigo, vélo-cargo, carreau à l'aube, pesée, criée marée, facture
- 4 saisons (21:9)
- 3 tailles de culture (4:3) — balcon, micro-ferme, grande exploitation
- 52 héros de landing (16:9) — un par profil/produit/territoire/feature
- 7 features complémentaires + 12 halles (16:9)
Câblage déjà en place
lib/img.ts→siteImg(rel): le composant affiche l'image si le fichier existe, sinon le fallback (SVGMarketHeroArt, dégradés de filière…).- Branché sur : héros de la cote, héros des 52 landings, cartes des places phares (/marches).
Coûts : ce qui reste, ce qui se rend, ce qui s'anime
Règle d'or : on ne paie jamais deux fois la même image.
| Famille | Génération | Persistance | Coût récurrent |
|---|---|---|---|
| Pack illustratif (101 images Nano Banana) | une seule fois, en local | committé dans public/img/**, copié dans l'image Docker, cache 30 j | 0 € après les ~3,94 $ initiaux |
| Vignettes OG (149, avec données : prix, séances…) | au build, par next/og (satori, local) | fichiers statiques du build, cache 24 h | 0 € — aucun appel d'API, jamais |
| Vidéos données (Remotion, à venir) | offline (cron nightly ou manuel), rendu local/CI | MP4 committés dans public/video/** | 0 € — le rendu est du CPU CI, pas une API |
Le générateur scripts/generate-images.mjs est idempotent : il saute toute image déjà présente. Relancer le script ne régénère que les manquantes — on ne peut pas payer deux fois par accident. Pour refaire UNE image : supprimer le fichier puis relancer avec --only=<chemin>.
Remotion (vidéos avec données réelles) — plan
Même philosophie que les OG : composition React qui lit data/rnmdb, rendue hors requête (cron hebdo), sortie MP4 committée et servie statiquement. Premiers candidats : « la semaine du marché » 15 s (top hausses/baisses animées, bandeau saison) pour la home et les réseaux, et une déclinaison par halle. À scaffolder sur demande — lourd en dépendances, on l'ajoute quand on veut la première vidéo, pas avant.