REA—VIDEO Open the lab

How the workbench reads a clip.

No server, no ffmpeg, no upload. A video element, a 160×90 canvas and a few measurements — plus a deliberate limit on what the tool claims to know.

Updated 8 Nov 2026 Independent tool

The pipeline

Every analysis follows the same six steps, in the browser tab:

  1. Probe — read duration, resolution and file size; reject clips over 3 minutes or 300 MB with a clear message.
  2. Sample — seek through the file at 5 fps (3 fps above 60 seconds), draw each frame to a 160×90 canvas, and compute an HSV histogram plus luma profiles.
  3. Detect cuts — compare adjacent samples, then apply a persistence gate to reject fast motion and flashes.
  4. Measure — for each shot, read luma, contrast, color temperature, saturation, a five-color palette, edge density, flat-block ratio, estimated motion and letterboxing.
  5. Extract — grab a first and mid frame per shot at up to 1280 px, and compose a storyboard with timecodes.
  6. Write — build the prompts from the measurements plus your brief, then zip the prompts, CSV, JSON, frames, storyboard and report.

Cut detection, honestly

The sampler stores a 128-bin HSV histogram for every sample and the chi-square distance to the previous sample. A naive threshold over that distance reports every fast pan as a cut. The workbench adds a second test: for a candidate at frame i, it compares the three samples before the candidate with the three after. A real cut has high similarity inside each group and low similarity between groups. A camera move has high similarity across the candidate, because the scene is continuous.

The cut time is reported to two decimals, but the practical accuracy is about ±0.1 seconds. The sampler does not decode every frame, so it does not claim frame-exact conform accuracy.

What is measured, and what is estimated

FieldMethodConfidence
Cut timeHistogram distance + persistence gateHigh on hard cuts; dissolves are approximate
Luma key / contrast5th and 95th percentile of lumaHigh
Color temperatureMean red-minus-blue balanceDirectional, not a white-balance reading
Palettek-means, five clustersRepresentative, not exact
Motion1-D projection correlation between samplesEstimated: pan / tilt / handheld / static
RhythmOnset autocorrelation on the decoded audioEstimated; silence yields no BPM
LetterboxRows and columns that are over 95% blackHigh when the bars are clean

The report says “estimated” where it means estimated. It never turns a measurement into a verdict about whether a shot is live, AI-generated or rendered.

From measurements to prompts

The prompt builder takes the measured camera direction, light key, contrast, color temperature, palette, duration and aspect ratio, then merges the subject, setting, style, shot size and camera override from your brief. It writes three variants: a literal remake, a same-camera / new-subject swap, and a stylized reinterpretation.

The prompts are deliberately explicit about what they do not know. If you leave the subject blank, the prompt says “your subject”, not a guessed noun. For a semantic description from the pixels, use a vision model or the open-source rea-video CLI.

The test clip

Before building the site, we ran the sampler against a 12.5-second, 1280×720 clip with seven hard cuts and deliberately fast-motion test patterns. At 5 fps it produced 63 samples in 1.65 seconds. The persistence-gated detector found 7 of 7 cuts with 0 false positives; the naive threshold version found the same seven cuts plus nine false positives. Extracting three 960×540 JPEGs took 80 ms. These are measurements from one machine and one clip, not a universal accuracy claim.

One implementation note from that test: use a Blob URL, not a local HTTP server without Range support. A no-Range server makes currentTime jump back to zero and looks like a browser bug. Production files are Blob URLs, so the issue does not affect users.

Privacy

The video is never uploaded. It is read with the File API, wrapped in a Blob URL, decoded by the browser’s video element and drawn to canvases in the tab. The ZIP is assembled in memory and downloaded. The page uses Umami for aggregate pageviews; it does not receive the video, the frames or the prompts.

Questions

Does the analysis run on a server?

No. The file is read with the browser’s File API, decoded by the browser’s video element, and sampled to a canvas. There is no upload endpoint. The only network requests on this site are the page assets, the optional Umami analytics script, and the demo video if you choose to load it.

Why 5 fps instead of every frame?

A 3-minute clip at 30 fps is 5,400 frames. Sampling at 5 fps gives 900 samples, which is enough to find cuts to about ±0.1s and keeps the analysis under half a minute on a desktop browser. The sampler uses 3 fps for clips longer than 60 seconds.

How are cuts separated from fast motion?

A candidate cut has to pass a persistence gate: the three samples before it must look like each other, the three after must look like each other, and the two groups must look different. Fast motion changes every frame, so the groups do not separate and the candidate is rejected.

Can the browser read metadata, captions or audio stems?

Not in this workbench. Container and device metadata, AIGC and C2PA tags, OCR and stem separation are handled by the open-source rea-video CLI. The browser tool measures pixels and basic audio rhythm, and stops there.

See it on your clip.

The workbench is the fastest way to check whether the measurements match the reference.

Drop a clip +