NODE_02
KastMe
Portfolio interactif en une adresse, pour artistes, mannequins et photographes.
- Rôle
- Fondateur, conception et développement
- Période
- 2025 à aujourd'hui
- Statut
- En construction
- Stack
- Next.js 16 · React 19 · TypeScript · Firebase Auth · Firestore · Cloud Storage · Tailwind 4 · Zod · Vitest · Vercel
- Liens
- Voir en ligne

Le problème

Un photographe ou un mannequin met en bio un lien vers une liste de liens. Sa meilleure image est à trois clics. KastMe remplace la liste par une page publique kastme.fr/son-slug où ses images et ses vidéos flottent dans une sphère que le visiteur fait tourner au doigt. Le produit est en ligne, en construction : la vitrine, l'inscription, l'éditeur et les pages publiques tournent ; la facturation n'est pas encore branchée.
Les contraintes
- La page publique doit être rapide et partageable : elle sera ouverte depuis Instagram ou TikTok, sur mobile, en 4G, et son aperçu doit être beau dans les messageries.
- Chaque créatif possède son adresse. Le slug est une ressource rare et doit être unique, sans course entre deux inscriptions simultanées.
- Les clés Firebase du client sont publiques par conception. La sécurité ne peut reposer que sur les règles.
Les décisions d'architecture
Page publique en SSR avec revalidation, image de partage dynamique
La route [slug] est rendue côté serveur et mise en cache par ISR. Chaque page génère sa propre image Open Graph à partir des médias du créatif, pour que le lien partagé montre son travail et pas un logo. L'ancienne forme d'URL p/[id] est redirigée en 301 vers le slug.
Ne jamais transformer une panne de base en 404
C'est la règle la plus importante du dépôt. Une page publique en ISR qui répond notFound() à cause d'une indisponibilité passagère de Firestore fige un 404 dans le CDN pour tous les visiteurs de ce créatif. Les erreurs d'infrastructure remontent donc en exception, donc en 500 non mis en cache, et seule l'absence réelle du document produit un 404.
Réserver les noms de routes, et le vérifier par un test
app/[slug] vit à la racine et une route statique gagne toujours sur une route dynamique. Ajouter app/blog/ sans réserver blog remplacerait en silence la page du créatif qui possède ce slug. La liste des slugs réservés est partagée entre le routeur et les règles Firestore, et un test unitaire échoue si un segment de route n'y figure pas.
Unicité du slug par une collection en création seule
Une collection slugs/{slug} accepte la création et refuse la mise à jour. Deux inscriptions simultanées sur le même nom ne peuvent pas réussir toutes les deux : la deuxième écriture est rejetée par les règles, pas par une vérification applicative qu'une course pourrait contourner.
Architecture
Sécurité par les règles
users/{uid} n'est jamais inscriptible par le client : le plan et le rôle ne changent que côté serveur via le SDK Admin. Les portfolios sont lisibles publiquement et modifiables par leur propriétaire seul. Le stockage cantonne l'écriture au dossier de l'utilisateur, avec des types de fichiers autorisés et des plafonds de 10 Mo par image et 50 Mo par vidéo. Toute modification des règles passe par les tests sur l'émulateur avant déploiement.