Skip to content

Pricing

David Torcivia edited this page Aug 3, 2026 · 7 revisions

Pricing

Cloudflare rates read 2026-08-03, sources at the bottom. Onelight-specific usage numbers are marked measured or unmeasured.

Rates

Workers

Free Paid ($5/mo base)
Requests 100,000/day 10M/mo, then $0.30/M
CPU time 10 ms per request 30M CPU-ms/mo, then $0.02/M
Memory 128 MB 128 MB
Subrequests 50/request 1,000/request

R2

Free Beyond
Storage 10 GB-mo $0.015/GB-mo
Class A (writes) 1M/mo $4.50/M
Class B (reads) 10M/mo $0.36/M
Egress unlimited $0

D1

Free Paid
Rows read 5M/day 25B/mo, then $0.001/M
Rows written 100,000/day 50M/mo, then $1.00/M
Storage 5 GB 5 GB, then $0.75/GB-mo

Containers (Workers Paid only), if you encode on Cloudflare. See Encoding.

Included Beyond
vCPU 375 vCPU-min/mo $0.000020/vCPU-s
Memory 25 GiB-hr/mo $0.0000025/GiB-s
Disk 200 GB-hr/mo $0.00000007/GB-s
Egress (NA/EU) 1 TB $0.025/GB

Small deployments are free

Every service here has a free tier, and they compose. A deployment under all of them costs nothing at all:

Free allowance What it means here
R2 storage 10 GB roughly one camera master, or a lot of proxies
R2 reads 10M Class B/mo a lot of scrubbing
R2 writes 1M Class A/mo about 6 TB of uploads at 16 MiB parts
Workers 100,000 requests/day the whole deployment, including media reads
D1 5 GB, 5M rows read/day far more metadata than a small shop generates

The first thing to break is R2 storage at 10 GB, because one master can exceed it. Everything else has room.

The unmeasured one is the Workers request budget. Every media range request spends one, and a reviewer scrubbing a timeline issues many, so 100,000/day is plausible for a solo operator and probably not for a busy team. That number is on Benchmarks and is not yet measured.

Workers Paid at $5/month lifts requests to 10M/month and is the first thing worth buying.

R2 egress is free

Serving video is what this application does most, and R2 does not charge for it. On S3 plus CloudFront, egress is typically the largest line. Here it is zero at any volume.

1 TB stored costs $15/month. Serving all of it costs nothing.

Media is served through the Worker

Both blob stores return an app-relative /api/v1/media/<key>, and the API streams the object back. Playback spends Worker requests, not only R2 Class B reads.

This is deliberate: one code path for both deployment targets, and access control that cannot be bypassed by holding a URL. The consequence is that request volume scales with viewers while storage scales with footage. R2 can issue presigned URLs directly if this becomes the binding cost, at the price of that shared code path.

Storage

Stored per version: the original, plus renditions.

Originals are kept. A proxy is not a master, and the master is what is under review.

Renditions for a video version: proxy_1080, proxy_540, poster, sprite, waveform data. A 4K source adds proxy_2160. An HDR source adds hdr_av1 and hdr_hevc. Audio and image versions get smaller sets.

Renditions are small next to the original, so the original dominates.

Worked example

Assumption: 100 GB of masters per month, retained 12 months, renditions adding 10%.

Month Stored R2 storage
1 110 GB $1.50
6 660 GB $9.75
12 1.32 TB $19.80

Plus $5/month for Workers Paid, plus encoding (Encoding).

Compared to Frame.io

Frame.io prices per seat and bundles storage with each one. Onelight prices storage and nothing else: there is no per-seat cost, because there is no licence to enforce.

Frame.io plans, read 2026-08-03:

Plan Price Seats Storage
Free $0 2 2 GB
Pro $15/member/mo up to 5 2 TB + 2 TB per extra member
Team $25/member/mo up to 15 3 TB + 2 TB per extra member

Onelight on Cloudflare is $5 + $0.015/GB-mo + encoding. So the comparison turns on one thing: Onelight's advantage grows with seats, and its disadvantage grows with storage.

Storage volumes below are what people actually keep online, not what a plan permits. The bundled allowances are generous enough that almost nobody reaches them.

First 10 GB is free on both R2 and B2, so these charge on the excess. Workers Paid ($5) is added wherever the deployment plausibly exceeds 100,000 requests/day, which is a guess until it is measured.

Scenario Onelight on R2 Onelight on B2 Frame.io
Solo, 10 GB $0 $0 $15 (Pro)
Solo, 500 GB $7.35 $3.41 $15 (Pro)
Solo, 2 TB $29.85 $13.83 $15 (Pro)
5 seats, 2 TB $34.85 $18.83 $75 (Pro)
15 seats, 5 TB $79.85 $39.68 $375 (Team)
15 seats, 20 TB $304.85 $143.93 $375 (Team)

Encoding compute is extra for Onelight and included for Frame.io. Add it before deciding.

Where the crossover sits

Onelight is cheaper while stored bytes stay under (seats x plan price - 5) / storage rate:

on R2 ($0.015/GB) on B2 ($0.00695/GB)
1 seat vs Pro 670 GB 1.4 TB
5 seats vs Pro 4.7 TB 10 TB
15 seats vs Team 24.7 TB 53 TB

Frame.io's marginal storage is $7.50/TB, since a $15 seat brings 2 TB. R2 standard is $15/TB. On R2, storage is not where Onelight wins -- seats, free egress and owning the bucket are. On B2 at $6.95/TB it wins on storage too, narrowly.

Not an equal comparison

Frame.io includes encoding, a CDN, support, camera-to-cloud ingest and an ecosystem of integrations. Onelight expects you to run a worker somewhere and support yourself. A post house with fifteen seats saves several hundred a month; a solo operator with a lot of footage and no appetite for running anything probably should not switch.

Not an equal comparison

Frame.io includes encoding, a CDN, support, camera-to-cloud ingest and an ecosystem of integrations. Onelight expects you to run a worker somewhere and support yourself. A post house with fifteen seats and moderate storage saves several hundred dollars a month; a solo operator with a lot of footage and no appetite for running anything probably should not switch.

Making storage cheaper

Storage is the term that grows, so it is the one worth attacking. In rough order of value:

Use a cheaper bucket

The blob store is a port, not a hard dependency on R2. Any S3-compatible backend can serve it.

Storage Egress to Cloudflare API calls
R2 Standard $15/TB-mo free $4.50/M writes, $0.36/M reads
R2 Infrequent Access $10/TB-mo free $9.00/M writes, $0.90/M reads, plus $0.01/GB retrieval
Backblaze B2 $6.95/TB-mo free (Bandwidth Alliance) free

B2 is 54% cheaper than R2 standard, its Class A/B/C calls are free, and egress to or through Cloudflare is free under the Bandwidth Alliance. The first 10 GB is free.

Not implemented yet: R2BlobStore uses the Workers R2 binding rather than the S3 API. An S3-compatible store means SigV4 signing from a Worker, which is the same work as presigning R2, so one implementation covers both.

Put cold originals in Infrequent Access

Originals dominate stored bytes and are read almost never: reviewers watch proxies, not masters. Infrequent Access is a third cheaper.

The catch is a $0.01/GB retrieval fee and a 30-day minimum duration. Reading a 40 GB master back costs $0.40, which is two months of the savings on that same object.

So the transition has to be on a lifecycle rule rather than at upload: keep originals in Standard while ingest and transcode read them, then move them to Infrequent Access after 30 days. Renditions stay in Standard, since they are read constantly.

Anything that re-reads originals later -- a ladder backfill, a re-kind sweep -- pays retrieval, so this needs measuring against how often those actually run.

Store one copy of the same file

Version content hashes are already computed for the matcher. The same master uploaded to two projects is currently stored twice. Deduplicating on content hash is free storage for any house that re-cuts the same material.

Let people not keep the original

Some workflows only need the proxy. Discarding the original after a successful transcode removes the term that dominates the bill. It has to be explicit and per-project, because for most people the master is the point.

Uploads are cheap

Multipart parts are 16 MiB and each part is one Class A operation. A 40 GB master is about 2,560 operations, or $0.012.

Running on the free tier

Possible for a small deployment. Not confirmed, for one reason.

The free plan allows 10 ms of CPU per request. The most frequent request here is streaming media back through the Worker. Streaming waits on the network rather than computing, and waiting is not billed as CPU, so it probably fits. Not measured. See Benchmarks.

Quotas likely to bind before CPU does:

  • 100,000 requests/day for the whole deployment. Every media range request spends one, and one reviewer scrubbing a timeline issues many.
  • 10 GB R2 storage, roughly one camera master.

Containers require Workers Paid, so encoding on Cloudflare rules out the free tier regardless.

Unmeasured

Needed before request and CPU costs can be stated:

  • CPU-ms per media request
  • requests per review session
  • GB per hour of footage, by codec and resolution
  • encoding throughput

All four are on Benchmarks.

Self-hosted

The Docker deployment has no per-request cost. You pay for the machine and the disk. The same build serves both targets: the job protocol names storage by key and does not assume a filesystem.

Sources

Clone this wiki locally