home / skills / secondsky / claude-skills / cloudflare-workers-frameworks

This skill helps you build full-stack Cloudflare Workers apps with Hono, Remix, Next.js, Astro, SvelteKit, Qwik, or Nuxt.

npx playbooks add skill secondsky/claude-skills --skill cloudflare-workers-frameworks

Review the files below or copy the command above to add this skill to your agents.

Files (15)
SKILL.md
5.6 KB
---
name: workers-frameworks
description: Framework integration for Cloudflare Workers. Use when building with Hono, Remix, Next.js, Astro, SvelteKit, Qwik, or Nuxt on Workers. Covers routing, SSR, static assets, and edge deployment.
version: 1.0.0
---

# Workers Frameworks Integration

Build full-stack applications on Cloudflare Workers using modern frameworks.

## Quick Start: Choose Your Framework

| Framework | Best For | SSR | Static | Workers Native |
|-----------|----------|-----|--------|----------------|
| **Hono** | APIs, lightweight apps | ✅ | ✅ | ✅ Native |
| **Remix** | Full-stack apps | ✅ | ✅ | ✅ Adapter |
| **Next.js** | React apps | ✅ | ✅ | ⚠️ OpenNext |
| **Astro** | Content sites | ✅ | ✅ | ✅ Adapter |
| **SvelteKit** | Svelte apps | ✅ | ✅ | ✅ Adapter |
| **Qwik** | Resumable apps | ✅ | ✅ | ✅ Adapter |
| **Nuxt** | Vue apps | ✅ | ✅ | ✅ Nitro |

## Framework Decision Tree

```
Need an API only?
  └─ Yes → Hono (fastest, smallest)
  └─ No → Building a full app?
           └─ React → Next.js (OpenNext) or Remix
           └─ Vue → Nuxt
           └─ Svelte → SvelteKit
           └─ Content-heavy → Astro
           └─ Max performance → Qwik
```

## Top 10 Framework Errors

| Error | Framework | Cause | Solution |
|-------|-----------|-------|----------|
| `No matching export "default"` | All | Wrong export format | Use `export default app` not `module.exports` |
| `Worker exceeded CPU limit` | Next.js | Heavy SSR | Use ISR, reduce bundle size |
| `Cannot read properties of undefined (reading 'env')` | Remix | Missing context | Pass `context` to loader/action |
| `globalThis is not defined` | All | Node.js globals | Use `nodejs_compat` flag |
| `Dynamic require not supported` | All | CJS in ESM | Convert to ESM imports |
| `Response body is locked` | All | Body already read | Clone response before reading |
| `Bindings not available` | All | Missing wrangler config | Add bindings to wrangler.jsonc |
| `404 on static assets` | All | Wrong assets config | Configure `assets` in wrangler.jsonc |
| `Hydration mismatch` | React/Vue | Server/client differ | Ensure consistent rendering |
| `Maximum call stack exceeded` | All | Circular imports | Refactor module structure |

## Hono Quick Start (Recommended)

```typescript
// src/index.ts
import { Hono } from 'hono';
import { cors } from 'hono/cors';
import { logger } from 'hono/logger';

interface Env {
  DB: D1Database;
  KV: KVNamespace;
}

const app = new Hono<{ Bindings: Env }>();

// Middleware
app.use('*', logger());
app.use('/api/*', cors());

// Routes
app.get('/', (c) => c.text('Hello Workers!'));

app.get('/api/users', async (c) => {
  const { results } = await c.env.DB.prepare('SELECT * FROM users').all();
  return c.json(results);
});

app.post('/api/users', async (c) => {
  const { name, email } = await c.req.json();
  await c.env.DB.prepare('INSERT INTO users (name, email) VALUES (?, ?)')
    .bind(name, email)
    .run();
  return c.json({ success: true }, 201);
});

export default app;
```

```jsonc
// wrangler.jsonc
{
  "name": "my-app",
  "main": "src/index.ts",
  "compatibility_date": "2024-12-01",
  "compatibility_flags": ["nodejs_compat"],
  "d1_databases": [
    { "binding": "DB", "database_name": "my-db", "database_id": "xxx" }
  ]
}
```

## Static Assets Configuration

```jsonc
// wrangler.jsonc - Serving static files
{
  "name": "my-app",
  "main": "src/index.ts",
  "assets": {
    "directory": "./public",
    "binding": "ASSETS"
  }
}
```

```typescript
// Serve static with fallback to app
import { Hono } from 'hono';

const app = new Hono<{ Bindings: { ASSETS: Fetcher } }>();

// API routes
app.get('/api/*', apiHandler);

// Static assets fallback
app.get('*', async (c) => {
  return c.env.ASSETS.fetch(c.req.raw);
});

export default app;
```

## When to Load References

Load the specific framework reference when user:

| Reference | Load When |
|-----------|-----------|
| `references/hono.md` | Building APIs, microservices, or lightweight apps |
| `references/remix.md` | Full-stack React with loaders/actions |
| `references/nextjs.md` | Next.js App Router on Workers via OpenNext |
| `references/astro.md` | Content sites, blogs, docs, marketing pages |
| `references/sveltekit.md` | Svelte applications on Workers |
| `references/qwik.md` | Resumable apps, instant loading |
| `references/nuxt.md` | Vue 3 applications with Nitro |

## Common Patterns Across Frameworks

### Environment Bindings Access

```typescript
// Hono
app.get('/', (c) => c.env.DB.prepare('...'));

// Remix
export async function loader({ context }) {
  return context.cloudflare.env.DB.prepare('...');
}

// Astro
const db = Astro.locals.runtime.env.DB;

// SvelteKit
export async function load({ platform }) {
  return platform.env.DB.prepare('...');
}

// Nuxt
const { cloudflare } = useRuntimeConfig();
// Or via nitro: event.context.cloudflare.env.DB
```

### Error Handling Pattern

```typescript
// Universal error boundary pattern
app.onError((err, c) => {
  console.error(`[${c.req.path}] ${err.message}`);

  if (err instanceof HTTPException) {
    return err.getResponse();
  }

  return c.json(
    { error: 'Internal Server Error' },
    500
  );
});
```

## Performance Tips

1. **Bundle Size**: Keep under 1MB compressed
2. **Cold Starts**: Minimize top-level code
3. **Streaming**: Use streaming SSR when available
4. **Caching**: Leverage Cache API and CDN
5. **Code Splitting**: Dynamic imports for routes

## See Also

- `workers-performance` - Optimization techniques
- `workers-runtime-apis` - Workers APIs reference
- `cloudflare-worker-base` - Basic Workers setup

Overview

This skill provides framework integration patterns and configuration for deploying modern web frameworks on Cloudflare Workers. It guides decisions for Hono, Remix, Next.js, Astro, SvelteKit, Qwik, and Nuxt, covering routing, SSR, static assets, bindings, and edge deployment. Use it to align framework choices, avoid common runtime errors, and follow best practices for production Workers apps.

How this skill works

The skill inspects framework-specific needs and produces targeted guidance: adapters, compatibility flags, and wrangler configuration for assets and bindings. It maps common runtime errors to concrete fixes (exports, globals, CJS→ESM, asset routing) and provides quick-start code snippets for Hono and static-asset fallbacks. It also recommends when to load deeper references for each framework and lists universal patterns for env access and error handling.

When to use it

  • Starting a new Workers project and choosing a framework (React, Vue, Svelte, Qwik, Astro, Remix, Hono)
  • Building server-side rendering or hybrid SSR/static sites on the edge
  • Configuring static assets, D1/KV bindings, or Wrangler for edge deployment
  • Troubleshooting runtime issues like globals, CJS imports, or asset 404s
  • Optimizing bundle size, cold start behavior, or streaming SSR for Workers

Best practices

  • Prefer Hono for APIs and tiny microservices; use adapters for full-stack frameworks when available
  • Set nodejs_compat and appropriate compatibility_date for Node-like globals only when needed
  • Keep top-level bundle small, avoid heavy initialization during cold start
  • Serve static assets via the assets binding with a fallback to your app router
  • Use streaming SSR and Cache API for large responses; implement universal error boundaries

Example use cases

  • API-only service with D1 and KV using Hono and simple cors/logger middleware
  • Remix or Next.js app on Workers using an adapter and explicit env/context passing for loaders
  • Content site or blog built with Astro, hosted as static assets plus SSR pages
  • SvelteKit or Nuxt app using Nitro/Open adapters with correct bindings and assets configuration
  • Resumable Qwik app for instant interactions with minimized SSR work

FAQ

Which framework is best for a small API-only service?

Hono is fastest and smallest for API-only services and has native Workers support.

How do I avoid 404s for static assets?

Configure the assets binding in wrangler and add a fallback route that fetches from the assets binding to serve static files.