Skip to main content
Use Color Grading to correct and creatively grade real <video> and <img> media in Studio or through an agent with the same validated SDR/Rec.709 shader contract in preview and render.

Choose the Right Tool

All pixel-level stages are stored together on the selected media element. An overlay is different: it is an ordinary editable composition layer whose final paint order follows its authored track and CSS z-index.

Quick Start

Select a real <img> or <video> element to open Color Grading in the Design panel.
1

Correct the source

Open Scopes, then adjust exposure, tonal balance, white balance, and saturation before applying a stronger look.
2

Shape the grade

Use tonal wheels, curves, or an HSL Color Selection only where the source needs more precise control.
3

Choose a look and verify

Preview a preset or load a 3D .cube LUT, compare with the source, and scrub representative frames before rendering.
To reuse a grade in Studio, use Copy grade to, choose Current file media or All project media, then click Apply. Project-wide copy refuses project-relative LUT paths because the same path may resolve differently in another composition; use current-file copy or a project-root path/data URL. The copy changes only the treatment payload, not overlays, captions, or DOM layers. Project-local media is the reliable path. Remote media requires compatible CORS headers. Color Grading does not process captions, text, SVG, arbitrary DOM, or CSS background images.

Professional Controls

Color Wheels

The three wheels target broad tonal zones:
  • Shadows shapes dark regions.
  • Midtones shapes most faces, products, and general scene color.
  • Highlights shapes bright regions and specular areas.
Use small amounts first. The Level control changes the brightness of the same tonal zone, while hue and amount introduce color.

RGB Curves

  • Master remaps overall luminance.
  • Red, Green, and Blue remap individual channels.
Curve points are normalized [input, output] pairs. Resolved curves contain input endpoints 0 and 1; HyperFrames infers missing endpoints, and the 2–16-point limit includes those inferred points. An S-curve increases contrast; lifting the lower-left region raises shadows; channel curves can build split-tone or cast-removal adjustments.

Hue Curves

  • Hue vs Hue moves a selected hue toward another hue.
  • Hue vs Saturation changes saturation around a selected hue.
  • Hue vs Luma changes brightness around a selected hue.
Hue curve points are [hueDegrees, delta] pairs and wrap around the color wheel. An authored hue curve requires 3–16 unique hue inputs from 0 up to, but not including, 360.

HSL Color Selections

A color selection qualifies pixels by hue, saturation, and luma, then applies a correction only inside that matte. This is useful for restrained tasks such as reducing an overly saturated shirt, cooling a background color, or protecting skin from a broad creative grade. HyperFrames supports up to four ordered selections. These are static media-level qualifiers: they do not include object tracking, rotoscoping, facial recognition, or spatial masks. To confine a grade to a region of the frame rather than a range of colors, see Limiting a Grade to Part of the Frame.

Scopes

Studio scopes analyze a captured selected-media frame with the current treatment applied. They refresh as the grade changes, but are inspection tools and do not modify the grade.

Presets

HyperFrames ships tested shader-setting presets, not bundled LUT files: Use these as starting points and tune them for the actual source. Presets that also activate a stylized shader treatment are documented under Media Effects.

Agent Guidance

Agents should use the CLI as the normal authoring surface. The data-color-grading attribute is the persistence contract, not the first thing an agent needs to memorize. Users do not need to name a technical control. Requests such as “this interview feels too dark and cold” or “polish the footage without making it look filtered” route through the media-use skill, which inspects the source, discovers the relevant contract, applies a deterministic payload, and verifies the result. Start with the concise capability overview, then query only the contract needed for the current intent:
Terminal
Focused queries such as wheels, hue-curves, secondary, scopes, or lut return exact controls, bounds, and examples. Start from source analysis or a tested preset, then add small, explainable adjustments. Avoid inventing many unrelated curve and secondary values: they are difficult to review and easy to overcook. For worked examples — ten graded A/B renders, each with the plain-language prompt that produced it and the payload it compiled to — see Colour grading and film effects in the Prompt Guide. It covers the failures this page cannot: choosing a source that actually has something for the treatment to remove, and separating a subject so one part of the frame can be graded while the rest is protected.

Low-Level HTML Contract

The CLI and Studio persist the resolved grade in data-color-grading:
index.html
The contract rejects unknown keys and clamps numeric values to Core-owned bounds. Query the current contract instead of copying bounds into agent instructions:
Terminal
Use --all only for exhaustive tooling or contract inspection.

Animating a Grade

Nine grading properties are exposed as CSS custom properties and can be tweened directly:
Start the value at identity in the payload and in an inline style, so frame 0 is the ungraded reference and every intermediate value is rendered rather than just the endpoints. Two things this list does not give you:
  • --hf-color-grading-intensity does not scale a grade at render time. Setting it to 0.5 renders the same as 0, and animating 0 → 1 produces no change. Do not reach for it as a generic “ramp the whole look” dial.
  • Every other property — halftone, twoInkPrint, tapeDamage, hue curves, secondaries — has no custom property, so it cannot be tweened this way.
For some of those, you can drive the payload itself from the timeline. Rewriting data-color-grading re-applies the grade:
This stays deterministic: the value is derived from timeline position, never from wall-clock time, so seeking to a frame always produces the same result. It costs a payload parse per tick, so prefer a custom property when one exists.
This does not work for every effect. It is verified working for halftone and twoInkPrint. It is verified not working for crtCurvature, scanlines, chromaBleed, and chromaticAberration — the identical payload applied statically renders correctly, but the same values driven through setAttribute produce no visible change, and seeding them non-zero at init does not help. Measure the effect you intend to animate before committing to it, and fall back to a static treatment if the ramp does not move.

Limiting a Grade to Part of the Frame

Grading qualifies pixels by value, never by position. Selections key on hue, saturation, and luma; the one spatially-varying control, vignette, is locked to the frame centre and cannot be moved or reshaped into a power window. There are no masks, shapes, or tracked regions in the contract. A grade also applies to a whole media element. So to treat part of the frame, split that part into its own layer and grade the layer: Two rules that are easy to get wrong:
  • Use the original clip as the background plate, not a subject-removed plate. A subject-removed plate is a hole where the subject was, and a feathered cutout composited over it produces a dark rim.
  • If your cutout ships premultiplied alpha, the browser composites it as straight and edge pixels get multiplied twice, giving a black outline. Rebuild it from the original plus its matte: ffmpeg -i clip.mp4 -i matte.mp4 -filter_complex "[1:v]format=gray[m];[0:v][m]alphamerge" -c:v libvpx-vp9 out.webm

Worked Example: Redacting a Face

Only the face is pixelated. The rest of the subject and the entire room are untouched. Three layers, and the region comes from clip-path on the third:
index.html
Everything outside the clip falls through to the clean copy beneath. Because the graded layer is the cutout, the ellipse can overshoot the head without touching the room — there is nothing outside the silhouette to paint — so size it generously rather than tightly around the features. Pixelate preserves alpha, so the block grid clips to the silhouette instead of filling a rectangle.
A fixed clip-path is only valid for footage where the subject barely moves. Measure before relying on it. Anything with real subject movement needs a tracked matte produced outside HyperFrames — there is no tracking in the grading pipeline.
The prompt that produces the composition above:

Custom LUTs

HyperFrames supports project-local 3D .cube LUTs:
data-color-grading
  • 3D .cube LUTs up to LUT_3D_SIZE 64 are supported.
  • 1D and mixed 1D+3D .cube files are not supported.
  • Common DOMAIN_MIN, DOMAIN_MAX, and DaVinci/IRIDAS-style LUT_3D_INPUT_RANGE headers are supported.
  • HyperFrames does not bundle third-party LUT packs.
  • A LUT is only correct when its expected input color space matches the source.
  • Rec.709 creative LUTs are the safest current workflow.
  • Camera LOG conversion LUTs can be loaded, but HyperFrames does not identify camera profiles or apply ACES/OCIO input transforms automatically.
Never paste a .cube body into an agent prompt. LUT files commonly contain tens of thousands of numeric rows. Keep the file local and use metadata, validation, and rendered comparisons to evaluate it.

Support Matrix

Render and Performance

The runtime creates a sibling WebGL canvas, uploads the current image/video frame as a texture, applies the same grading contract used by Studio, and hides the native source after a shader frame is ready. During final rendering, HyperFrames injects exact video frames and waits for the grading runtime to redraw before capture. That render-parity statement applies to SDR output. In the native HDR render path, HyperFrames keeps HDR source pixels out of the SDR DOM capture and composites them separately at higher bit depth. The current SDR grading canvas is therefore not applied to native HDR layers. Convert or tone-map the source to SDR first when these grading controls must appear in the result, or use HDR Rendering to preserve the untreated HDR source. For 4K output, follow 4K Rendering. A 1080p source does not gain new detail merely because the composition is rendered at 4K. When animating a graded media layer’s opacity, animate a wrapper rather than the <video> itself. The visible pixels are drawn by the sibling grading canvas, so wrapper opacity keeps the media and canvas together. Project-local media is the safest path. Remote media must provide compatible CORS headers and should use crossorigin="anonymous" when pixel access is required.

Next Steps

Media Effects

Apply and animate shader-based optical, retro, print, and art treatments.

Media Overlays

Add editable HUD, flash, light-leak, and freeze-frame composition layers.

HDR Rendering

Render HDR10 outputs and understand the boundary with SDR grading.

4K Rendering

Render at 4K and understand source-versus-output resolution.