spinny:~/writing $ less create-demo-claude-code-vibecoding.md
12Il **vibecoding** è un nuovo paradigma di sviluppo software in cui il programmatore guida un agente AI attraverso istruzioni in linguaggio naturale, lasciando che sia l'intelligenza artificiale a scrivere il codice effettivo. Il termine è stato coniato da Andrej Karpathy (co-founder di OpenAI e ex Director of AI di Tesla) in un celebre tweet del febbraio 2025: _"C'è un nuovo tipo di coding che chiamo vibecoding, dove ti arrendi completamente alle vibes, abbracci gli esponenziali e dimentichi che il codice esiste."_34In questo articolo vedremo come costruire una demo completa e funzionante usando **Claude Code** come agente AI, **Supabase** come backend (database, autenticazione, API) e **Vercel** per il deploy - il tutto sfruttando esclusivamente i **tier gratuiti** di questi servizi.56## 1. Cos'è il Vibecoding e perché è rivoluzionario78Il vibecoding rappresenta un cambio di paradigma fondamentale nello sviluppo software. Invece di scrivere codice riga per riga, il developer:9101. **Descrive** cosa vuole in linguaggio naturale.112. **L'agente AI** genera il codice completo.123. **Il developer** rivede, testa e itera.1314### Perché funziona1516- **Velocità**: un progetto che richiederebbe giorni può essere costruito in ore.17- **Accessibilità**: anche chi non è un developer esperto può costruire prodotti funzionanti.18- **Iterazione rapida**: puoi testare idee e pivotare molto più velocemente.19- **Focus sul prodotto**: ti concentri sul _cosa_ invece che sul _come_.2021```mermaid22flowchart LR23 A[Idea] --> B[Prompt in linguaggio naturale]24 B --> C[Claude Code genera il codice]25 C --> D[Review e test]26 D --> E[Iterazione]27 E --> B28 D --> F[Deploy su Vercel]29```3031### Quando usare il vibecoding3233Il vibecoding è perfetto per:3435- **Demo e MVP**: costruire rapidamente un prototipo per validare un'idea.36- **Hackathon**: creare un prodotto funzionante in poche ore.37- **Side project**: esplorare nuove tecnologie senza investire settimane.38- **Proof of Concept**: dimostrare la fattibilità tecnica a stakeholder o investitori.3940> **Attenzione:** Il vibecoding è eccellente per demo e prototipi. Per applicazioni production-grade con requisiti di sicurezza e scalabilità elevati, è comunque fondamentale una revisione approfondita del codice generato.4142## 2. Lo stack tecnologico: Claude Code + Supabase + Vercel4344### Claude Code4546Claude Code è l'agente di coding AI di Anthropic. Funziona direttamente nel tuo terminale e può:4748- Leggere e comprendere l'intero codebase.49- Creare, modificare e cancellare file.50- Eseguire comandi nel terminale.51- Interagire con API e servizi esterni.52- Gestire il versionamento con Git.53- Iterare autonomamente su errori e bug.5455```bash56# Installazione di Claude Code57npm install -g @anthropic-ai/claude-code5859# Avvio in una directory di progetto60cd my-project61claude62```6364### Supabase (Tier gratuito)6566Supabase è un'alternativa open source a Firebase che offre:6768- **Database PostgreSQL**: un database relazionale completo.69- **Autenticazione**: login con email, Google, GitHub, ecc.70- **API REST e Realtime**: generate automaticamente dal tuo schema.71- **Storage**: per file e immagini.72- **Edge Functions**: funzioni serverless.7374Il tier gratuito include:7576| Risorsa | Limite gratuito |77|---------|----------------|78| Database | 500 MB |79| Storage | 1 GB |80| Bandwidth | 5 GB |81| Edge Function invocations | 500K/mese |82| Utenti autenticati | Illimitati |83| Progetti | 2 progetti attivi |8485### Vercel (Tier gratuito)8687Vercel è la piattaforma di deploy perfetta per applicazioni Next.js:8889- **Deploy automatico** da GitHub.90- **Preview deployments** per ogni branch e PR.91- **CDN globale** per performance ottimali.92- **Serverless Functions** incluse.93- **Analytics** base gratuite.9495Il tier gratuito include:9697| Risorsa | Limite gratuito |98|---------|----------------|99| Bandwidth | 100 GB/mese |100| Serverless Function execution | 100 GB-ore/mese |101| Builds | 6.000 minuti/mese |102| Progetti | Illimitati |103| Deploy | Illimitati |104105## 3. Setup iniziale: preparare l'ambiente106107### Prerequisiti108109Prima di iniziare, assicurati di avere:110111- **Node.js 18+** installato.112- **Git** configurato.113- Un account **GitHub**.114- Un account **Supabase** (gratuito su [supabase.com](https://supabase.com)).115- Un account **Vercel** (gratuito su [vercel.com](https://vercel.com)).116- **Claude Code** installato (`npm install -g @anthropic-ai/claude-code`).117118### Step 1: Creare il progetto119120Apri il terminale e avvia Claude Code:121122```bash123mkdir my-demo-app && cd my-demo-app124claude125```126127Ora puoi iniziare a dare istruzioni a Claude Code in linguaggio naturale:128129```130Tu: Crea un progetto Next.js 15 con App Router, TypeScript, Tailwind CSS e131shadcn/ui. Inizializza anche un repository Git.132```133134Claude Code eseguirà automaticamente:135136```bash137npx create-next-app@latest . --typescript --tailwind --eslint --app --src-dir138npx shadcn@latest init139git init && git add . && git commit -m "Initial commit"140```141142### Step 2: Configurare Supabase1431441. Vai su [supabase.com](https://supabase.com) e crea un nuovo progetto.1452. Prendi nota di **Project URL** e **anon key** dalla sezione Settings > API.1463. Torna al terminale con Claude Code:147148```149Tu: Aggiungi Supabase al progetto. Crea un file .env.local con le variabili150NEXT_PUBLIC_SUPABASE_URL e NEXT_PUBLIC_SUPABASE_ANON_KEY. Configura il client151Supabase con SSR support per Next.js App Router.152```153154Claude Code creerà la configurazione completa:155156```typescript157// src/lib/supabase/client.ts158import { createBrowserClient } from '@supabase/ssr';159160export function createClient() {161 return createBrowserClient(162 process.env.NEXT_PUBLIC_SUPABASE_URL!,163 process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!164 );165}166```167168```typescript169// src/lib/supabase/server.ts170import { createServerClient } from '@supabase/ssr';171import { cookies } from 'next/headers';172173export async function createClient() {174 const cookieStore = await cookies();175176 return createServerClient(177 process.env.NEXT_PUBLIC_SUPABASE_URL!,178 process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,179 {180 cookies: {181 getAll() {182 return cookieStore.getAll();183 },184 setAll(cookiesToSet) {185 cookiesToSet.forEach(({ name, value, options }) =>186 cookieStore.set(name, value, options)187 );188 },189 },190 }191 );192}193```194195## 4. Costruire la demo: un'app di task management196197Costruiamo una demo concreta: un'**app di task management** con autenticazione, CRUD completo e interfaccia moderna.198199### Definire lo schema del database200201Dai istruzioni a Claude Code per creare lo schema:202203```204Tu: Crea una migrazione SQL per Supabase con le seguenti tabelle:2052061. profiles: id (uuid, FK a auth.users), username (text), avatar_url (text),207 created_at2082. projects: id (uuid), name (text), description (text), owner_id (uuid, FK209 a profiles), created_at2103. tasks: id (uuid), title (text), description (text), status (enum:211 todo/in_progress/done), priority (enum: low/medium/high), project_id (uuid,212 FK a projects), assigned_to (uuid, FK a profiles), due_date (timestamp),213 created_at, updated_at214215Abilita Row Level Security su tutte le tabelle e crea le policy appropriate.216```217218Claude Code genererà una migrazione completa:219220```sql221-- Crea i tipi enum222CREATE TYPE task_status AS ENUM ('todo', 'in_progress', 'done');223CREATE TYPE task_priority AS ENUM ('low', 'medium', 'high');224225-- Tabella profiles226CREATE TABLE profiles (227 id UUID REFERENCES auth.users ON DELETE CASCADE PRIMARY KEY,228 username TEXT UNIQUE,229 avatar_url TEXT,230 created_at TIMESTAMPTZ DEFAULT NOW()231);232233-- Tabella projects234CREATE TABLE projects (235 id UUID DEFAULT gen_random_uuid() PRIMARY KEY,236 name TEXT NOT NULL,237 description TEXT,238 owner_id UUID REFERENCES profiles(id) ON DELETE CASCADE NOT NULL,239 created_at TIMESTAMPTZ DEFAULT NOW()240);241242-- Tabella tasks243CREATE TABLE tasks (244 id UUID DEFAULT gen_random_uuid() PRIMARY KEY,245 title TEXT NOT NULL,246 description TEXT,247 status task_status DEFAULT 'todo',248 priority task_priority DEFAULT 'medium',249 project_id UUID REFERENCES projects(id) ON DELETE CASCADE NOT NULL,250 assigned_to UUID REFERENCES profiles(id),251 due_date TIMESTAMPTZ,252 created_at TIMESTAMPTZ DEFAULT NOW(),253 updated_at TIMESTAMPTZ DEFAULT NOW()254);255256-- Abilita RLS257ALTER TABLE profiles ENABLE ROW LEVEL SECURITY;258ALTER TABLE projects ENABLE ROW LEVEL SECURITY;259ALTER TABLE tasks ENABLE ROW LEVEL SECURITY;260261-- Policy per profiles262CREATE POLICY "Users can view own profile"263 ON profiles FOR SELECT USING (auth.uid() = id);264CREATE POLICY "Users can update own profile"265 ON profiles FOR UPDATE USING (auth.uid() = id);266267-- Policy per projects268CREATE POLICY "Users can view own projects"269 ON projects FOR SELECT USING (auth.uid() = owner_id);270CREATE POLICY "Users can create projects"271 ON projects FOR INSERT WITH CHECK (auth.uid() = owner_id);272CREATE POLICY "Users can update own projects"273 ON projects FOR UPDATE USING (auth.uid() = owner_id);274CREATE POLICY "Users can delete own projects"275 ON projects FOR DELETE USING (auth.uid() = owner_id);276277-- Policy per tasks278CREATE POLICY "Users can view tasks in their projects"279 ON tasks FOR SELECT USING (280 project_id IN (SELECT id FROM projects WHERE owner_id = auth.uid())281 );282CREATE POLICY "Users can create tasks in their projects"283 ON tasks FOR INSERT WITH CHECK (284 project_id IN (SELECT id FROM projects WHERE owner_id = auth.uid())285 );286CREATE POLICY "Users can update tasks in their projects"287 ON tasks FOR UPDATE USING (288 project_id IN (SELECT id FROM projects WHERE owner_id = auth.uid())289 );290CREATE POLICY "Users can delete tasks in their projects"291 ON tasks FOR DELETE USING (292 project_id IN (SELECT id FROM projects WHERE owner_id = auth.uid())293 );294```295296Puoi eseguire questa migrazione direttamente dalla dashboard di Supabase (SQL Editor) o tramite la CLI.297298### Generare i tipi TypeScript299300```301Tu: Genera i tipi TypeScript dal database Supabase e salvali in src/types/database.ts302```303304```bash305npx supabase gen types typescript --project-id YOUR_PROJECT_ID > src/types/database.ts306```307308### Costruire l'interfaccia utente309310Ora viene la parte più potente del vibecoding. Dai istruzioni di alto livello a Claude Code:311312```313Tu: Crea una pagina dashboard per l'app di task management con:3143151. Sidebar con navigazione tra progetti3162. Vista Kanban con 3 colonne (Todo, In Progress, Done) con drag & drop3173. Modal per creare/modificare task3184. Header con avatar utente e logout3195. Design moderno con shadcn/ui e Tailwind320321Usa i dati da Supabase con React Server Components dove possibile322e Client Components solo dove serve interattività.323```324325Claude Code costruirà l'intera interfaccia, componente per componente.326327### Aggiungere l'autenticazione328329```330Tu: Aggiungi un sistema di autenticazione completo con:3313321. Pagina di login con email/password e login con GitHub3332. Pagina di registrazione3343. Middleware per proteggere le rotte autenticate3354. Redirect automatico per utenti non autenticati3365. Creazione automatica del profilo dopo la registrazione337```338339Claude Code configurerà il middleware di Next.js e le pagine di auth:340341```typescript342// src/middleware.ts343import { createServerClient } from '@supabase/ssr';344import { NextResponse, type NextRequest } from 'next/server';345346export async function middleware(request: NextRequest) {347 let supabaseResponse = NextResponse.next({ request });348349 const supabase = createServerClient(350 process.env.NEXT_PUBLIC_SUPABASE_URL!,351 process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,352 {353 cookies: {354 getAll() {355 return request.cookies.getAll();356 },357 setAll(cookiesToSet) {358 cookiesToSet.forEach(({ name, value }) =>359 request.cookies.set(name, value)360 );361 supabaseResponse = NextResponse.next({ request });362 cookiesToSet.forEach(({ name, value, options }) =>363 supabaseResponse.cookies.set(name, value, options)364 );365 },366 },367 }368 );369370 const { data: { user } } = await supabase.auth.getUser();371372 if (!user && !request.nextUrl.pathname.startsWith('/auth')) {373 const url = request.nextUrl.clone();374 url.pathname = '/auth/login';375 return NextResponse.redirect(url);376 }377378 return supabaseResponse;379}380381export const config = {382 matcher: ['/((?!_next/static|_next/image|favicon.ico|auth).*)'],383};384```385386## 5. Pattern avanzati di vibecoding387388### Il prompting iterativo389390Il segreto del vibecoding efficace è l'**iterazione**. Non cercare di descrivere tutto in un singolo prompt. Procedi per step:391392```393Step 1: "Crea il layout base con header e sidebar"394Step 2: "Aggiungi la lista dei progetti nella sidebar con un bottone per crearne di nuovi"395Step 3: "Crea la vista Kanban nella main area"396Step 4: "Aggiungi il drag & drop tra le colonne"397Step 5: "Implementa il modal per creare nuovi task"398Step 6: "Aggiungi le notifiche toast per feedback all'utente"399```400401> **Tip:** Più il prompt è specifico e contestualizzato, migliore sarà il risultato. Claude Code ha accesso all'intero codebase, quindi può integrare nuove funzionalità in modo coerente.402403### Gestione degli errori404405Quando qualcosa non funziona (e succederà), puoi semplicemente dire:406407```408Tu: Ho questo errore nella console: "TypeError: Cannot read property 'map' of undefined"409nel componente TaskList. Fixalo.410```411412Claude Code analizzerà il codice, identificherà il problema e lo risolverà.413414### Refactoring con AI415416```417Tu: Il componente Dashboard è diventato troppo grande. Dividilo in componenti418più piccoli e riutilizzabili, mantenendo la stessa funzionalità.419```420421### Testing422423```424Tu: Aggiungi test con Vitest per le utility functions e test con Playwright425per il flusso di autenticazione e creazione task.426```427428## 6. Deploy su Vercel: dal codice al mondo429430### Step 1: Pushare su GitHub431432```433Tu: Crea un .gitignore appropriato, committa tutto e pusha su un nuovo434repository GitHub chiamato "my-demo-app".435```436437```bash438git add .439git commit -m "feat: complete task management demo"440gh repo create my-demo-app --public --push --source=.441```442443### Step 2: Connettere Vercel4444451. Vai su [vercel.com](https://vercel.com) e clicca "Add New Project".4462. Importa il repository GitHub appena creato.4473. Aggiungi le variabili d'ambiente:448 - `NEXT_PUBLIC_SUPABASE_URL`449 - `NEXT_PUBLIC_SUPABASE_ANON_KEY`4504. Clicca "Deploy".451452```mermaid453flowchart LR454 A[GitHub Push] --> B[Vercel Build]455 B --> C[Deploy Automatico]456 C --> D[URL Pubblico]457 D --> E[CDN Globale]458```459460### Step 3: Configurare il dominio (opzionale)461462Vercel fornisce un URL gratuito tipo `my-demo-app.vercel.app`. Per un dominio personalizzato:463464```465Tu: Aggiungi la configurazione per un dominio personalizzato in vercel.json466```467468### Preview Deployments469470Ogni volta che apri una Pull Request su GitHub, Vercel creerà automaticamente un **preview deployment** con un URL unico. Perfetto per mostrare le modifiche prima del merge.471472## 7. Ottimizzazioni per la demo473474### Performance475476```477Tu: Ottimizza le performance dell'app:4781. Aggiungi loading states con Suspense e skeleton4792. Implementa caching con unstable_cache di Next.js4803. Ottimizza le immagini con next/image4814. Aggiungi metadata SEO per ogni pagina482```483484### Realtime con Supabase485486Una feature che impressiona sempre nelle demo è il **realtime**:487488```489Tu: Aggiungi sincronizzazione realtime per i task usando Supabase Realtime.490Quando un utente aggiorna un task, tutti gli altri utenti devono vedere491il cambiamento in tempo reale senza refresh.492```493494```typescript495'use client';496497import { useEffect, useState } from 'react';498import { createClient } from '@/lib/supabase/client';499import type { Task } from '@/types/database';500501export function useRealtimeTasks(projectId: string) {502 const [tasks, setTasks] = useState<Task[]>([]);503 const supabase = createClient();504505 useEffect(() => {506 const channel = supabase507 .channel('tasks-changes')508 .on(509 'postgres_changes',510 {511 event: '*',512 schema: 'public',513 table: 'tasks',514 filter: `project_id=eq.${projectId}`,515 },516 (payload) => {517 if (payload.eventType === 'INSERT') {518 setTasks((prev) => [...prev, payload.new as Task]);519 } else if (payload.eventType === 'UPDATE') {520 setTasks((prev) =>521 prev.map((t) =>522 t.id === payload.new.id ? (payload.new as Task) : t523 )524 );525 } else if (payload.eventType === 'DELETE') {526 setTasks((prev) =>527 prev.filter((t) => t.id !== payload.old.id)528 );529 }530 }531 )532 .subscribe();533534 return () => {535 supabase.removeChannel(channel);536 };537 }, [projectId, supabase]);538539 return tasks;540}541```542543### Dark mode544545```546Tu: Aggiungi supporto dark mode con toggle nell'header.547Usa le classi dark di Tailwind e salva la preferenza in localStorage.548```549550## 8. Best practice per il vibecoding efficace551552### 1. Sii specifico nei prompt553554```555❌ "Fai una pagina bella"556✅ "Crea una landing page con hero section con gradiente viola-blu, una sezione557 features con 3 card con icone, e una CTA con bottone arancione"558```559560### 2. Dai contesto561562```563❌ "Aggiungi autenticazione"564✅ "Aggiungi autenticazione con Supabase Auth. Il progetto usa Next.js 15 App565 Router con TypeScript. Voglio login con email/password e OAuth con GitHub.566 Usa il pattern SSR con @supabase/ssr"567```568569### 3. Itera in piccoli step570571Non cercare di costruire tutto in un singolo prompt. Procedi per incrementi:5725731. Layout base5742. Una feature alla volta5753. Styling e polish5764. Gestione errori5775. Testing578579### 4. Rivedi il codice generato580581Il vibecoding non significa non leggere il codice. Rivedi sempre:582583- **Sicurezza**: RLS policies, validazione input, sanitizzazione dati.584- **Performance**: query N+1, componenti inutilmente client-side.585- **Best practice**: struttura del progetto, naming conventions.586587### 5. Usa Git strategicamente588589```590Tu: Committa le modifiche con un messaggio descrittivo dopo ogni feature completata.591```592593Questo ti permette di tornare indietro se qualcosa va storto.594595## 9. Costi: tutto davvero gratis?596597Ecco un riepilogo dei costi per ciascun servizio:598599| Servizio | Piano gratuito | Quando si paga |600|----------|---------------|----------------|601| **Claude Code** | Richiede un piano Anthropic (a partire da $20/mese) oppure API key | Subito, ma il valore è enorme |602| **Supabase** | Generoso free tier (2 progetti, 500MB DB) | Oltre i limiti del free tier |603| **Vercel** | Free tier per progetti personali | Per team o uso commerciale |604| **GitHub** | Gratuito per repo pubblici e privati | Features enterprise |605606> **Nota:** Claude Code richiede un abbonamento o crediti API, ma il ritorno sull'investimento in termini di velocità di sviluppo è straordinario. Per una demo o MVP, il costo totale è nell'ordine di $20.607608### Alternative gratuite per l'AI609610Se vuoi mantenere il costo a zero assoluto, puoi usare:611612- **Cursor** (free tier con limitazioni).613- **GitHub Copilot** (gratuito per studenti e open source).614- **Codeium/Windsurf** (tier gratuito generoso).615616## 10. Dalla demo al prodotto: prossimi step617618Una volta che la tua demo è live, ecco come procedere:619620```mermaid621flowchart TD622 A[Demo Live] --> B{Feedback Utenti}623 B --> C[Iterazione sul Prodotto]624 C --> D[Product-Market Fit]625 D --> E[Scaling]626 E --> F[Supabase Pro Plan]627 E --> G[Vercel Pro Plan]628 E --> H[Dominio Personalizzato]629```6306311. **Raccogli feedback**: condividi la demo con potenziali utenti e raccogli opinioni.6322. **Itera velocemente**: usa il vibecoding per implementare le modifiche richieste.6333. **Monitora le metriche**: Vercel Analytics e Supabase Dashboard ti danno dati essenziali.6344. **Scala quando serve**: passa ai piani a pagamento solo quando hai validato la domanda.635636637## Conclusione638639Il vibecoding con Claude Code, Supabase e Vercel rappresenta una combinazione potentissima per costruire demo e MVP in tempi record. Quello che prima richiedeva settimane di sviluppo ora può essere realizzato in poche ore, con un livello di qualità sorprendente.640641La chiave è approcciare il vibecoding con la giusta mentalità: non si tratta di "non sapere programmare", ma di **amplificare le tue capacità** con strumenti AI. Più conosci le tecnologie sottostanti (React, SQL, autenticazione, deploy), più sarai efficace nel guidare l'agente AI verso il risultato desiderato.642643Il futuro dello sviluppo software è qui, e il costo per iniziare non è mai stato così basso. Crea la tua demo, validala con utenti reali, e costruisci il prossimo grande prodotto.644645> **Checklist per la tua prima demo:**646>647> - [x] Claude Code installato e configurato648> - [x] Progetto Supabase creato con schema database649> - [x] Progetto Next.js inizializzato con shadcn/ui650> - [x] Autenticazione configurata651> - [x] CRUD completo implementato652> - [x] UI moderna e responsive653> - [x] Deploy su Vercel effettuato654> - [x] URL condivisibile pronto per il feedback655
:Come Creare una Demo con Claude Code: Vibecoding con Supabase e Vercellines 1-655 (END) — press q to close