npx skills add ...
npx skills add iart-ai/lower-thirds-skills --skill lower-thirds
Make animated lower thirds and other broadcast overlays (name straps, corner bugs, subscribe reminders, scripture or song titles) as transparent video files, drawn frame by frame in JavaScript on a canvas and rendered to WebM with alpha for OBS and browsers, or ProRes 4444 for Premiere Pro, DaVinci Resolve and Final Cut. Use when someone wants a lower third, a name title, a chyron, a stream overlay, a corner bug, or any graphic with a transparent background to lay over their own footage or livestream.
npx skills add iart-ai/lower-thirds-skills --skill lower-thirds
A lower third is the name-and-role graphic in the bottom part of the frame that says who is speaking, laid over footage the graphic never sees. The deliverable is a file with an alpha channel: everything you do not draw stays see-through.
You copy templates/lower-third.html into the working folder, write the design into it, check it with scripts/render.mjs, and render the files. Run the script from the working folder (node <this skill>/scripts/render.mjs …); outputs land there. Make it in one go: don't ask questions the brief already answers or a sensible default covers, and list the defaults you chose when you deliver.
CARDS, rendered to its own file with the same design. Add fields when a card needs more than title and sub.references/delivery.md); Premiere Pro, DaVinci Resolve, Final Cut → ProRes 4444 .mov; both named → both; a phone editor or tool without alpha → an MP4 on a green ground for chroma key. Not said: WebM and .mov.The template's drawGraphic is a working example of the structure, not the look: rewrite it for the brief. What holds for every design:
SAFE in the template is 6%). The lower third lives in the bottom third; a corner bug in a corner; the middle of the frame stays empty for the speaker.LEAD and TAIL.fit() so a long name shrinks to its box instead of overflowing it, and size every wipe or clip to the widest thing it reveals. Check the longest entry in CARDS.<link> per family with the weights and italics you use, and every face you draw with listed in FONTS ('700 Inter', 'italic 400 Libre Baskerville'), so nothing renders in a fallback font. Many serifs (Cormorant, EB Garamond, Playfair Display) draw old-style numerals that drop below the line, and canvas can't switch them to lining ones: if the card has digits ("Psalm 1:3", "Episode 12"), pick a face with lining numerals (Lora, for one) and check the stills.Several things on screen (a host strap, a guest strap, a corner bug for the whole segment) can be one page with their own timings, or one page per graphic when the editor needs to place them separately; say which you did.
--check must pass, but it can't see text cut off by a wipe or text that's hard to read: your eyes do that. In the stills, every word reads over both the dark and the light ground and the spacing is even. In the sheets, nothing jumps, no text shows before or outside the part of its panel that is revealed, none gets cut mid-hold, and the build-out is as clean as the build-in. Check every entry in CARDS (--card N counts from 0: --card 1 is the second). Fix and look again until it holds up.
The script refuses an MP4 without --ground (H.264 has no alpha) and confirms that WebM and .mov files really carry an alpha channel, by decoding a frame from the hold. Hand over the files, the page (they can change a name and re-render), and how to use them in their tool from references/delivery.md, in two or three lines (a web page also needs the Safari file described there). Say what you chose that they didn't ask for.
Needs: Node 18+, npm i playwright-core in the working folder or any folder above it, ffmpeg, and Chrome (or npx playwright install chromium).
node render.mjs page.html maya-chen.webm # VP9 with alpha
node render.mjs page.html maya-chen.mov # ProRes 4444 with alpha (large)
node render.mjs page.html daniel-ortiz.webm --card 1 # the next card
node render.mjs page.html maya-chen-4k.webm --scale 2 # 3840x2160
node render.mjs page.html maya-chen-green.mp4 --ground '#00ff00'