spinny:~/writing $ less create-demo-claude-code-vibecoding.md
12**Vibecoding** är ett nytt mjukvaruutvecklingsparadigm där programmeraren guidar en AI-agent genom instruktioner på naturligt språk och låter den artificiella intelligensen skriva den faktiska koden. Termen myntades av Andrej Karpathy (medgrundare av OpenAI och tidigare Director of AI på Tesla) i en berömd tweet från 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."_34I den här artikeln ser vi hur man bygger en komplett, fungerande demo med **Claude Code** som AI-agent, **Supabase** som backend (databas, autentisering, API) och **Vercel** för deployment - allt med uteslutande **gratistjänster**.56## 1. Vad Är Vibecoding och Varför Det Är Revolutionerande78Vibecoding representerar ett fundamentalt paradigmskifte inom mjukvaruutveckling. Istället för att skriva kod rad för rad gör utvecklaren:9101. **Beskriver** vad de vill ha på naturligt språk.112. **AI-agenten** genererar den kompletta koden.123. **Utvecklaren** granskar, testar och itererar.1314### Varför Det Fungerar1516- **Hastighet**: ett projekt som skulle ta dagar kan byggas på timmar.17- **Tillgänglighet**: även icke-expert utvecklare kan bygga fungerande produkter.18- **Snabb iteration**: du kan testa idéer och pivotera mycket snabbare.19- **Produktfokus**: du koncentrerar dig på _vad_ istället för _hur_.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### När Ska Man Använda Vibecoding3233Vibecoding är perfekt för:3435- **Demos och MVP:er**: snabbt bygga en prototyp för att validera en idé.36- **Hackathons**: skapa en fungerande produkt på bara några timmar.37- **Sidoprojekt**: utforska nya teknologier utan att investera veckor.38- **Proof of Concept**: demonstrera teknisk genomförbarhet för intressenter eller investerare.3940> **Varning:** Vibecoding är utmärkt för demos och prototyper. För produktionsklara applikationer med höga säkerhets- och skalbarhetskrav är en noggrann granskning av den genererade koden fortfarande nödvändig.4142## 2. Teknikstacken: Claude Code + Supabase + Vercel4344### Claude Code4546Claude Code är Anthropics AI-kodningsagent. Den fungerar direkt i din terminal och kan:4748- Läsa och förstå hela kodbasen.49- Skapa, ändra och ta bort filer.50- Köra terminalkommandon.51- Interagera med API:er och externa tjänster.52- Hantera versionshantering med Git.53- Autonomt iterera på fel och buggar.5455```bash56# Install Claude Code57npm install -g @anthropic-ai/claude-code5859# Start in a project directory60cd my-project61claude62```6364### Supabase (Gratis Tier)6566Supabase är ett Firebase-alternativ med öppen källkod som erbjuder:6768- **PostgreSQL-databas**: en komplett relationsdatabas.69- **Autentisering**: inloggning med e-post, Google, GitHub, etc.70- **REST och Realtime API:er**: automatiskt genererade från ditt schema.71- **Lagring**: för filer och bilder.72- **Edge Functions**: serverlösa funktioner.7374Gratisnivån inkluderar:7576| Resurs | Gratis Gräns |77|----------|-----------|78| Databas | 500 MB |79| Lagring | 1 GB |80| Bandbredd | 5 GB |81| Edge Function-anrop | 500K/månad |82| Autentiserade användare | Obegränsat |83| Projekt | 2 aktiva projekt |8485### Vercel (Gratis Tier)8687Vercel är den perfekta deployment-plattformen för Next.js-applikationer:8889- **Automatisk deployment** från GitHub.90- **Preview deployments** för varje branch och PR.91- **Globalt CDN** för optimal prestanda.92- **Serverless Functions** inkluderade.93- **Grundläggande analytics** gratis.9495Gratisnivån inkluderar:9697| Resurs | Gratis Gräns |98|----------|-----------|99| Bandbredd | 100 GB/månad |100| Serverless Function-körning | 100 GB-timmar/månad |101| Byggen | 6 000 minuter/månad |102| Projekt | Obegränsat |103| Deployments | Obegränsat |104105## 3. Initial Setup: Förbereda Miljön106107### Förutsättningar108109Innan du börjar, se till att du har:110111- **Node.js 18+** installerat.112- **Git** konfigurerat.113- Ett **GitHub**-konto.114- Ett **Supabase**-konto (gratis på [supabase.com](https://supabase.com)).115- Ett **Vercel**-konto (gratis på [vercel.com](https://vercel.com)).116- **Claude Code** installerat (`npm install -g @anthropic-ai/claude-code`).117118### Steg 1: Skapa Projektet119120Öppna terminalen och starta Claude Code:121122```bash123mkdir my-demo-app && cd my-demo-app124claude125```126127Nu kan du ge Claude Code instruktioner på naturligt språk: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 kommer automatiskt köra: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### Steg 2: Konfigurera Supabase1431441. Gå till [supabase.com](https://supabase.com) och skapa ett nytt projekt.1452. Notera **Project URL** och **anon key** från Settings > API.1463. Gå tillbaka till terminalen med 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 skapar den kompletta konfigurationen: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. Bygga Demon: En Uppgiftshanteringsapp196197Låt oss bygga en konkret demo: en **uppgiftshanteringsapp** med autentisering, fullständig CRUD och ett modernt gränssnitt.198199### Definiera Databasschemat200201Ge Claude Code instruktioner för att skapa schemat: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 genererar en komplett migrering: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```295296Du kan köra denna migrering direkt från Supabase-dashboarden (SQL Editor) eller via CLI:n.297298### Generera TypeScript-typer299300```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### Bygg Användargränssnittet309310Nu kommer den mest kraftfulla delen av vibecoding. Ge Claude Code instruktioner på hög nivå: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 bygger hela gränssnittet, komponent för komponent.326327### Lägg Till Autentisering328329```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 konfigurerar Next.js middleware och auth-sidor: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. Avancerade Vibecoding-mönster387388### Iterativ Prompting389390Hemligheten bakom effektiv vibecoding är **iteration**. Försök inte beskriva allt i en enda prompt. Gå steg för steg:391392```393Steg 1: "Create the base layout with header and sidebar"394Steg 2: "Add the project list in the sidebar with a button to create new ones"395Steg 3: "Create the Kanban view in the main area"396Steg 4: "Add drag & drop between columns"397Steg 5: "Implement the modal to create new tasks"398Steg 6: "Add toast notifications for user feedback"399```400401> **Tips:** Ju mer specifik och kontextualiserad prompten är, desto bättre blir resultatet. Claude Code har tillgång till hela kodbasen, så det kan integrera nya funktioner koherent.402403### Felhantering404405När något inte fungerar (och det kommer att hända), kan du helt enkelt säga: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 analyserar koden, identifierar problemet och åtgärdar det.413414### Refaktorering med AI415416```417You: The Dashboard component has become too large. Split it into smaller,418reusable components while maintaining the same functionality.419```420421### Testning422423```424You: Add tests with Vitest for utility functions and Playwright tests for425the authentication and task creation flow.426```427428## 6. Deploya till Vercel: Från Kod till Världen429430### Steg 1: Pusha till 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### Steg 2: Anslut Vercel4444451. Gå till [vercel.com](https://vercel.com) och klicka på "Add New Project."4462. Importera GitHub-repot du just skapade.4473. Lägg till miljövariabler:448 - `NEXT_PUBLIC_SUPABASE_URL`449 - `NEXT_PUBLIC_SUPABASE_ANON_KEY`4504. Klicka på "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### Steg 3: Konfigurera en Egen Domän (Valfritt)461462Vercel tillhandahåller en gratis URL som `my-demo-app.vercel.app`. För en egen domän:463464```465You: Add the configuration for a custom domain in vercel.json466```467468### Preview Deployments469470Varje gång du öppnar en Pull Request på GitHub skapar Vercel automatiskt en **preview deployment** med en unik URL. Perfekt för att visa ändringar innan merge.471472## 7. Optimeringar för Din Demo473474### Prestanda475476```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### Realtid med Supabase485486En funktion som alltid imponerar i demos är **realtid**: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### Mörkt Läge544545```546You: Add dark mode support with a toggle in the header.547Use Tailwind dark classes and save the preference in localStorage.548```549550## 8. Bästa Praxis för Effektiv Vibecoding551552### 1. Var Specifik i Dina Prompter553554```555Nej: "Make a nice page"556Ja: "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. Ge Kontext561562```563Nej: "Add authentication"564Ja: "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. Iterera i Små Steg570571Försök inte bygga allt i en enda prompt. Gå stegvis:5725731. Grundlayout5742. En funktion i taget5753. Styling och finish5764. Felhantering5775. Testning578579### 4. Granska Den Genererade Koden580581Vibecoding betyder inte att man inte läser koden. Granska alltid:582583- **Säkerhet**: RLS-policyer, indatavalidering, datasanering.584- **Prestanda**: N+1-frågor, onödigt klientsidiga komponenter.585- **Bästa praxis**: projektstruktur, namnkonventioner.586587### 5. Använd Git Strategiskt588589```590You: Commit the changes with a descriptive message after each completed feature.591```592593Detta låter dig återställa om något går fel.594595## 9. Kostnader: Är Det Verkligen Helt Gratis?596597Här är en kostnadsöversikt per tjänst:598599| Tjänst | Gratis Plan | När Du Betalar |600|---------|-----------|-------------|601| **Claude Code** | Kräver en Anthropic-plan (från $20/månad) eller API-nyckel | Omedelbart, men värdet är enormt |602| **Supabase** | Generös gratisnivå (2 projekt, 500MB DB) | Utöver gratisgränserna |603| **Vercel** | Gratisnivå för personliga projekt | För team eller kommersiellt bruk |604| **GitHub** | Gratis för offentliga och privata repos | Enterprise-funktioner |605606> **Notera:** Claude Code kräver en prenumeration eller API-kredit, men avkastningen i utvecklingshastighet är extraordinär. För en demo eller MVP ligger totalkostnaden runt $20.607608### Gratis AI-alternativ609610Om du vill hålla kostnaderna på absolut noll kan du använda:611612- **Cursor** (gratisnivå med begränsningar).613- **GitHub Copilot** (gratis för studenter och öppen källkod).614- **Codeium/Windsurf** (generös gratisnivå).615616## 10. Från Demo till Produkt: Nästa Steg617618När din demo är live, här är hur du går vidare: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. **Samla feedback**: dela demon med potentiella användare och samla åsikter.6322. **Iterera snabbt**: använd vibecoding för att implementera begärda ändringar.6333. **Övervaka mätvärden**: Vercel Analytics och Supabase Dashboard ger dig väsentlig data.6344. **Skala vid behov**: uppgradera till betalplaner först när du har validerat efterfrågan.635636637## Slutsats638639Vibecoding med Claude Code, Supabase och Vercel representerar en kraftfull kombination för att bygga demos och MVP:er på rekordtid. Det som tidigare tog veckor av utveckling kan nu åstadkommas på bara några timmar, med en överraskande hög kvalitetsnivå.640641Nyckeln är att närma sig vibecoding med rätt inställning: det handlar inte om att "inte kunna koda" utan om att **förstärka dina förmågor** med AI-verktyg. Ju mer du vet om de underliggande teknologierna (React, SQL, autentisering, deployment), desto effektivare blir du på att guida AI-agenten mot önskat resultat.642643Framtiden för mjukvaruutveckling är här, och kostnaden för att komma igång har aldrig varit lägre. Skapa din demo, validera den med riktiga användare och bygg nästa fantastiska produkt.644645> **Checklista för din första demo:**646>647> - [x] Claude Code installerat och konfigurerat648> - [x] Supabase-projekt skapat med databasschema649> - [x] Next.js-projekt initierat med shadcn/ui650> - [x] Autentisering konfigurerad651> - [x] Fullständig CRUD implementerad652> - [x] Modern och responsiv UI653> - [x] Deployad till Vercel654> - [x] Delbar URL redo för feedback655
:Hur Man Bygger en Demo med Claude Code: Vibecoding med Supabase och Vercellines 1-655 (END) — press q to close