Vibecoding เป็นแนวคิดการพัฒนาซอฟต์แวร์รูปแบบใหม่ที่โปรแกรมเมอร์นำทาง AI agent ผ่านคำสั่งภาษาธรรมชาติ ปล่อยให้ปัญญาประดิษฐ์เขียนโค้ดจริง คำนี้ถูกบัญญัติโดย Andrej Karpathy (ผู้ร่วมก่อตั้ง OpenAI และอดีตผู้อำนวยการ AI ที่ Tesla) ในทวีตที่โด่งดังเมื่อเดือนกุมภาพันธ์ 2025: "มีการเขียนโค้ดแบบใหม่ที่ผมเรียกว่า vibecoding ที่คุณปล่อยตัวไปกับบรรยากาศอย่างเต็มที่ ยอมรับการเติบโตแบบเอ็กซ์โพเนนเชียล และลืมไปว่าโค้ดมีอยู่จริง"
ในบทความนี้ เราจะดูวิธีสร้าง demo ที่สมบูรณ์และใช้งานได้โดยใช้ Claude Code เป็น AI agent, Supabase เป็น backend (ฐานข้อมูล, การยืนยันตัวตน, API) และ Vercel สำหรับ deployment — ทั้งหมดใช้เฉพาะ แพ็กเกจฟรี ของบริการเหล่านี้
1. Vibecoding คืออะไรและทำไมถึงเป็นการปฏิวัติ
Vibecoding เป็นตัวแทนของการเปลี่ยนแปลงกระบวนทัศน์พื้นฐานในการพัฒนาซอฟต์แวร์ แทนที่จะเขียนโค้ดทีละบรรทัด นักพัฒนา:
- อธิบาย สิ่งที่ต้องการด้วยภาษาธรรมชาติ
- AI agent สร้างโค้ดที่สมบูรณ์
- นักพัฒนา ตรวจสอบ ทดสอบ และทำซ้ำ
ทำไมจึงได้ผล
- ความเร็ว: โปรเจกต์ที่ต้องใช้เวลาหลายวันสามารถสร้างได้ในไม่กี่ชั่วโมง
- การเข้าถึง: แม้นักพัฒนาที่ไม่เชี่ยวชาญก็สามารถสร้างผลิตภัณฑ์ที่ใช้งานได้
- การทำซ้ำอย่างรวดเร็ว: คุณสามารถทดสอบไอเดียและเปลี่ยนทิศทางได้เร็วกว่ามาก
- มุ่งเน้นผลิตภัณฑ์: คุณมุ่งเน้นที่ อะไร แทนที่จะเป็น อย่างไร
เมื่อไรควรใช้ Vibecoding
Vibecoding เหมาะสำหรับ:
- Demo และ MVP: สร้าง prototype อย่างรวดเร็วเพื่อตรวจสอบไอเดีย
- Hackathon: สร้างผลิตภัณฑ์ที่ใช้งานได้ในเวลาเพียงไม่กี่ชั่วโมง
- โปรเจกต์ส่วนตัว: สำรวจเทคโนโลยีใหม่โดยไม่ต้องลงทุนหลายสัปดาห์
- Proof of Concept: แสดงความเป็นไปได้ทางเทคนิคให้ผู้มีส่วนได้ส่วนเสียหรือนักลงทุน
คำเตือน: Vibecoding ยอดเยี่ยมสำหรับ demo และ prototype สำหรับแอปพลิเคชันระดับ production ที่มีข้อกำหนดด้านความปลอดภัยและการขยายตัวสูง การตรวจสอบโค้ดที่สร้างขึ้นอย่างละเอียดยังคงจำเป็น
2. Tech Stack: Claude Code + Supabase + Vercel
Claude Code
Claude Code เป็น AI coding agent ของ Anthropic ทำงานโดยตรงในเทอร์มินัลของคุณและสามารถ:
- อ่านและเข้าใจ codebase ทั้งหมด
- สร้าง แก้ไข และลบไฟล์
- รันคำสั่งเทอร์มินัล
- โต้ตอบกับ API และบริการภายนอก
- จัดการ versioning ด้วย Git
- ทำซ้ำโดยอัตโนมัติเมื่อเจอ error และ bug
# Install Claude Code npm install -g @anthropic-ai/claude-code # Start in a project directory cd my-project claude
Supabase (แพ็กเกจฟรี)
Supabase เป็นทางเลือก open-source ของ Firebase ที่เสนอ:
- ฐานข้อมูล PostgreSQL: ฐานข้อมูลเชิงสัมพันธ์ที่สมบูรณ์
- การยืนยันตัวตน: เข้าสู่ระบบด้วยอีเมล, Google, GitHub ฯลฯ
- REST และ Realtime API: สร้างอัตโนมัติจาก schema ของคุณ
- Storage: สำหรับไฟล์และรูปภาพ
- Edge Functions: ฟังก์ชัน serverless
แพ็กเกจฟรีรวมถึง:
| ทรัพยากร | ขีดจำกัดฟรี | |----------|-----------| | ฐานข้อมูล | 500 MB | | Storage | 1 GB | | แบนด์วิดท์ | 5 GB | | การเรียก Edge Function | 500K/เดือน | | ผู้ใช้ที่ยืนยันตัวตน | ไม่จำกัด | | โปรเจกต์ | 2 โปรเจกต์ที่ใช้งานอยู่ |
Vercel (แพ็กเกจฟรี)
Vercel เป็นแพลตฟอร์ม deployment ที่สมบูรณ์แบบสำหรับแอปพลิเคชัน Next.js:
- Deployment อัตโนมัติ จาก GitHub
- Preview deployment สำหรับทุก branch และ PR
- CDN ทั่วโลก เพื่อประสิทธิภาพสูงสุด
- Serverless Functions รวมอยู่แล้ว
- การวิเคราะห์พื้นฐาน ฟรี
แพ็กเกจฟรีรวมถึง:
| ทรัพยากร | ขีดจำกัดฟรี | |----------|-----------| | แบนด์วิดท์ | 100 GB/เดือน | | การรัน Serverless Function | 100 GB-ชั่วโมง/เดือน | | Build | 6,000 นาที/เดือน | | โปรเจกต์ | ไม่จำกัด | | Deployment | ไม่จำกัด |
3. การตั้งค่าเริ่มต้น: เตรียมสภาพแวดล้อม
ข้อกำหนดเบื้องต้น
ก่อนเริ่ม ตรวจสอบให้แน่ใจว่าคุณมี:
- Node.js 18+ ติดตั้งแล้ว
- Git กำหนดค่าแล้ว
- บัญชี GitHub
- บัญชี Supabase (ฟรีที่ supabase.com)
- บัญชี Vercel (ฟรีที่ vercel.com)
- Claude Code ติดตั้งแล้ว (
npm install -g @anthropic-ai/claude-code)
ขั้นตอนที่ 1: สร้างโปรเจกต์
เปิดเทอร์มินัลและเริ่ม Claude Code:
mkdir my-demo-app && cd my-demo-app claude
ตอนนี้คุณสามารถเริ่มให้คำสั่ง Claude Code ด้วยภาษาธรรมชาติ:
You: Create a Next.js 15 project with App Router, TypeScript, Tailwind CSS,
and shadcn/ui. Also initialize a Git repository.
Claude Code จะรันอัตโนมัติ:
npx create-next-app@latest . --typescript --tailwind --eslint --app --src-dir npx shadcn@latest init git init && git add . && git commit -m "Initial commit"
ขั้นตอนที่ 2: กำหนดค่า Supabase
- ไปที่ supabase.com และสร้างโปรเจกต์ใหม่
- จดบันทึก Project URL และ anon key จาก Settings > API
- กลับไปที่เทอร์มินัลกับ Claude Code:
You: Add Supabase to the project. Create a .env.local file with the variables
NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_ANON_KEY. Configure the
Supabase client with SSR support for Next.js App Router.
Claude Code จะสร้างการกำหนดค่าที่สมบูรณ์:
// src/lib/supabase/client.ts import { createBrowserClient } from '@supabase/ssr'; export function createClient() { return createBrowserClient( process.env.NEXT_PUBLIC_SUPABASE_URL!, process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY! ); }
// src/lib/supabase/server.ts import { createServerClient } from '@supabase/ssr'; import { cookies } from 'next/headers'; export async function createClient() { const cookieStore = await cookies(); return createServerClient( process.env.NEXT_PUBLIC_SUPABASE_URL!, process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, { cookies: { getAll() { return cookieStore.getAll(); }, setAll(cookiesToSet) { cookiesToSet.forEach(({ name, value, options }) => cookieStore.set(name, value, options) ); }, }, } ); }
4. สร้าง Demo: แอปจัดการงาน
มาสร้าง demo ที่เป็นรูปธรรม: แอปจัดการงาน พร้อมการยืนยันตัวตน, CRUD ครบถ้วน และอินเทอร์เฟซทันสมัย
กำหนด Database Schema
ให้คำสั่ง Claude Code เพื่อสร้าง schema:
You: Create a SQL migration for Supabase with the following tables:
1. profiles: id (uuid, FK to auth.users), username (text), avatar_url (text),
created_at
2. projects: id (uuid), name (text), description (text), owner_id (uuid, FK
to profiles), created_at
3. tasks: id (uuid), title (text), description (text), status (enum:
todo/in_progress/done), priority (enum: low/medium/high), project_id (uuid,
FK to projects), assigned_to (uuid, FK to profiles), due_date (timestamp),
created_at, updated_at
Enable Row Level Security on all tables and create appropriate policies.
Claude Code จะสร้าง migration ที่สมบูรณ์:
-- Create enum types CREATE TYPE task_status AS ENUM ('todo', 'in_progress', 'done'); CREATE TYPE task_priority AS ENUM ('low', 'medium', 'high'); -- Profiles table CREATE TABLE profiles ( id UUID REFERENCES auth.users ON DELETE CASCADE PRIMARY KEY, username TEXT UNIQUE, avatar_url TEXT, created_at TIMESTAMPTZ DEFAULT NOW() ); -- Projects table CREATE TABLE projects ( id UUID DEFAULT gen_random_uuid() PRIMARY KEY, name TEXT NOT NULL, description TEXT, owner_id UUID REFERENCES profiles(id) ON DELETE CASCADE NOT NULL, created_at TIMESTAMPTZ DEFAULT NOW() ); -- Tasks table CREATE TABLE tasks ( id UUID DEFAULT gen_random_uuid() PRIMARY KEY, title TEXT NOT NULL, description TEXT, status task_status DEFAULT 'todo', priority task_priority DEFAULT 'medium', project_id UUID REFERENCES projects(id) ON DELETE CASCADE NOT NULL, assigned_to UUID REFERENCES profiles(id), due_date TIMESTAMPTZ, created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW() ); -- Enable RLS ALTER TABLE profiles ENABLE ROW LEVEL SECURITY; ALTER TABLE projects ENABLE ROW LEVEL SECURITY; ALTER TABLE tasks ENABLE ROW LEVEL SECURITY; -- Profiles policies CREATE POLICY "Users can view own profile" ON profiles FOR SELECT USING (auth.uid() = id); CREATE POLICY "Users can update own profile" ON profiles FOR UPDATE USING (auth.uid() = id); -- Projects policies CREATE POLICY "Users can view own projects" ON projects FOR SELECT USING (auth.uid() = owner_id); CREATE POLICY "Users can create projects" ON projects FOR INSERT WITH CHECK (auth.uid() = owner_id); CREATE POLICY "Users can update own projects" ON projects FOR UPDATE USING (auth.uid() = owner_id); CREATE POLICY "Users can delete own projects" ON projects FOR DELETE USING (auth.uid() = owner_id); -- Tasks policies CREATE POLICY "Users can view tasks in their projects" ON tasks FOR SELECT USING ( project_id IN (SELECT id FROM projects WHERE owner_id = auth.uid()) ); CREATE POLICY "Users can create tasks in their projects" ON tasks FOR INSERT WITH CHECK ( project_id IN (SELECT id FROM projects WHERE owner_id = auth.uid()) ); CREATE POLICY "Users can update tasks in their projects" ON tasks FOR UPDATE USING ( project_id IN (SELECT id FROM projects WHERE owner_id = auth.uid()) ); CREATE POLICY "Users can delete tasks in their projects" ON tasks FOR DELETE USING ( project_id IN (SELECT id FROM projects WHERE owner_id = auth.uid()) );
คุณสามารถรัน migration นี้ได้โดยตรงจากแดชบอร์ด Supabase (SQL Editor) หรือผ่าน CLI
สร้าง TypeScript Types
You: Generate TypeScript types from the Supabase database and save them to src/types/database.ts
npx supabase gen types typescript --project-id YOUR_PROJECT_ID > src/types/database.ts
สร้างอินเทอร์เฟซผู้ใช้
ตอนนี้เป็นส่วนที่ทรงพลังที่สุดของ vibecoding ให้คำสั่งระดับสูงแก่ Claude Code:
You: Create a dashboard page for the task management app with:
1. Sidebar with navigation between projects
2. Kanban view with 3 columns (Todo, In Progress, Done) with drag & drop
3. Modal to create/edit tasks
4. Header with user avatar and logout
5. Modern design with shadcn/ui and Tailwind
Use data from Supabase with React Server Components where possible
and Client Components only where interactivity is needed.
Claude Code จะสร้างอินเทอร์เฟซทั้งหมด ทีละ component
เพิ่มการยืนยันตัวตน
You: Add a complete authentication system with:
1. Login page with email/password and GitHub login
2. Registration page
3. Middleware to protect authenticated routes
4. Automatic redirect for unauthenticated users
5. Automatic profile creation after registration
Claude Code จะกำหนดค่า Next.js middleware และหน้า auth:
// src/middleware.ts import { createServerClient } from '@supabase/ssr'; import { NextResponse, type NextRequest } from 'next/server'; export async function middleware(request: NextRequest) { let supabaseResponse = NextResponse.next({ request }); const supabase = createServerClient( process.env.NEXT_PUBLIC_SUPABASE_URL!, process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, { cookies: { getAll() { return request.cookies.getAll(); }, setAll(cookiesToSet) { cookiesToSet.forEach(({ name, value }) => request.cookies.set(name, value) ); supabaseResponse = NextResponse.next({ request }); cookiesToSet.forEach(({ name, value, options }) => supabaseResponse.cookies.set(name, value, options) ); }, }, } ); const { data: { user } } = await supabase.auth.getUser(); if (!user && !request.nextUrl.pathname.startsWith('/auth')) { const url = request.nextUrl.clone(); url.pathname = '/auth/login'; return NextResponse.redirect(url); } return supabaseResponse; } export const config = { matcher: ['/((?!_next/static|_next/image|favicon.ico|auth).*)'], };
5. รูปแบบ Vibecoding ขั้นสูง
Prompting แบบทำซ้ำ
ความลับของ vibecoding ที่มีประสิทธิภาพคือ การทำซ้ำ อย่าพยายามอธิบายทุกอย่างในprompt เดียว ดำเนินการเป็นขั้นตอน:
Step 1: "Create the base layout with header and sidebar"
Step 2: "Add the project list in the sidebar with a button to create new ones"
Step 3: "Create the Kanban view in the main area"
Step 4: "Add drag & drop between columns"
Step 5: "Implement the modal to create new tasks"
Step 6: "Add toast notifications for user feedback"
เคล็ดลับ: ยิ่ง prompt เฉพาะเจาะจงและมีบริบทมากเท่าไร ผลลัพธ์ก็ยิ่งดีเท่านั้น Claude Code มีสิทธิ์เข้าถึง codebase ทั้งหมด จึงสามารถรวมฟีเจอร์ใหม่ได้อย่างสอดคล้อง
การจัดการ Error
เมื่อมีบางอย่างไม่ทำงาน (และจะเกิดขึ้น) คุณสามารถพูดได้ว่า:
You: I'm getting this error in the console: "TypeError: Cannot read property
'map' of undefined" in the TaskList component. Fix it.
Claude Code จะวิเคราะห์โค้ด ระบุปัญหา และแก้ไข
Refactoring ด้วย AI
You: The Dashboard component has become too large. Split it into smaller,
reusable components while maintaining the same functionality.
การทดสอบ
You: Add tests with Vitest for utility functions and Playwright tests for
the authentication and task creation flow.
6. Deploy บน Vercel: จากโค้ดสู่โลก
ขั้นตอนที่ 1: Push ไป GitHub
You: Create an appropriate .gitignore, commit everything, and push to a new
GitHub repository called "my-demo-app".
git add . git commit -m "feat: complete task management demo" gh repo create my-demo-app --public --push --source=.
ขั้นตอนที่ 2: เชื่อมต่อ Vercel
- ไปที่ vercel.com และคลิก "Add New Project"
- Import repository GitHub ที่คุณเพิ่งสร้าง
- เพิ่มตัวแปรสภาพแวดล้อม:
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEY
- คลิก "Deploy"
ขั้นตอนที่ 3: กำหนดค่าโดเมนที่กำหนดเอง (ตัวเลือก)
Vercel ให้ URL ฟรีเช่น my-demo-app.vercel.app สำหรับโดเมนที่กำหนดเอง:
You: Add the configuration for a custom domain in vercel.json
Preview Deployment
ทุกครั้งที่คุณเปิด Pull Request บน GitHub Vercel จะสร้าง preview deployment อัตโนมัติพร้อม URL เฉพาะ เหมาะสำหรับแสดงการเปลี่ยนแปลงก่อน merge
7. การเพิ่มประสิทธิภาพสำหรับ Demo ของคุณ
ประสิทธิภาพ
You: Optimize the app's performance:
1. Add loading states with Suspense and skeletons
2. Implement caching with Next.js unstable_cache
3. Optimize images with next/image
4. Add SEO metadata for each page
Realtime กับ Supabase
ฟีเจอร์ที่สร้างความประทับใจใน demo เสมอคือ realtime:
You: Add realtime synchronization for tasks using Supabase Realtime.
When a user updates a task, all other users should see the change
in real time without refreshing.
'use client'; import { useEffect, useState } from 'react'; import { createClient } from '@/lib/supabase/client'; import type { Task } from '@/types/database'; export function useRealtimeTasks(projectId: string) { const [tasks, setTasks] = useState<Task[]>([]); const supabase = createClient(); useEffect(() => { const channel = supabase .channel('tasks-changes') .on( 'postgres_changes', { event: '*', schema: 'public', table: 'tasks', filter: `project_id=eq.${projectId}`, }, (payload) => { if (payload.eventType === 'INSERT') { setTasks((prev) => [...prev, payload.new as Task]); } else if (payload.eventType === 'UPDATE') { setTasks((prev) => prev.map((t) => t.id === payload.new.id ? (payload.new as Task) : t ) ); } else if (payload.eventType === 'DELETE') { setTasks((prev) => prev.filter((t) => t.id !== payload.old.id) ); } } ) .subscribe(); return () => { supabase.removeChannel(channel); }; }, [projectId, supabase]); return tasks; }
โหมดมืด
You: Add dark mode support with a toggle in the header.
Use Tailwind dark classes and save the preference in localStorage.
8. แนวปฏิบัติที่ดีที่สุดสำหรับ Vibecoding ที่มีประสิทธิภาพ
1. เฉพาะเจาะจงใน Prompt ของคุณ
❌ "Make a nice page"
✅ "Create a landing page with a hero section with a purple-blue gradient,
a features section with 3 cards with icons, and an orange CTA button"
2. ให้บริบท
❌ "Add authentication"
✅ "Add authentication with Supabase Auth. The project uses Next.js 15 App
Router with TypeScript. I want email/password login and OAuth with GitHub.
Use the SSR pattern with @supabase/ssr"
3. ทำซ้ำเป็นขั้นตอนเล็กๆ
อย่าพยายามสร้างทุกอย่างใน prompt เดียว ดำเนินการเป็นลำดับ:
- Layout พื้นฐาน
- ฟีเจอร์ทีละอย่าง
- Styling และขัดเกลา
- การจัดการ error
- การทดสอบ
4. ตรวจสอบโค้ดที่สร้างขึ้น
Vibecoding ไม่ได้หมายความว่าไม่อ่านโค้ด ตรวจสอบเสมอ:
- ความปลอดภัย: นโยบาย RLS, การตรวจสอบ input, การทำความสะอาดข้อมูล
- ประสิทธิภาพ: N+1 query, component ฝั่ง client ที่ไม่จำเป็น
- แนวปฏิบัติที่ดี: โครงสร้างโปรเจกต์, หลักการตั้งชื่อ
5. ใช้ Git อย่างเป็นกลยุทธ์
You: Commit the changes with a descriptive message after each completed feature.
ช่วยให้คุณ revert ได้หากมีปัญหา
9. ค่าใช้จ่าย: ฟรีจริงทั้งหมดหรือ?
การวิเคราะห์ค่าใช้จ่ายสำหรับแต่ละบริการ:
| บริการ | แผนฟรี | เมื่อไรต้องจ่าย | |---------|-----------|-------------| | Claude Code | ต้องมีแผน Anthropic (เริ่มต้น $20/เดือน) หรือ API key | ทันที แต่คุณค่ามหาศาล | | Supabase | แพ็กเกจฟรีใจกว้าง (2 โปรเจกต์, 500MB DB) | เกินขีดจำกัดแพ็กเกจฟรี | | Vercel | แพ็กเกจฟรีสำหรับโปรเจกต์ส่วนตัว | สำหรับทีมหรือใช้เชิงพาณิชย์ | | GitHub | ฟรีสำหรับ repo สาธารณะและส่วนตัว | ฟีเจอร์ระดับองค์กร |
หมายเหตุ: Claude Code ต้องมีการสมัครสมาชิกหรือเครดิต API แต่ผลตอบแทนจากการลงทุนในแง่ของความเร็วในการพัฒนานั้นยอดเยี่ยม สำหรับ demo หรือ MVP ค่าใช้จ่ายรวมอยู่ที่ประมาณ $20
ทางเลือก AI ฟรี
หากคุณต้องการให้ค่าใช้จ่ายเป็นศูนย์:
- Cursor (แพ็กเกจฟรีพร้อมข้อจำกัด)
- GitHub Copilot (ฟรีสำหรับนักเรียนและ open source)
- Codeium/Windsurf (แพ็กเกจฟรีใจกว้าง)
10. จาก Demo สู่ผลิตภัณฑ์: ขั้นตอนถัดไป
เมื่อ demo ของคุณเปิดใช้งานแล้ว นี่คือวิธีดำเนินการต่อ:
- รวบรวมความคิดเห็น: แชร์ demo กับผู้ใช้ที่มีศักยภาพและรวบรวมความเห็น
- ทำซ้ำอย่างรวดเร็ว: ใช้ vibecoding เพื่อใช้งานการเปลี่ยนแปลงที่ร้องขอ
- ติดตามตัวชี้วัด: Vercel Analytics และ Supabase Dashboard ให้ข้อมูลที่จำเป็น
- ขยายตามความจำเป็น: อัปเกรดเป็นแผนแบบชำระเงินเมื่อตรวจสอบความต้องการแล้วเท่านั้น
สรุป
Vibecoding กับ Claude Code, Supabase และ Vercel เป็นการผสมผสานที่ทรงพลังสำหรับการสร้าง demo และ MVP ในเวลาเร็กคอร์ด สิ่งที่เคยใช้เวลาหลายสัปดาห์ในการพัฒนาตอนนี้สามารถทำได้ในเวลาเพียงไม่กี่ชั่วโมง ด้วยคุณภาพที่สูงอย่างน่าประหลาดใจ
กุญแจสำคัญคือการเข้าหา vibecoding ด้วยความคิดที่ถูกต้อง: ไม่ใช่เรื่องของ "ไม่รู้วิธีเขียนโค้ด" แต่เป็นเรื่องของ การขยายความสามารถของคุณ ด้วยเครื่องมือ AI ยิ่งคุณรู้เกี่ยวกับเทคโนโลยีพื้นฐาน (React, SQL, การยืนยันตัวตน, deployment) มากเท่าไร คุณก็จะยิ่งมีประสิทธิภาพในการนำทาง AI agent ไปสู่ผลลัพธ์ที่ต้องการ
อนาคตของการพัฒนาซอฟต์แวร์อยู่ที่นี่แล้ว และค่าใช้จ่ายในการเริ่มต้นไม่เคยต่ำขนาดนี้ สร้าง demo ของคุณ ตรวจสอบกับผู้ใช้จริง และสร้างผลิตภัณฑ์ที่ยิ่งใหญ่ต่อไป
รายการตรวจสอบสำหรับ demo แรกของคุณ:
- [x] Claude Code ติดตั้งและกำหนดค่าแล้ว
- [x] โปรเจกต์ Supabase สร้างพร้อม database schema
- [x] โปรเจกต์ Next.js เริ่มต้นพร้อม shadcn/ui
- [x] การยืนยันตัวตนกำหนดค่าแล้ว
- [x] CRUD ครบถ้วนดำเนินการแล้ว
- [x] UI ทันสมัยและ responsive
- [x] Deploy บน Vercel แล้ว
- [x] URL ที่แชร์ได้พร้อมสำหรับความคิดเห็น