--- name: cloudflare-workers-expert description: "Expert guide for Cloudflare Workers ecosystem — Workers, D1 (SQLite at edge), KV, R2 (S3-compatible storage), Queues, Durable Objects, Hyperdrive, and Workers AI / Panduan ahli ekosistem Cloudflare Workers — Workers, D1, KV, R2, Queues, Durable Objects, Hyperdrive, dan Workers AI." author: "Roedy Rustam" version: "4.4.2" --- # Cloudflare Workers Ecosystem Expert (2026 Edition) [English](#english) | [Bahasa Indonesia](#bahasa-indonesia) --- ## English ### Orchestration & Integration Connects and orchestrates with domain skills: - **Edge Backend & APIs**: `js-backend-expert` (Hono v4 on Workers, V8 isolates), `api-design-expert` (edge REST & RPC endpoints), and `sse-websocket-streaming-expert` (Durable Objects WebSockets). - **Edge Storage & DBs**: `database-orm-expert` (Drizzle with D1, Hyperdrive pooling), `file-upload-media-expert` (R2 presigned URLs), and `vector-db-rag-expert` (Vectorize & Workers AI). - **Frontend & Cloud**: `cloud-hosting-expert` (custom domains, CDN rules), `senior-frontend` (Workers Static Assets), and `anti-slop` (clean edge architecture without node:fs polyfill traps). - **Lifecycle & DevOps**: `ci-cd-devops-architect` (GitHub Actions Wrangler deployments), `brainstorming`, and `zero-to-prod-orchestrator` (Phase 4: Backend & APIs). ### Description Expert guide for building full-stack edge applications using the **Cloudflare Workers** ecosystem. Covers Workers runtime, D1 (SQLite at edge), KV (key-value store), R2 (S3-compatible object storage), Queues (message queues), Durable Objects (stateful edge), Hyperdrive (database connection pooling), Workers AI (inference at edge), and Wrangler CLI for development and deployment. ### Trigger Conditions - Building serverless edge applications on Cloudflare Workers. - Using **D1** as an edge SQLite database. - Storing files with **R2** (S3-compatible, zero egress fees). - Implementing **KV** for distributed key-value caching. - Building stateful applications with **Durable Objects**. - Setting up **Queues** for async job processing at the edge. - Connecting to external databases via **Hyperdrive** connection pooling. - Running AI inference at the edge with **Workers AI**. - Deploying with **Wrangler CLI** and `wrangler.toml` configuration. - Using **Hono v4** as the web framework on Workers. ### What's New in 2026 #### Cloudflare Workers — Platform Updates - **D1 GA**: SQLite at the edge — fully production-ready with point-in-time recovery, read replicas, and up to 10GB databases. - **Queues GA**: Reliable message queues for async processing, dead letter queues, and batch consumption. - **Hyperdrive GA**: Connection pooling for PostgreSQL, MySQL — eliminates cold connection latency from Workers. - **Workers AI Stable**: Run LLM inference (Llama 3, Mistral, embedding models) at the edge with zero cold starts. - **Durable Objects Hibernation**: Cost-effective stateful edge — objects hibernate when idle, wake instantly on request. - **Workers Static Assets**: Serve static files directly from Workers without separate Pages deployment. - **Node.js Compatibility Mode**: Import Node.js built-in modules (`node:crypto`, `node:buffer`, `node:streams`) directly in Workers. ### Core Architecture Patterns #### 1. Project Setup (Wrangler + Hono) ```bash # Create new Workers project with Hono npm create cloudflare@latest my-app -- --framework=hono cd my-app # wrangler.toml configuration ``` ```toml # wrangler.toml name = "my-app" compatibility_date = "2026-10-01" compatibility_flags = ["nodejs_compat_v2"] # D1 Database [[d1_databases]] binding = "DB" database_name = "my-app-db" database_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" # KV Namespace [[kv_namespaces]] binding = "CACHE" id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # R2 Bucket [[r2_buckets]] binding = "STORAGE" bucket_name = "my-app-assets" # Queue Producer [[queues.producers]] queue = "email-queue" binding = "EMAIL_QUEUE" # Queue Consumer [[queues.consumers]] queue = "email-queue" max_batch_size = 10 max_batch_timeout = 30 # Durable Object [[durable_objects.bindings]] name = "RATE_LIMITER" class_name = "RateLimiter" [[migrations]] tag = "v1" new_classes = ["RateLimiter"] # Hyperdrive (PostgreSQL connection pooling) [[hyperdrive]] binding = "HYPERDRIVE" id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # Workers AI [ai] binding = "AI" ``` #### 2. Hono Application on Workers ```typescript import { Hono } from 'hono'; import { cors } from 'hono/cors'; import { bearerAuth } from 'hono/bearer-auth'; type Bindings = { DB: D1Database; CACHE: KVNamespace; STORAGE: R2Bucket; EMAIL_QUEUE: Queue; AI: Ai; HYPERDRIVE: Hyperdrive; }; const app = new Hono<{ Bindings: Bindings }>(); app.use('*', cors()); // D1 SQLite query app.get('/api/products', async (c) => { const { results } = await c.env.DB.prepare( 'SELECT id, name, price FROM products WHERE active = 1 ORDER BY created_at DESC LIMIT 50' ).all(); return c.json(results); }); // KV cache-aside pattern app.get('/api/config/:key', async (c) => { const key = c.req.param('key'); const cached = await c.env.CACHE.get(key, 'json'); if (cached) return c.json(cached); const { results } = await c.env.DB.prepare( 'SELECT value FROM config WHERE key = ?' ).bind(key).all(); if (results.length > 0) { await c.env.CACHE.put(key, JSON.stringify(results[0]), { expirationTtl: 3600 }); return c.json(results[0]); } return c.notFound(); }); // R2 file upload app.post('/api/upload', async (c) => { const formData = await c.req.formData(); const file = formData.get('file') as File; const key = `uploads/${Date.now()}-${file.name}`; await c.env.STORAGE.put(key, file.stream(), { httpMetadata: { contentType: file.type }, }); return c.json({ key, url: `/files/${key}` }); }); // Queue producer — send async job app.post('/api/send-email', async (c) => { const body = await c.req.json(); await c.env.EMAIL_QUEUE.send({ to: body.email, subject: body.subject, template: body.template, }); return c.json({ status: 'queued' }); }); // Workers AI — text generation app.post('/api/ai/generate', async (c) => { const { prompt } = await c.req.json(); const response = await c.env.AI.run('@cf/meta/llama-3.1-8b-instruct', { messages: [{ role: 'user', content: prompt }], }); return c.json(response); }); export default app; // Queue consumer handler export default { ...app, async queue(batch: MessageBatch, env: Bindings): Promise { for (const message of batch.messages) { const { to, subject, template } = message.body as EmailJob; await sendEmail(to, subject, template); // your email sending logic message.ack(); } }, }; ``` #### 3. D1 Migrations ```bash # Create migration wrangler d1 migrations create my-app-db create_products # Write SQL migration # migrations/0001_create_products.sql ``` ```sql CREATE TABLE products ( id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))), name TEXT NOT NULL, price REAL NOT NULL CHECK(price >= 0), description TEXT DEFAULT '', active INTEGER DEFAULT 1, created_at TEXT DEFAULT (datetime('now')), updated_at TEXT DEFAULT (datetime('now')) ); CREATE INDEX idx_products_active ON products(active); CREATE INDEX idx_products_created ON products(created_at DESC); ``` ```bash # Apply migration wrangler d1 migrations apply my-app-db ``` #### 4. Durable Objects (Stateful Edge) ```typescript export class RateLimiter implements DurableObject { private requests: number[] = []; private readonly limit = 100; private readonly windowMs = 60_000; constructor(private state: DurableObjectState, private env: Bindings) {} async fetch(request: Request): Promise { const now = Date.now(); this.requests = this.requests.filter(t => now - t < this.windowMs); if (this.requests.length >= this.limit) { return new Response('Rate limit exceeded', { status: 429 }); } this.requests.push(now); await this.state.storage.put('requests', this.requests); return new Response('OK', { headers: { 'X-RateLimit-Remaining': String(this.limit - this.requests.length), 'X-RateLimit-Limit': String(this.limit), }, }); } } ``` #### 5. Hyperdrive (External Database Connection) ```typescript import { Client } from 'pg'; app.get('/api/users', async (c) => { const client = new Client({ connectionString: c.env.HYPERDRIVE.connectionString }); await client.connect(); const { rows } = await client.query('SELECT id, email, name FROM users LIMIT 100'); await client.end(); return c.json(rows); }); ``` ### Performance Best Practices 1. **Use D1 for read-heavy workloads** — SQLite at edge with automatic read replicas. 2. **KV for hot cache** — Sub-millisecond reads for configuration, feature flags, and session data. 3. **R2 for assets** — Zero egress fees, S3-compatible API. 4. **Queues for async work** — Decouple request handling from background processing. 5. **Hyperdrive for external DBs** — Connection pooling eliminates cold connection latency. 6. **Workers AI for inference** — Run models at edge without managing GPU infrastructure. 7. **Use `waitUntil()`** — For fire-and-forget operations (logging, analytics) after response is sent. ### Anti-Patterns to Avoid 1. **Storing large blobs in KV** — Use R2 for files >25MB. KV is for small values (<25MB). 2. **Opening new DB connections per request without Hyperdrive** — Cold connections add 50-200ms latency. 3. **Not using prepared statements with D1** — Always use `.prepare().bind()` to prevent SQL injection. 4. **Synchronous heavy computation** — Workers have a CPU time limit (10-30ms for free, 30s for paid). Offload to Queues. 5. **Ignoring `wrangler dev --remote`** — Use remote mode to test D1, R2, and KV with real data. ### Sovereign Execution, Token Efficiency & Invariants | Dimension | Sovereign Mandate & Deterministic Contract | | :--- | :--- | | **Frontier Model Cascade** | Medium / High (`GPT-5.6 Sol Medium`, `Gemini 4 Argon`, `Claude Sonnet 5.5 High`, `Grok 4.7 High Fast`) | | **Availability Fallback** | `Gemini 4 Argon/Pro` -> `Gemini 3.8 Flash`; `Claude Opus 5.5` -> `Claude Opus 4.6` (Zero unhandled missing-model errors) | | **KV-Cache & Token Protocol** | Pin static instructions & schemas at prompt prefix (`kv-cache-prefix-optimizer`); pass surgical `CONTEXT_MAP.md` slices (<250 tokens/call) during Swarm Fan-Out | | **SaaT CLI & MCP Dispatch** | CLI: `vibes skill exec cloudflare-workers-expert ` / MCP: `vibes_skill_dispatch`, `vibes_ast_query`, `vibes_compile_cache`, `vibes_optimize_budget`, `vibes_verify_gate` | | **NFR & Anti-Slop Invariants** | P99 API Gateway Latency < 85ms, OpenAPI 3.1 / TypeSpec strict schema parity, RFC 9457 Problem Details error contracts, Idempotency-Key enforcement; 100% complete zero-placeholder output verified via `node scripts/check-anti-slop.js --strict` | --- --- ## Bahasa Indonesia ### Integrasi Orkestrasi Terhubung dan mengorkestrasi bersama skill domain: - **Backend Edge & API**: `js-backend-expert` (Hono v4 di Workers, V8 isolates), `api-design-expert` (endpoint REST & RPC di edge), dan `sse-websocket-streaming-expert` (WebSocket Durable Objects). - **Penyimpanan Edge & Database**: `database-orm-expert` (Drizzle dengan D1, pooling Hyperdrive), `file-upload-media-expert` (presigned URL R2), dan `vector-db-rag-expert` (Vectorize & Workers AI). - **Frontend & Cloud**: `cloud-hosting-expert` (custom domain, aturan CDN), `senior-frontend` (Workers Static Assets), dan `anti-slop` (arsitektur edge bersih tanpa jebakan polyfill node:fs). - **Siklus Hidup & DevOps**: `ci-cd-devops-architect` (deployment Wrangler via GitHub Actions), `brainstorming`, dan `zero-to-prod-orchestrator` (Fase 4: Backend & APIs). ### Deskripsi Panduan ahli untuk membangun aplikasi full-stack edge menggunakan ekosistem **Cloudflare Workers**. Mencakup runtime Workers, D1 (SQLite di edge), KV (key-value store), R2 (object storage kompatibel S3), Queues (antrean pesan), Durable Objects (stateful edge), Hyperdrive (connection pooling database), Workers AI (inferensi di edge), dan Wrangler CLI untuk pengembangan dan deployment. ### Kondisi Pemicu - Membangun aplikasi edge serverless di Cloudflare Workers. - Menggunakan **D1** sebagai database SQLite di edge. - Menyimpan file dengan **R2** (kompatibel S3, tanpa biaya egress). - Mengimplementasikan **KV** untuk caching key-value terdistribusi. - Membangun aplikasi stateful dengan **Durable Objects**. - Menyiapkan **Queues** untuk pemrosesan job async di edge. ### Pola Arsitektur Inti #### 1. Ekosistem Cloudflare Workers | Layanan | Fungsi | Analogi | |:---|:---|:---| | **Workers** | Runtime serverless di edge (V8 isolates) | AWS Lambda@Edge | | **D1** | Database SQLite di edge | PlanetScale / Turso | | **KV** | Key-value store terdistribusi | Redis (read-heavy) | | **R2** | Object storage (S3-compatible) | AWS S3 (tanpa biaya egress) | | **Queues** | Antrean pesan | AWS SQS / BullMQ | | **Durable Objects** | State persisten di edge | Stateful actors | | **Hyperdrive** | Connection pooling ke DB eksternal | PgBouncer di edge | | **Workers AI** | Inferensi model AI di edge | Replicate / Together AI | #### 2. Praktik Terbaik - Gunakan **D1** untuk workload read-heavy di edge. - Gunakan **KV** untuk cache panas (konfigurasi, feature flags, sesi). - Gunakan **R2** untuk aset (tanpa biaya egress, API kompatibel S3). - Gunakan **Queues** untuk pekerjaan async (email, notifikasi, pemrosesan gambar). - Gunakan **Hyperdrive** untuk koneksi ke database PostgreSQL/MySQL eksternal. - Gunakan **`waitUntil()`** untuk operasi fire-and-forget (logging, analitik) setelah respons dikirim. ### Matriks Eksekusi Berdaulat, Efisiensi Token & Invarian | Dimensi | Mandat Berdaulat & Kontrak Deterministik | | :--- | :--- | | **Kaskade Model Frontier** | Medium / High (`GPT-5.6 Sol Medium`, `Gemini 4 Argon`, `Claude Sonnet 5.5 High`, `Grok 4.7 High Fast`) | | **Invarian Fallback Ketersediaan** | `Gemini 4 Argon/Pro` -> `Gemini 3.8 Flash`; `Claude Opus 5.5` -> `Claude Opus 4.6` (Bebas gagal saat model belum tersedia/kuota penuh) | | **Protokol Hemat Token & KV-Cache** | Kunci instruksi & skema statis di prefix awal (`kv-cache-prefix-optimizer`); kirim potongan `CONTEXT_MAP.md` (<250 token/panggilan) saat Fan-Out | | **Eksekusi SaaT CLI & MCP** | CLI: `vibes skill exec cloudflare-workers-expert ` / MCP: `vibes_skill_dispatch`, `vibes_ast_query`, `vibes_compile_cache`, `vibes_optimize_budget`, `vibes_verify_gate` | | **Invarian NFR & Anti-Slop** | Latensi P99 API < 85ms, paritas skema ketat OpenAPI 3.1 / TypeSpec, kontrak error RFC 9457 Problem Details, penegakan Idempotency-Key; kode 100% tuntas tanpa placeholder diverifikasi melalui `node scripts/check-anti-slop.js --strict` |