| name | make-a-movie |
| description | Create dynamic, narrated, music-backed, friend-shareable reels with polished motion and audio mixing. Use when asked to make a short narrated video or social reel from structured content. |
Make A Movie
Create a short narrated video from structured inputs. Default to a polished, Telegram-friendly 9:16 MP4 that is engaging enough to share outside the household.
Input
Prefer a JSON manifest with a title, output name, voice, slides, and delivery target. Each slide needs a title, concise narration, readable on-screen text, and either an image or a public source URL that can be captured.
Use en-US-GuyNeural at +5% by default, one audio segment per slide, and a short pause between segments.
Creative Standard
Treat the reel as a finished social artifact, not an internal report.
- Write audience-facing copy that a friend can understand without context.
- Never include workflow labels such as “unconfirmed,” “scout suggestion,” “not household-approved,” “candidate,” or “internal.”
- Present verified facts confidently. Express genuine uncertainty as a useful consumer caveat, such as “ask about dairy” or “menu changes seasonally.”
- Open with a strong hook, build momentum, and end with a save/share/visit takeaway.
- Prefer bold typography, intentional color changes, strong hierarchy, and visual contrast over generic dark slideshow styling.
- Add real motion: subtle push-ins, pans, animated crops, kinetic text, or short transitions. A sequence of motionless screenshots is not sufficient unless the user explicitly asks for a plain slideshow.
- Keep pacing energetic. Use short narration and change visual emphasis every few seconds.
- Design for muted viewing with large, concise on-screen text.
- Avoid repetitive layouts when multiple slides use the same source image.
- Keep branding and source screenshots legible; do not stretch, obscure, or use screenshots only as dark background texture.
- Add dynamic, rights-safe instrumental background music by default unless the user requests silence or the subject calls for a restrained treatment.
Audio Design
- Choose music that matches the reel’s visual energy and subject. Prefer instrumental tracks with an immediate hook and enough arrangement space for narration.
- Use generated or explicitly licensed/rights-safe music. Do not assume a random web track is reusable.
- Duck music beneath narration with sidechain compression or deliberate automation; speech must remain effortless to understand on phone speakers.
- Let the music rise slightly during pauses, transitions, the opening hook, and the closing beat without overpowering the voice.
- Fade cleanly at both ends and avoid abrupt loops or truncated musical phrases.
- Mix toward roughly -16 to -19 integrated LUFS for a social reel, keep true peak below -1 dBFS, and listen-check the balance when possible.
- If music generation fails, use a verified local/right-safe source or create a simple original bed; do not silently omit music.
Workflow
- Create a task folder under
movie-renders/<slug>/.
- Gather grounded public assets. Prefer official sites, menus, ordering pages, public booking pages, or official social media. Do not bypass access controls.
- Capture web visuals with Playwright/Chromium at a phone-friendly viewport. Personally verify the rendered page.
- Convert the request into a manifest. Write a hook, 2–4 concise content beats, and a clear closing beat.
- Write one narration segment per slide.
- Generate one neural TTS clip per slide and obtain or create a rights-safe instrumental music bed.
- Render 1080×1920 frames or motion scenes with strong visual hierarchy and readable captions.
- Compute scene timing from its matching audio plus a short pause.
- Add motion and transitions in the rendered video. Subtle movement is acceptable; static concatenation is not the default.
- Duck and mix the music beneath narration, then assemble H.264/AAC MP4 with
yuv420p.
- Validate with
ffprobe. Extract thumbnails across the timeline and inspect at least two representative frames with view_image.
- Send the MP4 with the messaging tool using
media, filename, and mimeType: video/mp4.
Restaurant Reels
For restaurant discoveries:
- Frame the video as a recommendation or discovery someone can share with friends.
- Use a hook such as “New in Boston,” “Save this lunch spot,” or a similarly specific audience-facing line.
- Include location, hours when useful, and 2–4 concrete menu highlights.
- Keep dietary caveats factual and helpful without exposing internal recommendation status.
- For a single restaurant, use an intro/hook, food or menu highlights, a useful caveat or practical detail, and a save/share outro.
- If food photography is unavailable, use official menu/site captures with varied crops, bold layout changes, and motion.
Validation
Before delivery, verify:
- video and audio streams are present;
- background music is audible, dynamically ducked beneath narration, rights-safe, and cleanly faded;
- narration and scene changes remain synchronized;
- the MP4 is vertical, readable on a phone, and small enough for the destination;
- motion is visible and the pacing feels intentional;
- screenshots are legible and no private or paywalled content appears;
- no internal workflow language remains;
- the reel makes sense to a recipient who has not seen the preceding chat.
Rendering Helper
A starting-point renderer is bundled at
scripts/render_movie_from_manifest.mjs.
Given a manifest JSON path, it renders each slide's foreground-panel frame with
Playwright/Chromium (title, subtitle, bullets, per-slide crop position, accent
color) into a frames/ folder next to the manifest. It requires Node with the
playwright package installed. Treat it as a scaffold to adapt, not a complete
pipeline — timing, motion, TTS, and audio mixing still follow the workflow
above.
Reliability Notes
- Embed local images as data URLs when rendering HTML with Playwright.
- Use per-slide audio and computed durations; do not pair one continuous voiceover with guessed timings.
- Use
libx264 when available or libopenh264 as a fallback.
- Use explicit decimal durations in ffmpeg filters, for example
0.18, because shorthand such as .18 may fail.
- Use
sidechaincompress or equivalent automation for music ducking, then measure integrated loudness and true peak before delivery.