How to add an apply a LUT with Claude

A golden-hour .cube LUT turns the pale blue holographic backdrop warm cream-gold, the label a toasted beige and the purple bottle a rosy orchid, on every frame.

Get this effect

  1. Switch to Code in your Claude Desktop App

  2. Install the skill (once)

    Show the prompt
    Install the Recharm video effects skill: download https://recharm-growth-staging.s3.us-east-2.amazonaws.com/website/downloads/recharm-video-effects.zip and unzip it into ~/.claude/skills
  3. Ask for the effect

    Add an apply a LUT to input.mp4
    Look.cube (third argument): none

Several videos, several effects, one ask

Put your clips in the folder, mention them with @, and ask for everything at once. Claude runs one tested script after another on each clip, then joins them.

Add an apply a lut to @clip1.mp4, put a sale badge on @clip2.mp4, give @clip3.mp4 a VHS look, then join all three with crossfades.

Settings you can change

Ask Claude to change any of these, or edit them at the top of the script.

SettingDefaultWhat it does
LUT_SIZE33Grid points per axis in the sample .cube file. 33 is the common size; 17 is smaller and coarser.
GAMMA(0.8, 1.05, 1.1)Per-channel gamma for red, green and blue. Below 1 lifts a channel, above 1 pulls it down.
GAIN(1.0, 1.0, 0.85)Per-channel multiplier after the gamma. Less blue warms the whole picture.
SATURATION1.25Color strength. 1 keeps it, higher makes it richer, lower fades it.
look.cube (third argument)noneYour own .cube file. Without one the recipe writes and uses the golden-hour sample.

Without the skill

Don’t want to install the skill? Paste this prompt into Claude Code and Claude writes the script itself.

Show the prompt
Make a 3D LUT and apply it to all of input.mp4. First write a .cube file called golden-hour.cube: a 33x33x33 grid (LUT_3D_SIZE 33, red index changing fastest, then green, then blue). For each grid point with r, g, b from 0 to 1, the output is r^0.8, g^1.05 and 0.85 x b^1.1; then push saturation to 1.25 around its brightness Y = 0.299R + 0.587G + 0.114B (new = Y + 1.25 x (color - Y)), clipped to 0-1, written with 6 decimals. Then apply it with ffmpeg's lut3d filter (interp=tetrahedral) on every frame from start to end. The pale blue backdrop, around RGB (187, 197, 208), should end up warm cream-gold, around RGB (200, 194, 167); the cream label turns a toasted beige around RGB (208, 186, 138) and the purple bottle a rosy orchid around RGB (167, 99, 139). Use Python with numpy to write the .cube file and ffmpeg for the video. Keep the size, 30fps frame rate, length and audio the same, encode H.264 yuv420p and save it as output.mp4.

Run it without Claude

This is the exact script we tested. Save it as apply-a-lut.py and run:

python3 apply-a-lut.py input.mp4 output.mp4
Show the script
"""Apply a LUT: recolor every frame of a video through a .cube color preset with ffmpeg's lut3d filter.

Usage: python3 apply-a-lut.py input.mp4 output.mp4 [look.cube]
Needs ffmpeg and Python 3 with numpy. Pass your own .cube file as the third argument; without one, the
recipe writes a sample "golden hour" LUT (warm highlights, rosy purples) next to the output and uses that.
"""
import subprocess
import sys
from pathlib import Path

import numpy as np

# The sample LUT: each color channel gets a curve, then saturation is pushed
LUT_SIZE = 33                    # grid points per axis in the .cube file (33 is the common size)
GAMMA = (0.8, 1.05, 1.1)         # per-channel gamma: below 1 lifts a channel, above 1 pulls it down
GAIN = (1.0, 1.0, 0.85)          # per-channel multiplier after the gamma; less blue makes it warm
SATURATION = 1.25                # 1 keeps the color strength, higher makes it richer


def write_sample_lut(path):
    """Write a .cube file: one output RGB per grid point, red changing fastest."""
    steps = np.linspace(0, 1, LUT_SIZE)
    b, g, r = np.meshgrid(steps, steps, steps, indexing="ij")
    rgb = np.stack([r, g, b], axis=-1).reshape(-1, 3)
    rgb = np.array(GAIN) * rgb ** np.array(GAMMA)
    luma = rgb @ np.array([0.299, 0.587, 0.114])
    rgb = np.clip(luma[:, None] + (rgb - luma[:, None]) * SATURATION, 0, 1)
    lines = ['TITLE "golden hour"', f"LUT_3D_SIZE {LUT_SIZE}"] + [f"{r:.6f} {g:.6f} {b:.6f}" for r, g, b in rgb]
    Path(path).write_text("\n".join(lines) + "\n")


src, out = sys.argv[1], sys.argv[2]
if len(sys.argv) > 3:
    lut = sys.argv[3]
else:
    lut = str(Path(out).with_name("golden-hour.cube"))
    write_sample_lut(lut)

subprocess.run(["ffmpeg", "-y", "-v", "error", "-i", src, "-vf", f"lut3d=file='{lut}':interp=tetrahedral",
                "-r", "30", "-c:v", "libx264", "-crf", "18", "-pix_fmt", "yuv420p", "-c:a", "copy", out], check=True)

Find 3x winning ads

Recharm cuts your ad footage into tagged, searchable clips: hooks, testimonials, product shots. Find the shots that win, add the effect with Claude, and ship 3x more ad edits.

Start 14-day free trial