--- name: cinematic-brand-film description: Make a 30 or 45 second cinematic brand film that looks shot by a real crew. Plans 7 to 9 shots in film grammar (aerial establishing, arrival, insert, signature moment, close, golden-hour silhouette, closing), keeps the same person or product in every shot with a reference bible, renders photoreal keyframes with GPT Image 2, animates each with Seedance 2.5, then cuts, grades (teal-amber, warm Kodak, cool Fuji), adds grain, a serif title card and an end card with ffmpeg. 16:9 by default, 9:16 on request. Works for resorts, hotels, restaurants, products, fashion, food, wellness and travel brands. metadata: type: video version: 1.0.0 category: Video & animation tagline: Use this Skill to turn a one-line brand story into a graded 30 to 45 second film with a title card, the same cast in every shot. made-for: Hotels and resorts, Brands, Agencies, Creators, Tourism boards generates-with: Shot list + cast bible + 7-9 keyframes + 7-9 Seedance clips, cut into one MP4 film, 16:9 or 9:16, 720p requires: Node.js 18 or newer and ffmpeg with ffprobe for the scripts; a free TrueType font for the title; your own FAL_KEY only if you run scripts/fal-run.mjs outside-costs: About $23-29 for a 30 s film and $29-35 for a 45 s film at 720p on fal, about two thirds of it the Seedance 2.5 finals ($0.47/s); the 9-shot sample cost $33.62. Billed to your own fal account; quote the total and get a yes before the first paid call. updated: 2026-10-16 title: Cinematic brand film availability: live summary: Turn a one-line brand story into a graded 30 to 45 second film with drone shots, the same cast in every scene, a serif title card and an end card. command: /cinematic-brand-film our island resort, a slow day from first light to lanterns, 45s 16:9 output: MP4 · 16:9 or 9:16 film, 30-45 s, 720p + keyframes required-input: Brand or place + one-line story creator: meleon --- # Cinematic brand film Turn a brand or place name and a one-line story into a short film that feels like a real shoot: drone establishing shot, the same person (or product) through every scene, close details, a golden-hour silhouette, one consistent film grade with grain, a serif title card and an end card. The stills are designed first and approved before any video is paid for; each still is then animated on its own, and the clips are cut together locally. ## What you need - Brand or place name, and the story or mood in one line ("a slow day at a remote island resort, first light to lanterns"). - Length: 30 s (7 shots) or 45 s (9 shots). Default 30. - Aspect: 16:9 (default) or 9:16, generated natively. 1:1 and 4:5 come from the crop step at the end (`assemble-film.mjs --crop 1:1`, a centre crop at native size, 720 × 720 from 720p). Resolution: 720p (default) or 1080p (about 2.5 times the video cost). - People: a synthetic cast (default), no people at all, or the user's own photo. A real person's photo is only allowed if it is the user, or the user says they hold that person's written consent: ask, and record their exact words with `--consent-quote`. Refuse photos of celebrities or public figures whatever the answer, and never minors. - **Limits: faces.** Seedance on fal refuses start frames that show a clearly visible realistic face, even a synthetic one, so these films are designed around backs, silhouettes, profiles in shadow and small figures (`references/character-consistency.md`, section 4). Seen in testing: Seedance 2.0 mini refused a side-profile frame of the synthetic sample woman (`content_policy_violation`, "likenesses of real people"); Seedance 2.5 was only given face-hidden frames, so treat it as the same. If the user insists on faces, offer one of these for the face shots, test one draft first, and say the look will differ from the Seedance shots: - Kling 3 turbo pro, `fal-ai/kling-video/v3/turbo/pro/image-to-video`, about $0.14/s. Fields: `prompt`, `image_url`, `duration` "3"–"15" (optional `multi_prompt`); no resolution or audio fields. In testing it accepted a face-forward synthetic close-up and kept the same face for 3 s; it returned 1920 × 1080 with its own sound track (assemble-film.mjs scales it down to match). - Veo 3.1, `fal-ai/veo3.1/image-to-video`, $0.20/s silent or $0.40/s with audio. Fields: `prompt`, `image_url` (16:9 or 9:16, 720p or more), `duration` "4s"/"6s"/"8s", `resolution`, `generate_audio`, `aspect_ratio`. In testing it accepted the same close-up but the face drifted toward a different person within 4 s; use it only for short face beats and check every frame. - Optional: a hero product photo (clear, label readable) when the film should feature a product. - Title and end-card text exactly as they should appear (default: the brand name for both). - A free TrueType font for the cards, e.g. Cormorant Garamond from Google Fonts (`references/film-look.md`). Do not bundle fonts into the Skill. - Optional: music the user owns or licensed (see Sound in `references/film-look.md`). ## What you make 1. `film.json`: the filled shot list (locks, every prompt, trims): the recipe for the film. 2. A cast bible still (same person three times) when the film has a person. 3. One approved keyframe per shot (7 or 9 JPEGs). 4. One Seedance clip per shot. 5. The finished film: H.264 MP4, 720p, 24 fps, graded, grain, title card on the first shot, end card. Optional 9:16 crop and a short muted preview cut. ## How to run it **Budget: about $23–29 for a 30 s film (7 shots) and $29–35 for a 45 s film (9 shots) at 720p. The Seedance 2.5 finals are most of it (about $16 and $21 before re-rolls). The 9-shot Kaia Island sample cost $33.62 with three re-rolled stills and two re-rolled finals. 1080p finals cost about 2.5 times as much.** Before the first paid call, run `node scripts/build-requests.mjs --film film.json --stage estimate`, quote the total it prints, and get one explicit yes on it. Then, at every paid step, tell the user the model, how many calls and the cost, and ask again if the spend will go past the quoted total. To send a request, POST the printed JSON `input` to the fal model id in that request with the user's own FAL_KEY (`scripts/fal-run.mjs --request --out --approved` does this; the Skill never stores keys), or paste the prompt and images into any GPT-Image-class image editor and Seedance-class image-to-video tool. Seedance requests always carry `prompt`, `image_url`, `resolution` ("480p" draft, "720p" final), `duration` (a string, "4" to "6"), `aspect_ratio` "auto" and `generate_audio`. 1. **Brief (free).** Confirm brand, story line, length, aspect, people option, product photo, title and end-card text, and grade. Choose the grade by mood from `references/film-look.md`. For a person photo, ask the consent question in `references/character-consistency.md`; stop if the answer is not a clear yes, or if the photo shows a celebrity or public figure. 2. **Shot list (free).** Run `node scripts/build-shot-list.mjs --out film.json --brand "..." --story "..." --person synthetic|own-photo|none --grade [--length 45] [--aspect 9:16] [--product-photo p.jpg] [--title "..."] [--end-card "..."]`. With a person photo add `--person own-photo --person-photo me.jpg --consent-quote ""`; the quote is saved in film.json. Never write the quote yourself or choose own-photo on your own. Fill every `FILL:` field: `locks.cast`, `locks.wardrobe`, `locks.location` (and `locks.product`), then each shot's `keyframe_prompt` and `motion_prompt`, using `references/shot-grammar.md` (what each slot shows, by brand type) and `references/prompt-patterns.md` (prompt anatomy, examples). Keep faces turned away, in silhouette or small (`references/character-consistency.md`, section 4). Show the user the shot list in plain words. 3. **Spend gate (free).** `node scripts/build-requests.mjs --film film.json --stage estimate`. Quote the printed total to the user and wait for one explicit yes before any paid call. 4. **Cast bible (about $0.25).** `node scripts/build-requests.mjs --film film.json --stage bible --out requests --inline`, send it (model `openai/gpt-image-2`, or `openai/gpt-image-2/edit` with the user's photo; `image_size` 1536 × 864, `quality` "high"). Look at it: same person three times, wardrobe exactly as locked, natural hands. Save it and set `references.cast_bible`. 5. **Establishing still first (about $0.25).** Generate shot 1 (`--stage keyframe --shot 1`), approve it, and set `references.location` to it so every later shot matches the place. 6. **Keyframes (about $0.28 each).** `--stage keyframe --shot all` (model `openai/gpt-image-2/edit`, the cast bible, location and product as references, sizes in `assets/generation-input.json`). Open every still and check: same person and wardrobe, face hidden, no extra people, hands and feet natural, no text, and the tasteful-framing rules in `references/prompt-patterns.md` (wardrobe in place, nothing centred on hips or buttocks). Re-roll a still by changing one thing in its prompt (max 3 attempts). Put each approved path in the shot's `keyframe`. Show the user the set side by side before any video. 7. **Drafts (about $0.07 per second).** `--stage draft` writes Seedance 2.0 mini requests (`bytedance/seedance-2.0/mini/image-to-video`, `resolution` "480p", `duration` = the shot's seconds, `generate_audio` false). Send them, make a contact sheet per clip (`ffmpeg -i clip.mp4 -vf "fps=2,scale=320:-1,tile=6x2" -frames:v 1 sheet.jpg`) and look: was the frame accepted (a visible face gets `content_policy_violation`), does the action read, does anyone appear who should not. Fix motion prompts from what you see. 8. **Finals (about $0.47 per second at 720p).** `--stage final` writes Seedance 2.5 requests (`bytedance/seedance-2.5/image-to-video`, `resolution` "720p" or "1080p", `duration` "4"–"6", `generate_audio` true, `bitrate_mode` "high", `codec` "H264"). Send them; long jobs may take 5–15 minutes (`fal-run.mjs --resume` picks up a slow one). Contact-sheet every clip at 3 fps, note the clean in/out seconds (skip the first 0.2 s, stop before any odd gesture or turn to camera), and write `clip`, `in`, `out` and `transition_in` ("cut", or "dissolve" where time or place jumps) into film.json. Fail path per shot: max 3 attempts, change one thing per attempt (motion prompt, trim, or keyframe) and say which; then use the best one and tell the user what still differs. 9. **Assemble (free).** `node scripts/assemble-film.mjs --film film.json --out -film.mp4 --title-font Serif-Italic.ttf [--small-font Serif.ttf] [--audio clips] [--music track.mp3]`. Optional: `--letterbox 2.39`; square or feed versions with `--crop 1:1` or `--crop 4:5` (and `--crop 9:16` as a fallback; a native 9:16 film is better), e.g. `node scripts/assemble-film.mjs --film film.json --out -film-1x1.mp4 --title-font Serif-Italic.ttf --crop 1:1`; a muted preview cut with `--only 1,2,5,8,9 --max-shot 3.2 --max-mb 7.5 --audio none`. Sound: read Sound in `references/film-look.md` first; `--audio clips` is model-made ambience, so listen before shipping it. 10. **Check (free).** `node scripts/check-film.mjs --file -film.mp4 --edl -film.mp4.edl.json --aspect 16:9 --resolution 720p --min-seconds 27 --max-seconds 48`, then open the contact sheet and go through the checklist in `references/output-spec.md`. Fix and re-assemble until it passes. Firelight or lantern flicker can trip the flash check: look at the moment, and if it is real, re-run with `--ignore `. 11. **Deliver.** The film, the keyframes, film.json and the edit list. Say which shots were re-rolled and anything still imperfect. For a poster or thumbnail use the aerial, an arrival or the dusk frame, never a silhouette or swimwear frame. 12. **Clean up a person photo.** When the film is done: delete the user's photo and the cast bible made from it from your working folders unless the user asks to keep them; if the photo was ever put on a public URL, delete it there. fal keeps request inputs (including inline images) and generated outputs on its side for a period: tell the user they can delete those requests and files from their fal dashboard or ask fal to remove them, and check fal's current retention policy. ## Files - `references/shot-grammar.md`: the 7/9-slot structure, cutting rules, what each slot shows for resorts, city venues, products, fashion, food, outdoor, real estate and wellness, and vertical films. - `references/film-look.md`: grade presets and when to use each, lens, film stock and light vocabulary, bloom/grain/vignette/letterbox, title-card fonts and rules, sound and music. - `references/character-consistency.md`: locks, the cast bible, reference order, the Seedance face check and how to design around it, tasteful framing, drift fixes, couples, products as the anchor, consent and privacy. - `references/prompt-patterns.md`: keyframe and motion prompt anatomy, tasteful framing, camera moves that work, causes of morphing and fixes, drafts versus finals, examples for other brand types, the fail path and the alternative video models. - `references/output-spec.md`: deliverables, sizes, costs, the pass/fail checklist, poster frames and the sample's known imperfections. - `assets/prompt-template.md`: the bible, keyframe and motion prompts with placeholders. - `assets/generation-input.json`: model ids, sizes, defaults and approximate costs (the settings that made the preview). - `assets/shot-list-example.json`: the filled shot list of the preview film (Kaia Island), every prompt as used. - `assets/preview.mp4`: a 19.7 s silent cut (7 MB) of the 39 s sample film. - `scripts/build-shot-list.mjs`: writes film.json with the shot grammar and FILL fields. - `scripts/build-requests.mjs`: the cost estimate for the whole film, and the model requests for one stage. Calls no API. - `scripts/fal-run.mjs`: sends one request with the user's FAL_KEY after `--approved`, waits, downloads (never overwrites without `--force`). - `scripts/text-card.mjs`: renders title and end cards from a .ttf (no ffmpeg drawtext needed). - `scripts/assemble-film.mjs`: trims, cuts and dissolves, grade, bloom, grain, vignette, letterbox or crop, title and end cards, audio or music, H.264 +faststart, edit list. - `scripts/check-film.mjs`: technical checks, black-frame and flash detection (`--ignore` for real firelight), contact sheet.