Ton premier projet
Les modes, le CLAUDE.md, le prompting, tu as tous les outils. Il est temps de construire.
On va créer une landing page de waitlist fonctionnelle en 15 minutes. Pas une TODO app. Une vraie page avec un formulaire d'inscription, un stockage des emails et un compteur de personnes inscrites. C'est une mini-version de LaunchList, le projet fil rouge du parcours Premium.
À la fin de ce chapitre, tu auras quelque chose que tu pourras montrer, et tu te diras : "J'ai fait ça en 15 minutes ?"
Ce qu'on va construire
Une landing page Next.js avec :
- Un titre accrocheur et une description du produit
- Un formulaire d'inscription par email
- Un stockage des emails dans un fichier JSON (simple, pas de base de données)
- Un compteur qui affiche le nombre de personnes sur la waitlist
- Un message de confirmation après l'inscription
C'est volontairement simple. Pas de base de données, pas d'authentification. Juste une page qui fonctionne, pour démontrer la puissance du workflow Claude Code.
Créer le projet Next.js
Terminal
npx create-next-app@latest waitlist-page --typescript --tailwind
cd waitlist-page
Accepte les options par défaut (App Router, ESLint, src/ directory).
Avant d'ouvrir Claude Code, fais un git init et un premier commit. Comme ca tu as toujours un point de retour si Claude fait des modifications inattendues.
Ensuite, ouvre Claude Code dans le projet :
Terminal
claude
Créer le CLAUDE.md
Première mise en pratique de ce que tu as appris. Avant de demander quoi que ce soit à Claude, on cadre le projet.
Prompt
Crée un fichier CLAUDE.md à la racine avec ces informations :
## Projet
Landing page de waitlist. Stack : Next.js, TypeScript, Tailwind CSS.
## Conventions
- App Router (src/app/)
- Server Actions pour la logique serveur
- Fichier JSON pour stocker les emails (data/waitlist.json)
- Validation côté serveur
## Commandes
- npm run dev : serveur de développement
- npm run build : build de production
Claude va créer le fichier. Valide la modification.
On commence toujours par le CLAUDE.md. C'est le réflexe à ancrer. Même pour un projet de 15 minutes, ça change la qualité des réponses de Claude.
Planifier avec Plan Mode
Active le Plan Mode (Shift+Tab x2) et envoie ce prompt :
Prompt
Crée une landing page de waitlist avec les éléments suivants :
Page principale (src/app/page.tsx) :
- Titre "Rejoins la waitlist" avec une description courte
- Formulaire avec un champ email et un bouton "S'inscrire"
- Compteur affichant "X personnes déjà inscrites"
- Message de confirmation après inscription réussie
Logique serveur :
- Server Action pour traiter le formulaire
- Lire/écrire dans data/waitlist.json
- Valider le format de l'email
- Empêcher les doublons
Style : moderne, centré sur la page, responsive.
Claude va analyser le projet et proposer un plan. Voici le type de plan que tu devrais obtenir :
Lis le plan. Est-ce que ça correspond à ce que tu veux ? Si oui, valide avec "go" ou "ok". Si tu veux ajuster quelque chose, dis-le maintenant, c'est le moment.
Implémenter
Une fois le plan validé, Claude passe à l'implémentation. Tu peux activer l'auto-accept (Shift+Tab) pour qu'il enchaîne sans te demander confirmation à chaque fichier.
Claude va créer plusieurs fichiers. Voici les lignes clés de la Server Action, le coeur de la logique :
src/app/actions.ts (extrait)
'use server'
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs'
import { join } from 'path'
const DATA_PATH = join(process.cwd(), 'data', 'waitlist.json')
interface WaitlistData {
emails: string[]
}
function getWaitlistData(): WaitlistData {
if (!existsSync(DATA_PATH)) {
return { emails: [] }
}
const raw = readFileSync(DATA_PATH, 'utf-8')
return JSON.parse(raw)
}
function saveWaitlistData(data: WaitlistData) {
const dir = join(process.cwd(), 'data')
if (!existsSync(dir)) {
mkdirSync(dir, { recursive: true })
}
writeFileSync(DATA_PATH, JSON.stringify(data, null, 2))
}
export async function joinWaitlist(formData: FormData) {
const email = formData.get('email') as string
// Validation
if (!email || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
return { error: 'Adresse email invalide.' }
}
const data = getWaitlistData()
// Doublon
if (data.emails.includes(email)) {
return { error: 'Cette adresse est déjà inscrite.' }
}
data.emails.push(email)
saveWaitlistData(data)
return { success: true, count: data.emails.length }
}
C'est une Server Action Next.js. Le formulaire envoie les données au serveur, qui valide, stocke et répond. Pas d'API route à configurer, pas de fetch manuel. C'est la puissance de l'App Router.
Teste le résultat :
Terminal
npm run dev
Ouvre http://localhost:3000 dans ton navigateur. Tu devrais voir ta landing page avec le formulaire.
Ce qui va (probablement) mal tourner
C'est la partie la plus importante de ce chapitre. Claude est impressionnant, mais il fait des erreurs récurrentes. Les connaître, c'est savoir les corriger en 30 secondes au lieu de perdre 20 minutes.
Le fichier JSON n'existe pas
Le fichier data/waitlist.json n'existe pas au démarrage. Assure-toi de créer le dossier et le fichier s'ils n'existent pas. Claude va ajouter la vérification dans la Server Action.Pas de validation email
Ajoute une validation d'email côté serveur dans la Server Action. Utilise une regex pour vérifier le format. C'est un oubli classique, Claude se concentre sur la logique principale et oublie les garde-fous.Ces erreurs ne sont pas des échecs. C'est le fonctionnement normal du développement avec l'IA. Tu demandes, tu testes, tu corriges. L'itération fait partie du processus. Le développeur qui sait itérer efficacement est celui qui livre le plus vite.
Itérer
Ta page fonctionne. Maintenant, améliorons-la. Ajoute un compteur visible qui montre la traction :
Prompt
Ajoute un compteur visible au-dessus du formulaire qui affiche
"X personnes sont déjà sur la waitlist".
Le compteur doit :
- Se mettre à jour après chaque inscription (sans recharger la page)
- Afficher 0 si la liste est vide
- Utiliser un style qui attire l'oeil (badge ou texte accentué)
Claude va modifier la page pour lire le compteur au chargement et le mettre à jour après chaque inscription. C'est un bon exemple d'itération : tu pars d'une base fonctionnelle et tu ajoutes des features une par une.
Tu peux continuer à itérer. Quelques idées :
- Ajouter une animation quand l'inscription réussit
- Afficher la position de la personne dans la liste ("Tu es le 47e inscrit !")
- Ajouter un message de partage ("Partage cette page pour monter dans la file")
Chaque itération prend 2 à 3 minutes. C'est le rythme du développement avec Claude Code.
Le gap avec un vrai MVP
Prends un moment pour réaliser ce que tu viens de faire. En 15 minutes, tu as :
- Configuré un projet Next.js
- Créé un CLAUDE.md pour cadrer le travail
- Utilisé Plan Mode pour valider l'approche
- Généré une landing page fonctionnelle avec Server Actions
- Debuggé des erreurs réelles
- Itéré pour ajouter des features
C'est impressionnant. Mais soyons honnêtes : ce n'est pas un MVP.
Ta landing page stocke les emails dans un fichier JSON. Il n'y a pas de base de données, pas d'authentification, pas de paiement. Si ton serveur redémarre sur un hébergement serverless, tu perds tes données. Si 50 personnes s'inscrivent en même temps, le fichier JSON risque de se corrompre.
Un vrai MVP, c'est LaunchList, le projet du parcours Premium :
- PostgreSQL avec Drizzle ORM pour des données fiables et requêtables
- Better-Auth pour l'authentification (login, inscription, sessions)
- Stripe (Checkout + Connect) pour les pré-commandes et les paiements
- Dashboard avec analytics temps réel pour les créateurs
- Déploiement Vercel avec domaine personnalisé
Le parcours Premium applique cette même méthode pour construire un SaaS complet en une semaine : base de données, authentification, paiements Stripe, ... Tout ce qu'il faut pour générer tes premiers revenus.
Ce que tu as appris
Ce chapitre t'a fait pratiquer chaque concept vu jusqu'ici, dans un vrai projet :
- Créer un CLAUDE.md pour cadrer le projet dès le départ, même pour 15 minutes de travail
- Utiliser le Plan Mode pour valider l'approche avant d'écrire une seule ligne de code
- Écrire un prompt structuré avec le contexte, les contraintes techniques et le résultat attendu
- Itérer quand le résultat n'est pas parfait, en donnant des instructions précises
- Debugger les erreurs courantes de Claude (fichiers manquants, validations oubliées) sans paniquer
Le réflexe à garder : planifier, implémenter, tester, itérer. C'est la boucle qui te rendra efficace avec Claude Code, quel que soit le projet.