--- name: film-look-grade description: Give any photo a convincing analogue film look on your own computer, free for every photo. Four looks - Kodak Portra 400 warmth, Cinestill 800T night tones with red halation, Fuji Pro 400H pastels and a cinematic teal and amber grade - each with real grain, halation, soft highlight roll-off and a gentle vignette. The framing and content stay exactly as shot. Video clips can be graded the same way with ffmpeg. metadata: type: image version: 1.0.0 category: Social posts & covers tagline: Use this Skill to give any photo a real film look, graded locally in seconds. made-for: Creators, Photographers, Social teams, Brands, Agencies generates-with: Graded JPEG, WebP or PNG at the original size; MP4 for video clips requires: Node 20.9 or newer and sharp (run npm install sharp in the Skill folder) for photos; ffmpeg 5 or newer for video clips outside-costs: None for grading, which runs locally. The optional relight step for a badly lit photo sends one request to an image-edit model with your own FAL_KEY, about $0.07 per photo. updated: 2026-10-16 title: Film look grade availability: live summary: Give any photo a real film look (Portra, Cinestill, Fuji or teal and amber) with grain and halation, graded free on your own computer. command: /film-look-grade my travel photos in a warm Portra look output: JPEG, WebP or PNG ยท same size as the original; MP4 for clips required-input: Any photo or clip creator: meleon --- # Film look grade Use this skill when someone wants a photo (or a short clip) to look like it was shot on film: warm Portra skin, Cinestill night halos, airy Fuji pastels, or the teal and amber grade of a travel film. The grade is done by `scripts/grade.mjs` on the person's own computer, so it costs nothing per photo and never changes what is in the picture. Only the colour, tone, grain and glow change. ## What you need - The photo, as a local JPEG, PNG or WebP file (convert HEIC to JPEG first). Or a video clip (MP4, MOV, WebM) for the video path. - The look they want: `portra-400`, `cinestill-800t`, `fuji-400h` or `teal-amber`. If they describe a mood instead ("warm and nostalgic", "moody night", "soft and airy", "like a travel film"), pick from the table in `references/film-stocks.md`. If they are unsure, render all four and let them choose. - Optional: how strong (0 to 1, default 1) and how much grain (0 to 2, default 1). If the photo is missing, ask for it. Never invent or replace the photo. ## What you make - One graded image, the same size and framing as the original, as JPEG (default), WebP or PNG. Location data and other metadata are stripped. - With `--all`, one file per look so the person can pick. - For a clip: one graded MP4 (H.264, same size and length, audio kept). ## How to run it 1. **Look at the photo first** (open it with your image tool). Note the light (daylight, golden hour, overcast, night, mixed indoor), the skin tones, and anything a grade can't fix. Read `references/film-stocks.md` and pick the look. Say which look you chose and why in one line. 2. **Badly lit photo? (optional, paid)** A grade can't rescue a face lost in deep shadow, a blown-out sky over half the frame, or heavy night noise. Only then, offer the relight step and its cost (about $0.07) and wait for a yes: - If the photo shows people, ask the person whether it is their own photo or the people in it agreed to it being edited, and quote their answer in your reply. If they say no or don't answer, skip the relight and grade the photo as it is. - Run `node scripts/build-relight-input.mjs --photo --out relight.json`. A local file is embedded in the request, so nothing has to be uploaded publicly. If you did upload a person's photo to get a public URL, delete it once the result is back. - POST the `input` from relight.json to fal model `openai/gpt-image-2/edit` (`https://queue.fal.run/openai/gpt-image-2/edit`) with the user's own FAL_KEY in the `Authorization: Key ...` header, then poll the returned `status_url` and fetch `response_url`; the image is at `images[0].url`. The Skill never stores keys. Without a key, paste the prompt from `assets/prompt-template.md` and the photo into any GPT-Image-class image editor. The alternative on fal, `fal-ai/nano-banana-pro/edit`, costs about $0.15 per image and takes the same `prompt` and `image_urls`, with `aspect_ratio: "auto"` and `resolution: "1K"` instead of `image_size` and `quality`. - Put the relit photo beside the original. If faces, text or objects changed, discard it and grade the original instead. 3. **Grade it.** Photos need Node 20.9 or newer and sharp: run `npm install sharp` in the Skill folder once. Then: - `node scripts/grade.mjs --input photo.jpg --preset teal-amber --output photo-film.jpg` - To compare looks: `node scripts/grade.mjs --input photo.jpg --all --output-dir graded/` - Softer: add `--strength 0.6`. Less grain: `--grain 0.5`. No grain: `--grain 0`. - A video clip: `node scripts/grade.mjs --input clip.mp4 --preset cinestill-800t --output clip-film.mp4` (needs ffmpeg). SDR clips only: an HDR clip (most phones record HDR by default) is refused with a message; export an SDR copy first (see `references/film-stocks.md`). - `--list` prints the looks. `--all` goes with `--output-dir` only (no `--output` or `--preset`). The defaults (strength 1, grain 1, seed 7) are the settings that made `assets/preview.webp` from `assets/example-input.jpg` with `teal-amber`. 4. **Check it** against `references/output-spec.md`: view the original and the graded file side by side. Skin should look like skin (not orange, grey or green), whites should roll off softly, and the grain should look like film, not digital noise. 5. **If it fails, at most 3 attempts.** Change one thing per attempt and say what you changed: first the strength, then the grain, then a different look (or one preset value, using the fixes in `references/film-stocks.md`). View each result beside the original. Then return the best one and say what still differs from what they asked for. 6. **Return** the graded file, the look and settings you used, and the command, so they can grade the rest of the set the same way. ## Files - `references/film-stocks.md`: what each film stock looks like, which photos it suits, every preset value explained, and fixes for common problems (skin tones, night, snow, product colours, sets of photos, video). - `references/output-spec.md`: sizes, formats and the pass/fail checklist. - `assets/presets.json`: the four looks. Copy one under a new name to make a custom look. - `assets/prompt-template.md`: the relight prompt for the optional paid step. - `assets/generation-input.json`: the grade defaults and the relight model, settings and approximate cost. - `assets/example-input.jpg` and `assets/preview.webp`: a phone photo and the same photo graded with `teal-amber` at the defaults. - `scripts/grade.mjs`: grades a photo (sharp) or a clip (ffmpeg). It calls no API. - `scripts/build-relight-input.mjs`: prints the relight request for the optional step. It calls no API.