Wrangler Configuration for Deploying OpenCut to Cloudflare Pages and Workers
Deploy OpenCut to Cloudflare by configuring separate wrangler.jsonc files for the Pages frontend and Workers backend, using compatibility flags for Node.js support and custom domain routing.
The OpenCut application is architected as a split deployment where the web UI targets Cloudflare Pages and the API targets Cloudflare Workers. According to the OpenCut-app/OpenCut source code, both environments require distinct Wrangler configurations located in the apps/ directory to handle SSR rendering, edge function deployment, and runtime compatibility.
Web UI Configuration for Cloudflare Pages
The frontend application runs as a Cloudflare Pages project with server-side rendering (SSR) enabled through TanStack Start.
Wrangler Configuration File
Located at apps/web/wrangler.jsonc, the configuration defines the Pages project settings:
{
"$schema": "node_modules/wrangler/config-schema.json",
"name": "opencut-web",
"compatibility_date": "2025-09-02",
"compatibility_flags": ["nodejs_compat"],
"main": "@tanstack/react-start/server-entry",
"routes": [
{
"pattern": "new.opencut.app",
"custom_domain": true
}
]
}
Key configuration details:
compatibility_date– Set to2025-09-02to ensure the Pages runtime supports the required Node.js compatibility layer.compatibility_flags– Thenodejs_compatflag enables Node.js polyfills required by npm dependencies.main– Points to the SSR entry point generated by@tanstack/react-start/server-entry.routes– Declaresnew.opencut.appas a custom domain, routing all traffic for that hostname to this Pages project.
Vite Integration
The build pipeline integrates Wrangler settings through the Cloudflare Vite plugin. In apps/web/vite.config.ts, the configuration loads the Wrangler environment:
import { defineConfig } from 'vite'
import { cloudflare } from '@cloudflare/vite-plugin'
import tailwindcss from '@tailwindcss/vite'
import { tanstackStart } from '@tanstack/react-start/plugin/vite'
import viteReact from '@vitejs/plugin-react'
export default defineConfig({
resolve: { tsconfigPaths: true },
plugins: [
cloudflare({ viteEnvironment: { name: 'ssr' } }),
tailwindcss(),
tanstackStart(),
viteReact(),
],
})
The cloudflare() plugin reads the wrangler.jsonc configuration during the build process, ensuring the SSR bundle is compatible with the Cloudflare Pages runtime.
Build and Deploy Commands
Deploy the web UI using the following workflow:
# Build the Pages asset bundle
moon run web:build
# Deploy to Cloudflare Pages
wrangler pages publish ./dist
The wrangler pages publish command automatically detects and applies the configuration from apps/web/wrangler.jsonc, including compatibility flags and custom domain routing.
API Configuration for Cloudflare Workers
The backend API runs as a Cloudflare Worker using the Elysia framework with Ahead-of-Time (AoT) compilation.
Wrangler Configuration File
The API configuration in apps/api/wrangler.jsonc is streamlined for edge function deployment:
{
"$schema": "node_modules/wrangler/config-schema.json",
"name": "opencut-api",
"main": "src/index.ts",
"compatibility_date": "2025-06-01"
}
Critical settings:
main– Points tosrc/index.ts, which exports the Elysia server instance wrapped with the Cloudflare Workers adapter.compatibility_date– Set to2025-06-01, the earliest date supporting the AoT compilation required by Elysia'sCloudflareAdapter.
Elysia Server Implementation
The server entry point at apps/api/src/index.ts implements the Cloudflare adapter pattern:
import { Elysia, t } from "elysia"
import { CloudflareAdapter } from "elysia/adapter/cloudflare-worker"
export default new Elysia({ adapter: CloudflareAdapter })
.get("/", () => ({ status: "ok" }))
.get("/health", () => ({ healthy: true, timestamp: new Date().toISOString() }))
.post("/echo", ({ body }) => body, {
body: t.Object({ message: t.String() }),
})
.compile()
The .compile() method triggers AoT compilation at startup, optimizing the worker for cold starts in the Cloudflare edge environment.
Build and Deploy Commands
Deploy the API worker with these commands:
# Transpile TypeScript and bundle via wrangler
moon run api:build
# Upload the worker to Cloudflare
wrangler deploy
The wrangler deploy command references apps/api/wrangler.jsonc to register the worker under the name opencut-api in your Cloudflare account.
Complete Deployment Workflow
Deploy the full OpenCut stack by executing these steps in sequence:
- Build the web UI –
moon run web:buildgenerates thedist/folder with SSR assets. - Publish the frontend –
wrangler pages publish ./distdeploys to Cloudflare Pages using the web configuration. - Build the API –
moon run api:buildprepares the worker bundle. - Deploy the backend –
wrangler deployuploads the API to Cloudflare Workers.
Both deployments share the same Cloudflare account, enabling the frontend to call backend endpoints via the same domain when configured with appropriate routing rules in the Cloudflare dashboard.
Key Configuration Files Reference
| File Path | Purpose |
|---|---|
apps/web/wrangler.jsonc |
Cloudflare Pages configuration with custom domain and Node.js compatibility flags. |
apps/web/vite.config.ts |
Vite build pipeline integrating the Cloudflare plugin for SSR. |
apps/api/wrangler.jsonc |
Cloudflare Workers configuration for the Elysia-based API. |
apps/api/src/index.ts |
Server implementation using CloudflareAdapter and AoT compilation. |
Summary
- Separate configurations are required for the frontend (
apps/web/wrangler.jsonc) and backend (apps/api/wrangler.jsonc) due to different Cloudflare targets. - Node.js compatibility is enabled via the
nodejs_compatflag in the Pages configuration to support npm packages. - Custom domains are configured in the web Wrangler file using the
routesarray withcustom_domain: true. - AoT compilation in the API requires a compatibility date of at least
2025-06-01for Elysia's Cloudflare adapter. - Build orchestration uses
mooncommands for TypeScript compilation, whilewranglerhandles the actual deployment to edge infrastructure.
Frequently Asked Questions
What compatibility flags are required for OpenCut on Cloudflare?
The web UI requires the nodejs_compat flag in apps/web/wrangler.jsonc to enable Node.js polyfills for the React-based frontend. The API worker does not explicitly declare compatibility flags but relies on a compatibility date of 2025-06-01 to support Elysia's Ahead-of-Time compilation features.
How does the web UI connect to the API backend?
Both projects deploy to the same Cloudflare account. You can configure the frontend to call the backend by adding a route pattern to apps/web/wrangler.jsonc that proxies /api/* paths to the opencut-api worker, or by using separate subdomains with CORS configuration in apps/api/src/index.ts.
Can I test OpenCut locally before deploying?
Yes. Use wrangler dev --port 8787 to run the API worker locally, and wrangler pages dev ./dist to serve the Pages build locally. Both commands read their respective wrangler.jsonc files, ensuring local behavior matches production compatibility settings.
Where are the Wrangler configuration files located?
The configurations are split by application: apps/web/wrangler.jsonc controls the Cloudflare Pages deployment for the frontend, while apps/api/wrangler.jsonc manages the Cloudflare Workers deployment for the backend API. Both files use the JSONC format (JSON with comments) and reference the Wrangler config schema for validation.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →