How to Deploy Next AI Draw.io on Cloudflare Workers: A Complete Guide
To deploy Next AI Draw.io on Cloudflare Workers, install dependencies, configure environment variables in .dev.vars, set up your open-next.config.ts and wrangler.jsonc configuration files, then run npm run deploy to publish the OpenNext-built Worker to your workers.dev subdomain.
Next AI Draw.io is a Next.js application that runs on Cloudflare's edge network using the OpenNext adapter. This deployment method converts your Next.js build into a Worker script that executes at the edge, offering global low latency without maintaining a traditional server. The process leverages Wrangler CLI to upload static assets and the Worker code directly to Cloudflare.
Prerequisites
Before you begin deploying Next AI Draw.io on Cloudflare Workers, ensure you have the following requirements:
- Cloudflare account – The free tier is sufficient for most use cases.
- Node.js 18+ – Verify with
node -v. - Wrangler CLI – Install as a dev dependency with
npm install -D wrangleror usenpx wrangler. - Cloudflare authentication – Run
npx wrangler loginto authenticate your CLI.
Important Windows Note: OpenNext and Wrangler are not fully reliable on native Windows due to WASM filename handling issues (specifically
resvg.wasm?moduleerrors). Use WSL, GitHub Codespaces, or a Linux environment for building and deploying.
Project Setup and Environment Configuration
Start by installing the project dependencies:
npm install
Next, configure your environment variables. The Cloudflare platform uses .dev.vars for local testing and deployment, while standard Next.js development uses .env.local:
# For Cloudflare deployment and local preview
cp env.example .dev.vars
# For regular Next.js development
cp env.example .env.local
Both files must contain identical key-value pairs, including your API keys and secret keys. Edit these files to include your actual configuration values before proceeding.
Configuration Options
Choose between two deployment configurations based on whether you need Incremental Static Regeneration (ISR) caching.
Option A: Deployment Without R2 (Free Tier)
Use this minimal configuration if you do not require ISR caching. This keeps your deployment entirely within Cloudflare's free tier without R2 storage costs.
Create open-next.config.ts:
import { defineCloudflareConfig } from "@opennextjs/cloudflare/config";
export default defineCloudflareConfig({});
Create wrangler.jsonc:
{
"$schema": "node_modules/wrangler/config-schema.json",
"main": ".open-next/worker.js",
"name": "next-ai-draw-io-worker",
"compatibility_date": "2025-12-08",
"compatibility_flags": ["nodejs_compat", "global_fetch_strictly_public"],
"assets": {
"directory": ".open-next/assets",
"binding": "ASSETS"
},
"services": [
{
"binding": "WORKER_SELF_REFERENCE",
"service": "next-ai-draw-io-worker"
}
]
}
Option B: Deployment With R2 (Full ISR Support)
Select this option if your application requires Incremental Static Regeneration. This setup uses Cloudflare R2 as a cache store for regenerated pages.
First, create an R2 bucket named next-inc-cache in the Cloudflare dashboard. The bucket_name in your configuration must match exactly.
Configure open-next.config.ts:
import { defineCloudflareConfig } from "@opennextjs/cloudflare/config";
import r2IncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/r2-incremental-cache";
export default defineCloudflareConfig({
incrementalCache: r2IncrementalCache,
});
Configure wrangler.jsonc with the R2 binding:
{
"$schema": "node_modules/wrangler/config-schema.json",
"main": ".open-next/worker.js",
"name": "next-ai-draw-io-worker",
"compatibility_date": "2025-12-08",
"compatibility_flags": ["nodejs_compat", "global_fetch_strictly_public"],
"assets": {
"directory": ".open-next/assets",
"binding": "ASSETS"
},
"r2_buckets": [
{
"binding": "NEXT_INC_CACHE_R2_BUCKET",
"bucket_name": "next-inc-cache"
}
],
"services": [
{
"binding": "WORKER_SELF_REFERENCE",
"service": "next-ai-draw-io-worker"
}
]
}
Deploying to Cloudflare Workers
Register Your workers.dev Subdomain
If this is your first Cloudflare Workers deployment, you must register a workers.dev subdomain. Navigate to Workers & Pages → Overview → Set up a subdomain in the Cloudflare dashboard. Alternatively, the CLI will prompt you to create one during your first deployment attempt.
Execute the Deployment
Run the deployment command defined in package.json:
npm run deploy
This command executes opennextjs-cloudflare build && opennextjs-cloudflare deploy, which performs three critical steps:
next build– Compiles the Next.js application.- OpenNext bundling – Converts the build output into a Worker script at
.open-next/worker.js. - Wrangler upload – Publishes static assets from
.open-next/assetsand deploys the Worker script.
Upon successful completion, your application will be available at:
https://<worker-name>.<your-subdomain>.workers.dev
Local Preview
Test your Cloudflare Worker locally before deploying to production:
npm run preview
This command builds the application and runs the Worker locally using the OpenNext adapter, allowing you to verify functionality with your .dev.vars environment variables.
Troubleshooting Common Deployment Issues
| Symptom | Cause | Solution |
|---|---|---|
You need to register a workers.dev subdomain |
No subdomain created for your account | Register a subdomain in the Cloudflare dashboard under Workers & Pages |
Please enable R2 through the Cloudflare Dashboard |
R2 not enabled or missing payment method | Add a payment method to enable R2, or switch to Option A (no R2 config) |
No R2 binding "NEXT_INC_CACHE_R2_BUCKET" found |
Missing or incorrect r2_buckets in wrangler.jsonc |
Verify the r2_buckets array contains the correct binding name matching your R2 bucket |
Can't set compatibility date in the future |
compatibility_date set beyond today's date |
Update compatibility_date in wrangler.jsonc to today's date or earlier |
Windows resvg.wasm?module ENOENT error |
Illegal filename characters on Windows filesystem | Build and deploy from WSL, Linux, or GitHub Codespaces |
Summary
- Next AI Draw.io deploys to Cloudflare Workers via the OpenNext adapter, which bundles the Next.js app into a Worker-compatible script at
.open-next/worker.js. - Configure deployment through
open-next.config.ts(for cache behavior) andwrangler.jsonc(for bindings and assets). - Store environment variables in
.dev.varsfor Cloudflare deployments, maintaining parity with.env.localfor local development. - Choose between free-tier deployment (no R2) or ISR-enabled deployment (with R2 bucket binding) based on your caching requirements.
- Run
npm run deployto build and publish, avoiding native Windows environments due to WASM filename incompatibilities.
Frequently Asked Questions
What is the difference between .dev.vars and .env.local?
.dev.vars is the Cloudflare-specific environment file used by Wrangler and OpenNext for local preview and deployment to Workers. .env.local is the standard Next.js environment file used during regular development with next dev. Both files must contain identical values, as the application reads from .env.local during standard Next.js builds and from .dev.vars when running as a Cloudflare Worker.
Why does the deployment fail with a WASM module error on Windows?
The OpenNext build process generates WASM files with ?module suffixes in their names, which are illegal characters on Windows filesystems. This causes ENOENT errors when building or deploying. To resolve this, use Windows Subsystem for Linux (WSL), GitHub Codespaces, or a Linux machine for the build and deployment process.
Do I need R2 storage to deploy Next AI Draw.io?
No, R2 is optional. For simple deployments without Incremental Static Regeneration (ISR), use Option A with an empty defineCloudflareConfig({}) and omit the r2_buckets section from wrangler.jsonc. This keeps your deployment entirely within Cloudflare's free tier. Only configure R2 if your application specifically requires ISR caching capabilities.
How do I update my deployed Worker after making code changes?
Simply run npm run deploy again after modifying your code. The command rebuilds the application using next build, repackages it with OpenNext into .open-next/worker.js, and uploads the new version to Cloudflare Workers. The deployment is atomic, meaning there is no downtime during updates.
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 →