Get this effect
Switch to Code in your Claude Desktop App
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/skillsAsk for the effect
Add a synthwave look to input.mp4 The color the darkest tones turn: (40, 10, 90) The color the midtones turn: (235, 40, 150)
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 a synthwave look 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.
| Setting | Default | What it does |
|---|---|---|
VIOLET | (40, 10, 90) | The color the darkest tones turn. |
PINK | (235, 40, 150) | The color the midtones turn. |
CYAN | (30, 205, 240) | The color the brightest tones turn. |
BLACK_POINT | 60 | Brightness (0-255) at and below which a pixel is all violet. |
WHITE_POINT | 225 | Brightness at and above which a pixel is all cyan. |
PINK_AT | 0.8 | Where pink sits between violet (0) and cyan (1). Lower gives more cyan. |
HORIZON | 0.9 | How much darker the top of the frame is graded than the bottom: violet sky, cyan floor. 0 grades by brightness alone. |
GLOW | 0.3 | Strength of the soft neon glow added around bright areas. 0 turns it off. |
GLOW_RADIUS | 12 | Blur radius of that glow, in pixels. |
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
Give all of input.mp4 a synthwave grade, on every frame from start to end. For each pixel (RGB, 0-255): take its brightness Y = 0.299R + 0.587G + 0.114B and work out a tone t = max(Y - 60, 0) / (225 - 60). Then tilt it by height so the top is graded darker and the bottom brighter: subtract a value that runs in a straight line from +0.45 on the top row to -0.45 on the bottom row, and clip t to 0-1. Map t through a three-color gradient: violet (40, 10, 90) at t = 0, hot pink (235, 40, 150) at t = 0.8 and cyan (30, 205, 240) at t = 1, blending linearly between them. Then add a neon glow: multiply the graded frame by t, blur it with a Gaussian blur of radius 12 pixels (Pillow's GaussianBlur), and add 0.3 times that blur back onto the graded frame, clipping to 0-255. The top 12% of the frame should come out violet-magenta around RGB (170, 30, 140), the band from 30% to 50% down hot pink around (225, 60, 180), and the bottom 15% glowing cyan around (40, 255, 255), with none of the original pale blue-white backdrop (around 193, 203, 214) left. Do it in Python with numpy and Pillow, piping raw frames from and back to ffmpeg. Add no text (any text you do add should be drawn with Pillow, not ffmpeg's drawtext). Keep the size, 30fps frame rate, 6 second 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 synthwave-look.py and run:
python3 synthwave-look.py input.mp4 output.mp4Show the script
#!/usr/bin/env python3
"""Synthwave look: dark tones turn deep violet, midtones hot pink and highlights neon cyan, with a soft glow.
Usage: python3 synthwave-look.py input.mp4 output.mp4
Needs ffmpeg, numpy and Pillow (pip install numpy pillow).
"""
import subprocess
import sys
import numpy as np
from PIL import Image, ImageFilter
VIOLET = (40, 10, 90) # the color the darkest tones turn
PINK = (235, 40, 150) # the color the midtones turn
CYAN = (30, 205, 240) # the color the brightest tones turn
BLACK_POINT = 60 # brightness (0-255) at and below which a pixel is all violet
WHITE_POINT = 225 # brightness at and above which a pixel is all cyan
PINK_AT = 0.8 # where pink sits between violet (0) and cyan (1)
HORIZON = 0.9 # how much darker the top of the frame is graded than the bottom: violet sky, cyan floor
GLOW = 0.3 # strength of the soft neon glow added around bright areas
GLOW_RADIUS = 12 # blur radius of that glow, in pixels
src, dst = sys.argv[1], sys.argv[2]
w, h = map(int, subprocess.check_output(
["ffprobe", "-v", "error", "-select_streams", "v:0", "-show_entries", "stream=width,height",
"-of", "csv=p=0", src], text=True).strip().split(","))
LUMA = np.array([0.299, 0.587, 0.114], np.float32)
violet, pink, cyan = (np.array(c, np.float32) for c in (VIOLET, PINK, CYAN))
# upper rows lean toward violet and pink, lower rows toward cyan
tilt = np.linspace(HORIZON / 2, -HORIZON / 2, h, dtype=np.float32)[:, None, None]
def grade(rgb):
tone = np.clip((rgb @ LUMA)[..., None] - BLACK_POINT, 0, None) / (WHITE_POINT - BLACK_POINT)
tone = np.clip(tone - tilt, 0, 1)
low = violet + (pink - violet) * np.clip(tone / PINK_AT, 0, 1)
out = low + (cyan - low) * np.clip((tone - PINK_AT) / (1 - PINK_AT), 0, 1)
glow = Image.fromarray(np.clip(out * tone, 0, 255).astype(np.uint8)).filter(ImageFilter.GaussianBlur(GLOW_RADIUS))
out += GLOW * np.asarray(glow, np.float32)
return np.clip(out, 0, 255).astype(np.uint8)
reader = subprocess.Popen(["ffmpeg", "-v", "error", "-i", src, "-vf", "fps=30", "-f", "rawvideo", "-pix_fmt", "rgb24", "-"],
stdout=subprocess.PIPE)
writer = subprocess.Popen(["ffmpeg", "-y", "-v", "error", "-f", "rawvideo", "-pix_fmt", "rgb24", "-s", f"{w}x{h}", "-r", "30",
"-i", "-", "-i", src, "-map", "0:v", "-map", "1:a?", "-c:v", "libx264", "-crf", "18",
"-pix_fmt", "yuv420p", "-c:a", "copy", "-shortest", dst], stdin=subprocess.PIPE)
size = w * h * 3
while True:
buf = reader.stdout.read(size)
if len(buf) < size:
break
frame = np.frombuffer(buf, np.uint8).reshape(h, w, 3).astype(np.float32)
writer.stdin.write(grade(frame).tobytes())
writer.stdin.close()
sys.exit(reader.wait() or writer.wait())





