Branche `svelte` : le hub est un site **100 % statique** (SvelteKit + adapter-static, prerender intégral). Les données PeerTube / Castopod / Mastodon sont **récupérées au build** : pour rafraîchir le contenu, on rebuild (cron, webhook ou CI).
-`script-src` est délivré **par page** via une balise `<meta http-equiv="Content-Security-Policy">` injectée par `scripts/postbuild-csp.mjs` : chaque page ne déclare que les empreintes SHA-256 de ses scripts inline (script de démarrage SvelteKit + JSON-LD). Aucun `'unsafe-inline'` pour les scripts.
- Seules exceptions sortantes (chargement de ressources) : les instances de l'écosystème first-party `gade.o-k-i.net` (vignettes, embeds, flux), `kute.o-k-i.net` (audio, pochettes), `bokante.o-k-i.net` (médias Mastodon). Aucun autre domaine tiers.
## PWA
-`manifest.webmanifest` + service worker Workbox (`vite-plugin-pwa`, generateSW) : précache du shell, `navigateFallback: /offline/index.html`.
- Enregistrement par `static/registerSW.js` (chemins absolus), jamais par injection du plugin.
Toute la configuration d'instance vit dans `src/lib/config.ts` (équivalent des anciennes constantes PHP) : instances agrégées, catégories prioritaires, hashtags, hero, dons, bloc « À propos » (`about`), annonce du prochain live (`nextLive`) et **verrou maintenance** (`countdown`). Quand `countdown.enabled` vaut `true`, le build rend la page de compte à rebours multi-fuseaux (titre kréyòl, redirection automatique à l'échéance) à la place de tout le site — l'équivalent statique de l'ancien `COUNTDOWN_ENABLED`.
npm run build # fetch des données + prerender + CSP
```
Puis, sur le build : zéro requête tierce au chargement hors instances de l'écosystème (onglet réseau), toutes les routes historiques redirigées, `sitemap.xml` et `robots.txt` servis.