Hypernatural

WorkflowBy HypernaturalVersion 2, Oct 29, 2026

recipe-board-to-summary-video

Turn a Figma or FigJam board (feedback, research, a retro, a dogfood wall of screenshots and stickies) into a narrated summary video: read the board, group its items by topic and rank them, write and voice a script, rebuild the board as one cluster per topic, and fly a camera across it in time with the voice. Uses the board's own images; no generated footage.

SKILL.md

Figma / FigJam board to summary video

The person brings a link to a board, or one frame or section of it: screenshots, stickies, notes, comments. You deliver a 16:9 1080p video (about 60 to 120 s) that summarizes the board: the topics that matter, most important first, each shown with the board's own screenshots and stickies while a narrator explains it. Every picture comes from the board. Nothing is generated except the voice.

The point is synthesis, not a tour. A camera that visits items in board order, one line per sticky, reads as a list and is the main way this job goes wrong (Dead ends).

Steps

  1. Read the board (Figma MCP). Parse the URL: /board/<fileKey>/…?node-id=1-2 is FigJam (node 1:2); /design/… is a design file. create_session, then:

    • get_figjam (or get_metadata for a design file) on the node with includeImagesOfNodes: false: every sticky's text, author and position, and every image's position and size.
    • get_screenshot of the node, and look at it: the stickies say what is wrong, but the screenshots say what it is about. Crop and read regions where the text is small.
    • Export the node at 2x with download_assets (defaultScale: 2, png) into source/. get_screenshot never renders above 1x, which goes soft once the camera zooms in. A section export carries a margin (40 px at 1x on a section): find it by comparing the export's size with the node's, and map node coordinates to export pixels as (x + margin) * 2. Check the mapping on one item before going on.
  2. Group and rank (the gate that matters most). Make an item list: each item is one image with the stickies that sit on it or next to it (nearest by position; a sticky alone is an item too). Then:

    • Group the items by the underlying problem or theme, not by where they sit on the board or who wrote them. One item can explain a root cause that several others are symptoms of; lead with that.
    • Rank the groups by impact (what blocks everything else first), and name a fix or takeaway for each when the board implies one.
    • Read each sticky against its own screenshot before you group it. A sticky's meaning often depends on the image under it, and a wrong pairing puts it in the wrong group.
    • Keep the wins and praise as a short closing group. Gate: show the grouped, ranked summary in chat (group, items, fix) and get it approved before writing narration.
  3. Write the script from the approved summary: a one-line intro ("N things, most important first"), one paragraph per group (name it, the evidence in a sentence or two, then the fix), and a close. About 150 words a minute. Spell out what a voice misreads: initialisms with hyphens ("M-C-P", "I-D"), tool names phonetically ("F-F-mpeg"). Gate: the script, word for word.

  4. Cast and voice (guide-cast-a-voice, guide-voice-a-script, elevenlabs-tts-v4). Do not assume a voice. Ask who the narrator is and how it should sound, and audition two or three stock voices on the intro line. Use a cloned voice only if the person asks for one and gives its id. If the voice-library search isn't available in this build, audition ElevenLabs' default voices by id; text-to-speech takes any voice id on eleven_v4. Voice one take per paragraph, then trim the edge silence of each take (-45 dB). Join them with a 0.8 s lead, 0.6 s between paragraphs and a 1.5 s tail, normalize to -16 LUFS (two-pass loudnorm), and transcribe locally with whisper-cli for word times (python-read-word-timings). Check every word against the script. Whisper misspells names and starts some words early at paragraph starts. Hear the track before you trust a transcript that disagrees. Gate: the track, listened to whole.

  5. Rebuild the board as clusters (hn4a Python with Pillow, saved in scripts/).

    • Crop each item from the 2x export by its rect (image plus its stickies, with a little margin).
    • One panel per group, about 3200x2100 px, with a pale tint per group (the same tint family as the board), rounded corners and a soft shadow. Lay the panels out in reading order: 4 on the first row, the rest centred on the second.
    • Pack each group's crops into its panel in rows (shelf packing), centred, with one scale per panel that is never above 1.0 (never upscale the export), and a soft shadow and rounded corners on each crop.
    • Write the canvas (source/clusters.png) and a JSON of every panel and item rect in canvas pixels.
    • Add no words of your own: the board's own text is the text. If the person wants titles, add them later as an overlay (guide-add-titles-and-motion-graphics), never baked into the canvas. Gate: a small preview of the whole canvas (the grouping made visible), and a contact sheet of a still per camera stop.
  6. Cue the camera and render. Write a shot list: [target, cue], where the target is all, a panel, or panel/item, and the cue is the start time of the word that names it. Open on all for the intro. Land on each group's panel as its paragraph starts, then on each item as it is mentioned. End on all.

    • Framing: the target rect padded ×1.15 for an item and ×1.05 for a panel, widened to 16:9, and never narrower than about 1100 canvas px (a closer zoom shows pixels).
    • Moves: 0.65 s smoothstep, starting 0.3 s before the cue. Interpolate the centre linearly and the width in log space. On a long move add a zoom-out bump of up to +50% at mid-move, scaled by distance over frame width, so the viewer sees where the camera is going.
    • Holds: a slow 3% push-in.
    • Render with a mip pyramid of the canvas (halve until under 4000 px wide; sample the smallest level still at least 1.2× the output width). Use Image.resize(box=…) for sub-pixel smooth motion, and pipe raw RGB frames into ffmpeg (libx264 crf 18, yuv420p, 30 fps) with the track as AAC. That takes about a minute for 100 s.
    • Check it (ffprobe-inspect-media): frame count = duration × 30, audio length equal, and a contact sheet of frames pulled from mid-move.
  7. Deliver per the core skill (When it's done): show the person the video in its folder. A note on a group's wording means re-voicing that paragraph only and shifting the cues after it. A note on the grouping means going back to step 2.

Choices this recipe makes

  • Clusters rather than the original layout. Grouping the crops on screen makes the synthesis visible, and the viewer sees why the items belong together.
  • Board images only. It's the team's real evidence, it's free, and nothing can drift from the source. Generated footage can be added later as an extra, never as a replacement.
  • Voiceover, no presenter, by default. A presenter (avatar) adds lip-sync cost and splits attention from small screenshot text. Offer one as an upgrade (recipe-slide-deck-presenter).
  • No added on-screen text by default. Many people don't want words added on screen. Ask before adding titles or captions.

Dead ends

  • A camera walking the board item by item in the board's order, with one script line per sticky. The person's verdict: it didn't summarize what was important or group the topics. Group and rank first, every time.
  • Pairing a sticky with the wrong screenshot. A note about a tool install got grouped under voice problems because it sat near a voice screenshot. Read the image under each sticky.
  • get_screenshot for the source image: it caps at 1x. Use download_assets at scale 2.
  • Upscaling crops to fill a panel: text goes soft. Cap the panel scale at 1.0.

Go make something cool.

Install the app, open your agent, describe the video. That's the whole onboarding.

Sticker HypernaturalSticker BannerSticker TVBoy