spinny:~/writing $ less create-demo-claude-code-vibecoding.md
12**Vibecoding** is een nieuw softwareontwikkelingsparadigma waarbij de programmeur een AI-agent begeleidt via instructies in natuurlijke taal, waarbij de kunstmatige intelligentie de daadwerkelijke code schrijft. De term werd bedacht door Andrej Karpathy (mede-oprichter van OpenAI en voormalig Director of AI bij Tesla) in een beroemde tweet van februari 2025: _"There's a new kind of coding I call vibecoding, where you fully give in to the vibes, embrace the exponentials, and forget that the code even exists."_34In dit artikel bekijken we hoe je een complete, werkende demo bouwt met **Claude Code** als AI-agent, **Supabase** als backend (database, authenticatie, API) en **Vercel** voor deployment - allemaal met uitsluitend de **gratis tiers** van deze diensten.56## 1. Wat Is Vibecoding en Waarom Het Revolutionair Is78Vibecoding vertegenwoordigt een fundamentele paradigmaverschuiving in softwareontwikkeling. In plaats van code regel voor regel te schrijven, doet de ontwikkelaar het volgende:9101. **Beschrijft** wat hij wil in natuurlijke taal.112. **De AI-agent** genereert de complete code.123. **De ontwikkelaar** beoordeelt, test en itereert.1314### Waarom Het Werkt1516- **Snelheid**: een project dat dagen zou duren kan in uren worden gebouwd.17- **Toegankelijkheid**: zelfs niet-expert ontwikkelaars kunnen werkende producten bouwen.18- **Snelle iteratie**: je kunt ideeën testen en veel sneller pivoteren.19- **Productfocus**: je concentreert je op het _wat_ in plaats van het _hoe_.2021```mermaid22flowchart LR23 A[Idea] --> B[Natural language prompt]24 B --> C[Claude Code generates code]25 C --> D[Review and test]26 D --> E[Iteration]27 E --> B28 D --> F[Deploy to Vercel]29```3031### Wanneer Vibecoding Gebruiken3233Vibecoding is perfect voor:3435- **Demo's en MVP's**: snel een prototype bouwen om een idee te valideren.36- **Hackathons**: een werkend product maken in slechts een paar uur.37- **Nevenprojecten**: nieuwe technologieën verkennen zonder wekenlang te investeren.38- **Proof of Concept**: technische haalbaarheid demonstreren aan stakeholders of investeerders.3940> **Waarschuwing:** Vibecoding is uitstekend voor demo's en prototypes. Voor productieklare applicaties met hoge veiligheids- en schaalbaarheidseisen is een grondige beoordeling van de gegenereerde code nog steeds essentieel.4142## 2. De Tech Stack: Claude Code + Supabase + Vercel4344### Claude Code4546Claude Code is de AI-coderingsagent van Anthropic. Het werkt direct in je terminal en kan:4748- De gehele codebase lezen en begrijpen.49- Bestanden aanmaken, wijzigen en verwijderen.50- Terminalopdrachten uitvoeren.51- Interageren met API's en externe diensten.52- Versiebeheer met Git beheren.53- Autonoom itereren op fouten en bugs.5455```bash56# Install Claude Code57npm install -g @anthropic-ai/claude-code5859# Start in a project directory60cd my-project61claude62```6364### Supabase (Gratis Tier)6566Supabase is een open-source Firebase-alternatief dat biedt:6768- **PostgreSQL Database**: een complete relationele database.69- **Authenticatie**: inloggen met e-mail, Google, GitHub, etc.70- **REST en Realtime API's**: automatisch gegenereerd vanuit je schema.71- **Opslag**: voor bestanden en afbeeldingen.72- **Edge Functions**: serverloze functies.7374De gratis tier omvat:7576| Resource | Gratis Limiet |77|----------|-----------|78| Database | 500 MB |79| Opslag | 1 GB |80| Bandbreedte | 5 GB |81| Edge Function-aanroepen | 500K/maand |82| Geauthenticeerde gebruikers | Onbeperkt |83| Projecten | 2 actieve projecten |8485### Vercel (Gratis Tier)8687Vercel is het perfecte deployment-platform voor Next.js-applicaties:8889- **Automatische deployment** vanuit GitHub.90- **Preview deployments** voor elke branch en PR.91- **Wereldwijd CDN** voor optimale prestaties.92- **Serverless Functions** inbegrepen.93- **Basisanalytics** gratis.9495De gratis tier omvat:9697| Resource | Gratis Limiet |98|----------|-----------|99| Bandbreedte | 100 GB/maand |100| Serverless Function-uitvoering | 100 GB-uur/maand |101| Builds | 6.000 minuten/maand |102| Projecten | Onbeperkt |103| Deployments | Onbeperkt |104105## 3. Initiële Setup: De Omgeving Voorbereiden106107### Vereisten108109Voordat je begint, zorg ervoor dat je het volgende hebt:110111- **Node.js 18+** geïnstalleerd.112- **Git** geconfigureerd.113- Een **GitHub**-account.114- Een **Supabase**-account (gratis op [supabase.com](https://supabase.com)).115- Een **Vercel**-account (gratis op [vercel.com](https://vercel.com)).116- **Claude Code** geïnstalleerd (`npm install -g @anthropic-ai/claude-code`).117118### Stap 1: Maak het Project Aan119120Open de terminal en start Claude Code:121122```bash123mkdir my-demo-app && cd my-demo-app124claude125```126127Nu kun je Claude Code instructies geven in natuurlijke taal:128129```130You: Create a Next.js 15 project with App Router, TypeScript, Tailwind CSS,131and shadcn/ui. Also initialize a Git repository.132```133134Claude Code zal automatisch het volgende uitvoeren: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### Stap 2: Configureer Supabase1431441. Ga naar [supabase.com](https://supabase.com) en maak een nieuw project aan.1452. Noteer de **Project URL** en **anon key** uit Settings > API.1463. Ga terug naar de terminal met Claude Code:147148```149You: Add Supabase to the project. Create a .env.local file with the variables150NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_ANON_KEY. Configure the151Supabase client with SSR support for Next.js App Router.152```153154Claude Code zal de volledige configuratie aanmaken: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. De Demo Bouwen: Een Taakbeheer-app196197Laten we een concrete demo bouwen: een **taakbeheer-app** met authenticatie, volledige CRUD en een moderne interface.198199### Definieer het Databaseschema200201Geef Claude Code instructies om het schema te maken:202203```204You: Create a SQL migration for Supabase with the following tables:2052061. profiles: id (uuid, FK to auth.users), username (text), avatar_url (text),207 created_at2082. projects: id (uuid), name (text), description (text), owner_id (uuid, FK209 to 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 to projects), assigned_to (uuid, FK to profiles), due_date (timestamp),213 created_at, updated_at214215Enable Row Level Security on all tables and create appropriate policies.216```217218Claude Code genereert een volledige migratie:219220```sql221-- Create enum types222CREATE TYPE task_status AS ENUM ('todo', 'in_progress', 'done');223CREATE TYPE task_priority AS ENUM ('low', 'medium', 'high');224225-- Profiles table226CREATE 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-- Projects table234CREATE 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-- Tasks table243CREATE 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-- Enable RLS257ALTER TABLE profiles ENABLE ROW LEVEL SECURITY;258ALTER TABLE projects ENABLE ROW LEVEL SECURITY;259ALTER TABLE tasks ENABLE ROW LEVEL SECURITY;260261-- Profiles policies262CREATE 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-- Projects policies268CREATE 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-- Tasks policies278CREATE 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```295296Je kunt deze migratie direct uitvoeren vanuit het Supabase-dashboard (SQL Editor) of via de CLI.297298### Genereer TypeScript Types299300```301You: Generate TypeScript types from the Supabase database and save them to src/types/database.ts302```303304```bash305npx supabase gen types typescript --project-id YOUR_PROJECT_ID > src/types/database.ts306```307308### Bouw de Gebruikersinterface309310Nu komt het krachtigste deel van vibecoding. Geef Claude Code instructies op hoog niveau:311312```313You: Create a dashboard page for the task management app with:3143151. Sidebar with navigation between projects3162. Kanban view with 3 columns (Todo, In Progress, Done) with drag & drop3173. Modal to create/edit tasks3184. Header with user avatar and logout3195. Modern design with shadcn/ui and Tailwind320321Use data from Supabase with React Server Components where possible322and Client Components only where interactivity is needed.323```324325Claude Code bouwt de gehele interface, component voor component.326327### Voeg Authenticatie Toe328329```330You: Add a complete authentication system with:3313321. Login page with email/password and GitHub login3332. Registration page3343. Middleware to protect authenticated routes3354. Automatic redirect for unauthenticated users3365. Automatic profile creation after registration337```338339Claude Code configureert Next.js middleware en auth-pagina's: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. Geavanceerde Vibecoding Patronen387388### Iteratieve Prompting389390Het geheim van effectieve vibecoding is **iteratie**. Probeer niet alles in één prompt te beschrijven. Ga stap voor stap te werk:391392```393Stap 1: "Create the base layout with header and sidebar"394Stap 2: "Add the project list in the sidebar with a button to create new ones"395Stap 3: "Create the Kanban view in the main area"396Stap 4: "Add drag & drop between columns"397Stap 5: "Implement the modal to create new tasks"398Stap 6: "Add toast notifications for user feedback"399```400401> **Tip:** Hoe specifieker en gecontextualiseerder de prompt, hoe beter het resultaat. Claude Code heeft toegang tot de gehele codebase, zodat het nieuwe functies coherent kan integreren.402403### Foutafhandeling404405Wanneer iets niet werkt (en dat zal gebeuren), kun je eenvoudig zeggen:406407```408You: I'm getting this error in the console: "TypeError: Cannot read property409'map' of undefined" in the TaskList component. Fix it.410```411412Claude Code analyseert de code, identificeert het probleem en lost het op.413414### Refactoring met AI415416```417You: The Dashboard component has become too large. Split it into smaller,418reusable components while maintaining the same functionality.419```420421### Testen422423```424You: Add tests with Vitest for utility functions and Playwright tests for425the authentication and task creation flow.426```427428## 6. Deployen naar Vercel: Van Code naar de Wereld429430### Stap 1: Push naar GitHub431432```433You: Create an appropriate .gitignore, commit everything, and push to a new434GitHub repository called "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### Stap 2: Verbind Vercel4444451. Ga naar [vercel.com](https://vercel.com) en klik op "Add New Project."4462. Importeer de GitHub-repository die je zojuist hebt aangemaakt.4473. Voeg omgevingsvariabelen toe:448 - `NEXT_PUBLIC_SUPABASE_URL`449 - `NEXT_PUBLIC_SUPABASE_ANON_KEY`4504. Klik op "Deploy."451452```mermaid453flowchart LR454 A[GitHub Push] --> B[Vercel Build]455 B --> C[Automatic Deploy]456 C --> D[Public URL]457 D --> E[Global CDN]458```459460### Stap 3: Configureer een Eigen Domein (Optioneel)461462Vercel biedt een gratis URL zoals `my-demo-app.vercel.app`. Voor een eigen domein:463464```465You: Add the configuration for a custom domain in vercel.json466```467468### Preview Deployments469470Elke keer dat je een Pull Request opent op GitHub, maakt Vercel automatisch een **preview deployment** aan met een unieke URL. Perfect om wijzigingen te tonen voordat je merget.471472## 7. Optimalisaties voor Je Demo473474### Prestaties475476```477You: Optimize the app's performance:4781. Add loading states with Suspense and skeletons4792. Implement caching with Next.js unstable_cache4803. Optimize images with next/image4814. Add SEO metadata for each page482```483484### Realtime met Supabase485486Een functie die altijd indruk maakt in demo's is **realtime**:487488```489You: Add realtime synchronization for tasks using Supabase Realtime.490When a user updates a task, all other users should see the change491in real time without refreshing.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### Donkere Modus544545```546You: Add dark mode support with a toggle in the header.547Use Tailwind dark classes and save the preference in localStorage.548```549550## 8. Best Practices voor Effectieve Vibecoding551552### 1. Wees Specifiek in Je Prompts553554```555Niet: "Make a nice page"556Wel: "Create a landing page with a hero section with a purple-blue gradient,557 a features section with 3 cards with icons, and an orange CTA button"558```559560### 2. Bied Context561562```563Niet: "Add authentication"564Wel: "Add authentication with Supabase Auth. The project uses Next.js 15 App565 Router with TypeScript. I want email/password login and OAuth with GitHub.566 Use the SSR pattern with @supabase/ssr"567```568569### 3. Itereer in Kleine Stappen570571Probeer niet alles in één prompt te bouwen. Ga stapsgewijs te werk:5725731. Basislayout5742. Eén functie tegelijk5753. Styling en afwerking5764. Foutafhandeling5775. Testen578579### 4. Beoordeel de Gegenereerde Code580581Vibecoding betekent niet dat je de code niet leest. Beoordeel altijd:582583- **Beveiliging**: RLS-beleid, invoervalidatie, gegevenssanering.584- **Prestaties**: N+1 query's, onnodig client-side componenten.585- **Best practices**: projectstructuur, naamgevingsconventies.586587### 5. Gebruik Git Strategisch588589```590You: Commit the changes with a descriptive message after each completed feature.591```592593Dit stelt je in staat om terug te draaien als er iets misgaat.594595## 9. Kosten: Is Het Echt Allemaal Gratis?596597Hier is een kostenoverzicht per dienst:598599| Dienst | Gratis Plan | Wanneer Je Betaalt |600|---------|-----------|-------------|601| **Claude Code** | Vereist een Anthropic-plan (vanaf $20/maand) of API-sleutel | Direct, maar de waarde is enorm |602| **Supabase** | Royale gratis tier (2 projecten, 500MB DB) | Bij overschrijding van gratis tier-limieten |603| **Vercel** | Gratis tier voor persoonlijke projecten | Voor teams of commercieel gebruik |604| **GitHub** | Gratis voor openbare en privé-repo's | Enterprise-functies |605606> **Opmerking:** Claude Code vereist een abonnement of API-tegoed, maar het rendement in termen van ontwikkelsnelheid is buitengewoon. Voor een demo of MVP liggen de totale kosten rond de $20.607608### Gratis AI-alternatieven609610Als je de kosten op absoluut nul wilt houden, kun je gebruiken:611612- **Cursor** (gratis tier met beperkingen).613- **GitHub Copilot** (gratis voor studenten en open source).614- **Codeium/Windsurf** (royale gratis tier).615616## 10. Van Demo naar Product: Volgende Stappen617618Zodra je demo live is, kun je als volgt verdergaan:619620```mermaid621flowchart TD622 A[Live Demo] --> B{User Feedback}623 B --> C[Product Iteration]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[Custom Domain]629```6306311. **Verzamel feedback**: deel de demo met potentiële gebruikers en verzamel meningen.6322. **Itereer snel**: gebruik vibecoding om gevraagde wijzigingen te implementeren.6333. **Monitor metrics**: Vercel Analytics en Supabase Dashboard geven je essentiële data.6344. **Schaal wanneer nodig**: upgrade pas naar betaalde plannen als je de vraag hebt gevalideerd.635636637## Conclusie638639Vibecoding met Claude Code, Supabase en Vercel vormt een krachtige combinatie om demo's en MVP's in recordtijd te bouwen. Wat vroeger weken ontwikkeling kostte, kan nu in slechts een paar uur worden bereikt, met een verrassend hoog kwaliteitsniveau.640641De sleutel is vibecoding benaderen met de juiste mindset: het gaat er niet om "niet te weten hoe je moet coderen" maar om **je mogelijkheden te versterken** met AI-tools. Hoe meer je weet over de onderliggende technologieën (React, SQL, authenticatie, deployment), hoe effectiever je de AI-agent naar het gewenste resultaat kunt leiden.642643De toekomst van softwareontwikkeling is hier, en de kosten om te beginnen zijn nog nooit zo laag geweest. Maak je demo, valideer het met echte gebruikers en bouw het volgende geweldige product.644645> **Checklist voor je eerste demo:**646>647> - [x] Claude Code geïnstalleerd en geconfigureerd648> - [x] Supabase-project aangemaakt met databaseschema649> - [x] Next.js-project geïnitialiseerd met shadcn/ui650> - [x] Authenticatie geconfigureerd651> - [x] Volledige CRUD geïmplementeerd652> - [x] Moderne en responsieve UI653> - [x] Gedeployed naar Vercel654> - [x] Deelbare URL klaar voor feedback655
:Een Demo Bouwen met Claude Code: Vibecoding met Supabase en Vercellines 1-655 (END) — press q to close