# Configuration

## Getting Started

Navigate to [workers.cloudflare.com/playground](https://workers.cloudflare.com/playground)

- **No account required** for testing
- **No CLI or local setup** needed
- Code executes in real Cloudflare Workers runtime
- Share code via URL (never expires)

## Playground Constraints

⚠️ **Important Limitations**

| Constraint                | Playground              | Production Workers                |
| ------------------------- | ----------------------- | --------------------------------- |
| **Module Format**         | ES modules only         | ES modules or Service Worker      |
| **TypeScript**            | Not supported (JS only) | Supported via build step          |
| **Bindings**              | Not available           | KV, D1, R2, Durable Objects, etc. |
| **wrangler.toml**         | Not used                | Required for config               |
| **Environment Variables** | Not available           | Full support                      |
| **Secrets**               | Not available           | Full support                      |
| **Custom Domains**        | Not available           | Full support                      |

**Playground is for rapid prototyping only.** For production apps, use `wrangler` CLI.

## Code Editor

### Syntax Requirements

Must export default object with `fetch` handler:

```javascript
export default {
  async fetch(request, env, ctx) {
    return new Response('Hello World')
  },
}
```

**Key Points:**

- Must use ES modules (`export default`)
- `fetch` method receives `(request, env, ctx)`
- Must return `Response` object
- TypeScript not supported (use plain JavaScript)

### Multi-Module Code

Import from external URLs or inline modules:

```javascript
// Import from CDN
import { Hono } from 'https://esm.sh/hono@3'

// Or paste library code and import relatively
// (See patterns.md for multi-module examples)

export default {
  async fetch(request) {
    const app = new Hono()
    app.get('/', (c) => c.text('Hello'))
    return app.fetch(request)
  },
}
```

## Preview Panel

### Browser Tab

Default interactive preview with address bar:

- Enter custom URL paths
- Automatic reload on code changes
- DevTools available (right-click → Inspect)

### HTTP Test Panel

Switch to **HTTP** tab for raw HTTP testing:

- Change HTTP method (GET, POST, PUT, DELETE, PATCH, etc.)
- Add/edit request headers
- Modify request body (JSON, form data, text)
- View response headers and body
- Test different content types

Example HTTP test:

```
Method: POST
URL: /api/users
Headers:
  Content-Type: application/json
  Authorization: Bearer token123
Body:
{
  "name": "Alice",
  "email": "alice@example.com"
}
```

## Sharing Code

**Copy Link** button generates shareable URL:

- Code embedded in URL fragment
- Links never expire
- No account required
- Can be bookmarked for later

Example: `https://workers.cloudflare.com/playground#abc123...`

## Deploying from Playground

Click **Deploy** button to move code to production:

1. **Log in** to Cloudflare account (creates free account if needed)
2. **Review** Worker name and code
3. **Deploy** to global network (takes ~30 seconds)
4. **Get URL**: Deployed to `<name>.workers.dev` subdomain
5. **Manage** from dashboard: add bindings, custom domains, analytics

**After deploy:**

- Code runs on Cloudflare's global network (300+ cities)
- Can add KV, D1, R2, Durable Objects bindings
- Configure custom domains and routes
- View analytics and logs
- Set environment variables and secrets

**Note:** Deployed Workers are production-ready but start on Free plan (100k requests/day).

## Browser Compatibility

| Browser     | Status          | Notes                                     |
| ----------- | --------------- | ----------------------------------------- |
| Chrome/Edge | ✅ Full support | Recommended                               |
| Firefox     | ✅ Full support | Works well                                |
| Safari      | ⚠️ Broken       | Preview fails with "PreviewRequestFailed" |

**Safari users:** Use Chrome, Firefox, or Edge for Workers Playground.

## DevTools Integration

1. **Open preview** in browser tab
2. **Right-click** → Inspect Element
3. **Console tab** shows Worker logs:
   - `console.log()` output
   - Uncaught errors
   - Network requests (subrequests)

**Note:** DevTools show client-side console, not Worker execution logs. For production logging, use Logpush or Tail Workers.

## Limits in Playground

Same as production Free plan:

| Resource      | Limit     | Notes                |
| ------------- | --------- | -------------------- |
| CPU time      | 10ms      | Per request          |
| Memory        | 128 MB    | Per request          |
| Script size   | 1 MB      | After compression    |
| Subrequests   | 50        | Outbound fetch calls |
| Request size  | 100 MB    | Incoming             |
| Response size | Unlimited | Outgoing (streamed)  |

**Exceeding CPU time** throws error immediately. Optimize hot paths or upgrade to Paid plan (50ms CPU).
