Skip to content

Getting Started

Create a new project

bash
npm create export my-app
cd my-app
npm install

This scaffolds a project with everything you need:

my-app/
├── src/
│   └── index.ts       # Your exports
├── package.json       # Configuration
└── tsconfig.json

Configuration

All configuration lives in package.json under the cloudflare field:

json
{
  "name": "my-export-app",
  "cloudflare": {
    "name": "my-export-app",
    "exports": "./src",
    "assets": "./public",
    "d1": ["MY_DB"],
    "r2": ["MY_BUCKET"],
    "kv": ["MY_KV"]
  },
  "security": {
    "access": {
      "origin": ["https://example.com"]
    }
  }
}
FieldRequiredDescription
cloudflare.nameYesWorker name (used for deployment)
cloudflare.exportsYesSource entry point (./src or ./src/index.ts)
cloudflare.assetsNoStatic assets directory (e.g., ./public)
cloudflare.d1NoD1 database bindings
cloudflare.r2NoR2 bucket bindings
cloudflare.kvNoKV namespace bindings
securityNoSecurity settings (see Security guide)

The wrangler.toml is auto-generated when you run npm run dev or npm run deploy -- you don't need to manage it manually.

Write your exports

Open src/index.ts and write whatever you want to expose:

typescript
export async function greet(name: string) {
  return `Hello, ${name}!`;
}

export function add(a: number, b: number) {
  return a + b;
}

export class Counter {
  private count: number;
  constructor(initial = 0) { this.count = initial; }
  increment() { return ++this.count; }
  getCount() { return this.count; }
}

Every named export becomes remotely callable. Sync functions automatically become async on the client.

WARNING

export default is ignored. Use named exports only.

Run locally

bash
npm run dev

This starts a local Wrangler dev server. You can now import from http://localhost:8787/:

javascript
import { greet } from "http://localhost:8787/";
await greet("World");  // "Hello, World!"

Deploy

bash
npm run export

This generates type definitions, minifies the client, and deploys to Cloudflare Workers. Your exports are now live at your Worker URL.

Next steps

Released under the MIT License.