spinny:~/writing $ vim create-demo-claude-code-vibecoding.md
1~2**Vibecoding** là một mô hình phát triển phần mềm mới, trong đó lập trình viên hướng dẫn một tác nhân AI thông qua các chỉ dẫn bằng ngôn ngữ tự nhiên, để trí tuệ nhân tạo viết code thực tế. Thuật ngữ này được đặt ra bởi Andrej Karpathy (đồng sáng lập OpenAI và cựu Giám đốc AI tại Tesla) trong một tweet nổi tiếng vào tháng 2 năm 2025: _"Có một loại coding mới mà tôi gọi là vibecoding, nơi bạn hoàn toàn đắm chìm vào cảm xúc, đón nhận sự tăng trưởng theo cấp số nhân, và quên đi rằng code thậm chí còn tồn tại."_3~4Trong bài viết này, chúng ta sẽ xem cách xây dựng một demo hoàn chỉnh, hoạt động được sử dụng **Claude Code** làm tác nhân AI, **Supabase** làm backend (cơ sở dữ liệu, xác thực, API), và **Vercel** để triển khai - tất cả chỉ sử dụng **gói miễn phí** của các dịch vụ này.5~6## 1. Vibecoding Là Gì và Tại Sao Nó Mang Tính Cách Mạng7~8Vibecoding đại diện cho sự thay đổi mô hình cơ bản trong phát triển phần mềm. Thay vì viết code từng dòng, nhà phát triển:9~101. **Mô tả** những gì họ muốn bằng ngôn ngữ tự nhiên.112. **Tác nhân AI** tạo ra code hoàn chỉnh.123. **Nhà phát triển** xem xét, kiểm thử và lặp lại.13~14### Tại Sao Nó Hiệu Quả15~16- **Tốc độ**: dự án mất nhiều ngày có thể được xây dựng trong vài giờ.17- **Khả năng tiếp cận**: ngay cả những nhà phát triển không chuyên cũng có thể xây dựng sản phẩm hoạt động.18- **Lặp lại nhanh**: bạn có thể thử nghiệm ý tưởng và chuyển hướng nhanh hơn nhiều.19- **Tập trung vào sản phẩm**: bạn tập trung vào _cái gì_ thay vì _như thế nào_.20~21```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```30~31### Khi Nào Sử Dụng Vibecoding32~33Vibecoding hoàn hảo cho:34~35- **Demo và MVP**: nhanh chóng xây dựng prototype để xác nhận ý tưởng.36- **Hackathon**: tạo sản phẩm hoạt động chỉ trong vài giờ.37- **Dự án phụ**: khám phá công nghệ mới mà không cần đầu tư hàng tuần.38- **Proof of Concept**: chứng minh tính khả thi kỹ thuật cho các bên liên quan hoặc nhà đầu tư.39~40> **Cảnh báo:** Vibecoding tuyệt vời cho demo và prototype. Đối với ứng dụng cấp production với yêu cầu bảo mật và khả năng mở rộng cao, việc xem xét kỹ lưỡng code được tạo ra vẫn là cần thiết.41~42## 2. Tech Stack: Claude Code + Supabase + Vercel43~44### Claude Code45~46Claude Code là tác nhân coding AI của Anthropic. Nó hoạt động trực tiếp trong terminal của bạn và có thể:47~48- Đọc và hiểu toàn bộ codebase.49- Tạo, sửa đổi và xóa file.50- Thực thi lệnh terminal.51- Tương tác với API và dịch vụ bên ngoài.52- Quản lý phiên bản với Git.53- Tự động lặp lại trên lỗi và bug.54~55```bash56# Install Claude Code57npm install -g @anthropic-ai/claude-code58~59# Start in a project directory60cd my-project61claude62```63~64### Supabase (Gói Miễn Phí)65~66Supabase là giải pháp thay thế mã nguồn mở cho Firebase, cung cấp:67~68- **Cơ sở dữ liệu PostgreSQL**: cơ sở dữ liệu quan hệ hoàn chỉnh.69- **Xác thực**: đăng nhập bằng email, Google, GitHub, v.v.70- **API REST và Realtime**: tự động tạo từ schema của bạn.71- **Lưu trữ**: cho file và hình ảnh.72- **Edge Functions**: hàm serverless.73~74Gói miễn phí bao gồm:75~76| Tài nguyên | Giới hạn miễn phí |77|----------|-----------|78| Cơ sở dữ liệu | 500 MB |79| Lưu trữ | 1 GB |80| Băng thông | 5 GB |81| Lượt gọi Edge Function | 500K/tháng |82| Người dùng đã xác thực | Không giới hạn |83| Dự án | 2 dự án hoạt động |84~85### Vercel (Gói Miễn Phí)86~87Vercel là nền tảng triển khai hoàn hảo cho ứng dụng Next.js:88~89- **Triển khai tự động** từ GitHub.90- **Triển khai preview** cho mỗi nhánh và PR.91- **CDN toàn cầu** để có hiệu suất tối ưu.92- **Serverless Functions** đi kèm.93- **Phân tích cơ bản** miễn phí.94~95Gói miễn phí bao gồm:96~97| Tài nguyên | Giới hạn miễn phí |98|----------|-----------|99| Băng thông | 100 GB/tháng |100| Thực thi Serverless Function | 100 GB-giờ/tháng |101| Build | 6.000 phút/tháng |102| Dự án | Không giới hạn |103| Triển khai | Không giới hạn |104~105## 3. Thiết Lập Ban Đầu: Chuẩn Bị Môi Trường106~107### Điều Kiện Tiên Quyết108~109Trước khi bắt đầu, hãy đảm bảo bạn có:110~111- **Node.js 18+** đã cài đặt.112- **Git** đã cấu hình.113- Tài khoản **GitHub**.114- Tài khoản **Supabase** (miễn phí tại [supabase.com](https://supabase.com)).115- Tài khoản **Vercel** (miễn phí tại [vercel.com](https://vercel.com)).116- **Claude Code** đã cài đặt (`npm install -g @anthropic-ai/claude-code`).117~118### Bước 1: Tạo Dự Án119~120Mở terminal và khởi động Claude Code:121~122```bash123mkdir my-demo-app && cd my-demo-app124claude125```126~127Bây giờ bạn có thể bắt đầu đưa ra chỉ dẫn bằng ngôn ngữ tự nhiên cho Claude Code:128~129```130You: Create a Next.js 15 project with App Router, TypeScript, Tailwind CSS,131and shadcn/ui. Also initialize a Git repository.132```133~134Claude Code sẽ tự động thực thi:135~136```bash137npx create-next-app@latest . --typescript --tailwind --eslint --app --src-dir138npx shadcn@latest init139git init && git add . && git commit -m "Initial commit"140```141~142### Bước 2: Cấu Hình Supabase143~1441. Truy cập [supabase.com](https://supabase.com) và tạo dự án mới.1452. Ghi chú **Project URL** và **anon key** từ Settings > API.1463. Quay lại terminal với Claude Code:147~148```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```153~154Claude Code sẽ tạo cấu hình hoàn chỉnh:155~156```typescript157// src/lib/supabase/client.ts158import { createBrowserClient } from '@supabase/ssr';159~160export function createClient() {161 return createBrowserClient(162 process.env.NEXT_PUBLIC_SUPABASE_URL!,163 process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!164 );165}166```167~168```typescript169// src/lib/supabase/server.ts170import { createServerClient } from '@supabase/ssr';171import { cookies } from 'next/headers';172~173export async function createClient() {174 const cookieStore = await cookies();175~176 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```194~195## 4. Xây Dựng Demo: Ứng Dụng Quản Lý Công Việc196~197Hãy xây dựng một demo cụ thể: một **ứng dụng quản lý công việc** với xác thực, CRUD đầy đủ, và giao diện hiện đại.198~199### Định Nghĩa Schema Cơ Sở Dữ Liệu200~201Đưa ra chỉ dẫn cho Claude Code để tạo schema:202~203```204You: Create a SQL migration for Supabase with the following tables:205~2061. 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_at214~215Enable Row Level Security on all tables and create appropriate policies.216```217~218Claude Code sẽ tạo migration hoàn chỉnh:219~220```sql221-- Create enum types222CREATE TYPE task_status AS ENUM ('todo', 'in_progress', 'done');223CREATE TYPE task_priority AS ENUM ('low', 'medium', 'high');224~225-- 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);232~233-- 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);241~242-- 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);255~256-- Enable RLS257ALTER TABLE profiles ENABLE ROW LEVEL SECURITY;258ALTER TABLE projects ENABLE ROW LEVEL SECURITY;259ALTER TABLE tasks ENABLE ROW LEVEL SECURITY;260~261-- 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);266~267-- 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);276~277-- 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```295~296Bạn có thể chạy migration này trực tiếp từ bảng điều khiển Supabase (SQL Editor) hoặc qua CLI.297~298### Tạo TypeScript Types299~300```301You: Generate TypeScript types from the Supabase database and save them to src/types/database.ts302```303~304```bash305npx supabase gen types typescript --project-id YOUR_PROJECT_ID > src/types/database.ts306```307~308### Xây Dựng Giao Diện Người Dùng309~310Bây giờ là phần mạnh nhất của vibecoding. Đưa cho Claude Code các chỉ dẫn cấp cao:311~312```313You: Create a dashboard page for the task management app with:314~3151. 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 Tailwind320~321Use data from Supabase with React Server Components where possible322and Client Components only where interactivity is needed.323```324~325Claude Code sẽ xây dựng toàn bộ giao diện, từng component một.326~327### Thêm Xác Thực328~329```330You: Add a complete authentication system with:331~3321. 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```338~339Claude Code sẽ cấu hình middleware Next.js và các trang xác thực:340~341```typescript342// src/middleware.ts343import { createServerClient } from '@supabase/ssr';344import { NextResponse, type NextRequest } from 'next/server';345~346export async function middleware(request: NextRequest) {347 let supabaseResponse = NextResponse.next({ request });348~349 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 );369~370 const { data: { user } } = await supabase.auth.getUser();371~372 if (!user && !request.nextUrl.pathname.startsWith('/auth')) {373 const url = request.nextUrl.clone();374 url.pathname = '/auth/login';375 return NextResponse.redirect(url);376 }377~378 return supabaseResponse;379}380~381export const config = {382 matcher: ['/((?!_next/static|_next/image|favicon.ico|auth).*)'],383};384```385~386## 5. Các Mẫu Vibecoding Nâng Cao387~388### Prompting Lặp Lại389~390Bí quyết của vibecoding hiệu quả là **lặp lại**. Đừng cố mô tả mọi thứ trong một prompt duy nhất. Tiến hành từng bước:391~392```393Step 1: "Create the base layout with header and sidebar"394Step 2: "Add the project list in the sidebar with a button to create new ones"395Step 3: "Create the Kanban view in the main area"396Step 4: "Add drag & drop between columns"397Step 5: "Implement the modal to create new tasks"398Step 6: "Add toast notifications for user feedback"399```400~401> **Mẹo:** Prompt càng cụ thể và có ngữ cảnh, kết quả càng tốt. Claude Code có quyền truy cập toàn bộ codebase, nên có thể tích hợp các tính năng mới một cách nhất quán.402~403### Xử Lý Lỗi404~405Khi có điều gì đó không hoạt động (và sẽ xảy ra), bạn có thể đơn giản nói:406~407```408You: I'm getting this error in the console: "TypeError: Cannot read property409'map' of undefined" in the TaskList component. Fix it.410```411~412Claude Code sẽ phân tích code, xác định vấn đề và sửa nó.413~414### Tái Cấu Trúc với AI415~416```417You: The Dashboard component has become too large. Split it into smaller,418reusable components while maintaining the same functionality.419```420~421### Kiểm Thử422~423```424You: Add tests with Vitest for utility functions and Playwright tests for425the authentication and task creation flow.426```427~428## 6. Triển Khai lên Vercel: Từ Code ra Thế Giới429~430### Bước 1: Push lên GitHub431~432```433You: Create an appropriate .gitignore, commit everything, and push to a new434GitHub repository called "my-demo-app".435```436~437```bash438git add .439git commit -m "feat: complete task management demo"440gh repo create my-demo-app --public --push --source=.441```442~443### Bước 2: Kết Nối Vercel444~4451. Truy cập [vercel.com](https://vercel.com) và nhấp "Add New Project."4462. Import repository GitHub bạn vừa tạo.4473. Thêm biến môi trường:448 - `NEXT_PUBLIC_SUPABASE_URL`449 - `NEXT_PUBLIC_SUPABASE_ANON_KEY`4504. Nhấp "Deploy."451~452```mermaid453flowchart LR454 A[GitHub Push] --> B[Vercel Build]455 B --> C[Automatic Deploy]456 C --> D[Public URL]457 D --> E[Global CDN]458```459~460### Bước 3: Cấu Hình Tên Miền Tùy Chỉnh (Tùy Chọn)461~462Vercel cung cấp URL miễn phí như `my-demo-app.vercel.app`. Cho tên miền tùy chỉnh:463~464```465You: Add the configuration for a custom domain in vercel.json466```467~468### Triển Khai Preview469~470Mỗi khi bạn mở Pull Request trên GitHub, Vercel sẽ tự động tạo **triển khai preview** với URL duy nhất. Hoàn hảo để hiển thị thay đổi trước khi merge.471~472## 7. Tối Ưu Hóa Cho Demo Của Bạn473~474### Hiệu Suất475~476```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```483~484### Realtime với Supabase485~486Tính năng luôn gây ấn tượng trong demo là **realtime**:487~488```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```493~494```typescript495'use client';496~497import { useEffect, useState } from 'react';498import { createClient } from '@/lib/supabase/client';499import type { Task } from '@/types/database';500~501export function useRealtimeTasks(projectId: string) {502 const [tasks, setTasks] = useState<Task[]>([]);503 const supabase = createClient();504~505 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();533~534 return () => {535 supabase.removeChannel(channel);536 };537 }, [projectId, supabase]);538~539 return tasks;540}541```542~543### Chế Độ Tối544~545```546You: Add dark mode support with a toggle in the header.547Use Tailwind dark classes and save the preference in localStorage.548```549~550## 8. Các Thực Hành Tốt Nhất Cho Vibecoding Hiệu Quả551~552### 1. Cụ Thể Trong Prompt553~554```555❌ "Make a nice page"556✅ "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```559~560### 2. Cung Cấp Ngữ Cảnh561~562```563❌ "Add authentication"564✅ "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```568~569### 3. Lặp Lại Từng Bước Nhỏ570~571Đừng cố xây dựng mọi thứ trong một prompt. Tiến hành từng bước:572~5731. Layout cơ bản5742. Một tính năng mỗi lần5753. Styling và hoàn thiện5764. Xử lý lỗi5775. Kiểm thử578~579### 4. Xem Xét Code Được Tạo580~581Vibecoding không có nghĩa là không đọc code. Luôn xem xét:582~583- **Bảo mật**: chính sách RLS, xác thực đầu vào, làm sạch dữ liệu.584- **Hiệu suất**: truy vấn N+1, component client-side không cần thiết.585- **Thực hành tốt nhất**: cấu trúc dự án, quy ước đặt tên.586~587### 5. Sử Dụng Git Chiến Lược588~589```590You: Commit the changes with a descriptive message after each completed feature.591```592~593Điều này cho phép bạn revert nếu có sự cố.594~595## 9. Chi Phí: Có Thực Sự Hoàn Toàn Miễn Phí?596~597Phân tích chi phí cho mỗi dịch vụ:598~599| Dịch vụ | Gói Miễn Phí | Khi Nào Phải Trả |600|---------|-----------|-------------|601| **Claude Code** | Yêu cầu gói Anthropic (từ $20/tháng) hoặc API key | Ngay lập tức, nhưng giá trị rất lớn |602| **Supabase** | Gói miễn phí hào phóng (2 dự án, 500MB DB) | Vượt giới hạn miễn phí |603| **Vercel** | Gói miễn phí cho dự án cá nhân | Cho đội nhóm hoặc sử dụng thương mại |604| **GitHub** | Miễn phí cho repo công khai và riêng tư | Tính năng doanh nghiệp |605~606> **Lưu ý:** Claude Code yêu cầu đăng ký hoặc tín dụng API, nhưng lợi tức đầu tư về tốc độ phát triển là vượt trội. Cho demo hoặc MVP, tổng chi phí khoảng $20.607~608### Các Lựa Chọn AI Miễn Phí609~610Nếu bạn muốn chi phí hoàn toàn bằng không:611~612- **Cursor** (gói miễn phí với giới hạn).613- **GitHub Copilot** (miễn phí cho sinh viên và mã nguồn mở).614- **Codeium/Windsurf** (gói miễn phí hào phóng).615~616## 10. Từ Demo Đến Sản Phẩm: Các Bước Tiếp Theo617~618Khi demo của bạn đã lên sóng, đây là cách tiến hành:619~620```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```630~6311. **Thu thập phản hồi**: chia sẻ demo với người dùng tiềm năng và thu thập ý kiến.6322. **Lặp lại nhanh**: sử dụng vibecoding để triển khai các thay đổi được yêu cầu.6333. **Theo dõi chỉ số**: Vercel Analytics và Supabase Dashboard cung cấp dữ liệu thiết yếu.6344. **Mở rộng khi cần**: chỉ nâng cấp lên gói trả phí khi đã xác nhận nhu cầu.635~636~637## Kết Luận638~639Vibecoding với Claude Code, Supabase và Vercel đại diện cho sự kết hợp mạnh mẽ để xây dựng demo và MVP trong thời gian kỷ lục. Những gì trước đây mất hàng tuần phát triển giờ có thể hoàn thành chỉ trong vài giờ, với chất lượng cao đáng ngạc nhiên.640~641Chìa khóa là tiếp cận vibecoding với tư duy đúng đắn: không phải "không biết code" mà là **khuếch đại khả năng của bạn** với công cụ AI. Bạn càng biết nhiều về các công nghệ nền tảng (React, SQL, xác thực, triển khai), bạn càng hiệu quả trong việc hướng dẫn tác nhân AI đến kết quả mong muốn.642~643Tương lai của phát triển phần mềm đã ở đây, và chi phí để bắt đầu chưa bao giờ thấp hơn. Tạo demo của bạn, xác nhận với người dùng thực, và xây dựng sản phẩm vĩ đại tiếp theo.644~645> **Danh sách kiểm tra cho demo đầu tiên:**646>647> - [x] Claude Code đã cài đặt và cấu hình648> - [x] Dự án Supabase đã tạo với schema cơ sở dữ liệu649> - [x] Dự án Next.js đã khởi tạo với shadcn/ui650> - [x] Xác thực đã cấu hình651> - [x] CRUD đầy đủ đã triển khai652> - [x] UI hiện đại và responsive653> - [x] Đã triển khai lên Vercel654> - [x] URL có thể chia sẻ sẵn sàng cho phản hồi655~
NORMAL · create-demo-claude-code-vibecoding.md [readonly]655 lines · :q to close