This page lists the Cloudflare Workers Free plan limits that matter to an Ocre app, as published by Cloudflare in September 2026, with the source of each value and what Ocre does about it.
The values apply to an app deployed with ocre deploy on a Cloudflare account without Workers Paid. ocre dev (local workerd) enforces none of them.
Most limits are per account and per day (reset at 00:00 UTC), shared by every Worker of the account, not per app.
Cloudflare changes its limits. Each row links to the page the value was read from (September 2026); check it before relying on a number. For how an app spends these budgets and a worked daily example, see Cost model.
Files in public/ are served by Workers Static Assets, free and unlimited, without running the Worker. A WebSocket connection counts once, not per message.
Static asset requests
free and unlimited; 20,000 files per version, 25 MiB per file
assetsDirectory: "public" in wrangler.config.ts from ocre new. Turning on Workers Cache makes asset requests count (Workers Cache pricing); Ocre does not enable it.
CPU time
10 ms per invocation (HTTP request, Cron Trigger, queue consumer batch); occasional overruns are tolerated per isolate, frequent ones end in error 1102
Waiting on D1, KV, R2 or fetch does not count. Passwords are hashed with WebCrypto PBKDF2 (native, about 5.5 ms) instead of WebAssembly; R2 downloads are streamed without passing through WebAssembly; GraphQL (20 to 60 ms at instance start) is opt-in.
Memory
128 MB per isolate, shared by the concurrent requests it runs
Uploads are read into memory: generated attachment rules default to 10 MB per file and forms refuse bodies over the sum of their files’ limits plus 1 MB (413).
Request body size
100 MB (Cloudflare Free plan); larger bodies get 413 before the Worker runs
Generated pages run one D1 query (lists, show) or a few (create/update add one check per unique field and reference). find_many loads many rows in one query per 100 ids instead of one per row.
Generated lists are paginated (Page: default 50, at most 100) and ordered by the primary key; every references column gets an index, every unique field a unique index.
Rows written
100,000 a day; each index on a written column adds one row written
10,000 a day; a delivered message costs 3 (write, read, delete), each retry 1 more read, a dead-lettered message 1 more write; each 64 KB of a message counts as one operation
Retries (30 s, 1 min, 3 min, 9 min, 27 min) end about 40 minutes after the first failure; the dead-letter queue <app>-jobs-failed keeps failures 24 hours.
Message size
128 KB (1 KB = 1,000 bytes, including about 100 bytes of metadata)
enqueue refuses messages over 127,000 bytes: cannot enqueue a <n> byte message: Cloudflare Queues messages hold 128 KB at most. Fix: store large data in D1 or R2 and put its id in the job.
ocre deploy stops with a hint when the account lacks it (API code 10042).
Past the free tier, R2 bills (October 2026, R2 pricing): Standard storage $0.015 per GB-month, Class A operations $4.50 per million, Class B $0.36 per million; egress stays free. Rounding is up to the next unit (1.1 GB-month bills 2). Video is where this shows: a 4K video is several GB, so a few of them pass the 10 GB. Examples for Standard storage: 100 GB kept a month is (100 - 10) × $0.015 = $1.35; 1 TB is $14.85. A 5 GB file sent with storage::multipart_uploads is 514 Class A operations (512 parts, the create and the complete), well within the free million. Keep storage in check by deleting what users no longer need (a schedule that deletes files older than N days, storage::purge_unattached for abandoned uploads).
A Worker runs WebAssembly in a V8 isolate: it cannot start a program (ffmpeg, ffprobe, ImageMagick, Python), has no filesystem, and gets 10 ms of CPU per invocation on the free plan. Work of that kind runs elsewhere and reports back, with ocre g external_job (Run work on another service):
a GPU service billed per second (RunPod serverless, Modal, Replicate…) for AI inference and video encoding;
Cloudflare Containers, which run any image (ffmpeg included) next to the Worker, on the Workers Paid plan;
any server or function of your own that answers HTTP.
Probing a video (duration, resolution) to price it belongs there too: the service reports it in an event’s output. Cloudflare’s Media Transformations and Stream (paid) cover some video work without a container.
The scarcest free resource: each miss of fetch, each write and each delete is one. Past a limit, fetch logs [ocre cache] ... failed and computes the value instead of failing.
ocre g mailbox wires the Worker’s email event; each received message is one invocation with 10 ms of CPU.
Email Service (sending, MAIL_ADAPTER = "cloudflare")
on Workers Free, only to verified destination addresses of the account (free); any recipient needs Workers Paid (3,000 a month included, then $0.35 per 1,000); 5 MiB per message, 50 recipients