
youtube-intro-outro
This skill should be used when the user asks to "make a YouTube intro", "create a channel intro", "build a logo sting/bumper", "design an outro / end screen / end card", "add subscribe and next-video cards", "make an intro animation", "build a reusable intro template", or "sync the logo reveal to an audio sting". Covers the 3-5s branded intro, the last-20s end-screen outro inside YouTube's element safe zones, timing conventions, audio-sting sync, and a swap-the-brand template.
- Installs
- 733
- Last 24h
- +16
- Trending rank
- #6786
- Security
- Not audited
Install
Works with every agent the skills CLI supports.
npx skills add https://github.com/iart-ai/youtube-video-skills --skill youtube-intro-outro- 01
Install
Run the command in your project. The CLI asks which agents to install for.
- 02
Describe the task
Ask your agent for something this skill covers. It loads youtube-intro-outro automatically when relevant.
- 03
Review the result
The agent follows the SKILL.md steps, scripts and references bundled with the skill.
SKILL.md
The instructions your agent reads when the skill is triggered.
YouTube Intro & Outro
Build the two pieces of motion that bracket every video on a channel: a 3-5s branded intro (logo sting that says "this is my channel") and an outro whose last ~20s host YouTube's clickable end-screen elements (subscribe + next video). Both must respect hard platform constraints — intro length affects retention; outro layout must dodge YouTube's overlaid UI — and both should be one reusable template where only the brand changes.
When to use
- Channel intro / bumper / logo sting (a 3-5s identity hit before content).
- Outro / end screen / end card (the last ~20s with subscribe + next-video cards).
- A reusable brand template: swap name, logo, colors, sting, and re-export.
Two hard rules (platform, not taste)
- Keep the intro 3-5s, the logo hit 1-2s. Anything longer than 5s causes measurable viewer drop-off, which hurts the video in the algorithm. The intro confirms the channel and gets out of the way.
- The outro must be ≥20s of held, quiet layout, and the video ≥25s total. YouTube only allows end-screen elements in the final 5-20s, and the video must be at least 25 seconds long. Design the outro plate around where those elements land — never put your own content under them.
Intro: the logo sting
A sting is three beats in ~3.5s: a windup (motion building tension), an impact (logo snaps to full on the audio hit), and a settle (micro-overshoot relaxing to rest). The brand mark must land exactly on the sound's impact frame, not near it.
| Beat | Window | Job |
|---|---|---|
| Windup | 0-0.8s | whoosh / build; logo not yet readable |
| Impact | ~0.8s | logo snaps to full on the audio hit + a white flash |
| Settle | 0.8-1.2s | overshoot relaxes to rest; tagline fades in |
| Hold | 1.2-3.5s | brand legible, then cut to content |
import {useCurrentFrame, useVideoConfig, spring, interpolate, Img, Audio, staticFile} from "remotion";
export const LogoSting = ({brand}) => {
const frame = useCurrentFrame();
const {fps} = useVideoConfig();
const IMPACT = Math.round(0.8 * fps); // logo lands here, on the sting hit
// overshoot scale: springs up past 1, settles to 1 (the "snap")
const scale = spring({frame: frame - IMPACT, fps, config: {damping: 9, mass: 0.5}, from: 1.18, to: 1});
const logoOpacity = frame < IMPACT ? 0 : 1;
const flash = interpolate(frame - IMPACT, [0, 6], [0.9, 0], {extrapolateLeft: "clamp", extrapolateRight: "clamp"});
return (
<div style={{flex: 1, background: brand.bg, display: "flex", alignItems: "center", justifyContent: "center"}}>
<Audio src={staticFile(brand.sting)} /> {/* impact of this file must sit at 0.8s */}
<Img src={staticFile(brand.logo)} style={{width: 420, opacity: logoOpacity, transform: `scale(${scale})`}} />
<div style={{position: "absolute", inset: 0, background: "#fff", opacity: flash}} />
</div>
);
};
spring overshooting from 1.18→1 is the snap; the white flash decaying over 6 frames sells the impact. Align the audio so its loudest transient sits on frame IMPACT. See references/intro-outro.md for the full composition, a CSS/GSAP variant, and how to find the impact frame in any sting.
Outro: end-screen layout that respects YouTube's element zones
This is where most outros fail: creators put a logo or text exactly where YouTube will stamp a subscribe button. Treat the frame as two thirds. YouTube's clickable elements live on the right two thirds; keep your own branding, channel name, and any face-cam in the left third. Stay away from corners and the bottom — the mobile progress bar and UI overlap there.
| Element | Native size | Where to leave room (1920×1080) |
|---|---|---|
| Subscribe / channel circle | 294×294 | right side, vertically centered-ish, off the edge |
| Next-video card (thumbnail) | 615×345 | upper-right or center-right |
| Playlist / link card | 294×294 | pair beside the video card |
| Your branding (logo, name) | — | left third only, top-aligned |
Render placeholders in your outro plate where the live elements will sit, so you compose around them — then position the real elements over them in YouTube Studio (use its grid + "snap to element").
import {useCurrentFrame, interpolate, Img, staticFile} from "remotion";
// 1920×1080 outro plate. Left third = brand; right two-thirds = YouTube element zones (drawn as guides).
export const EndScreen = ({brand}) => {
const frame = useCurrentFrame();
const fade = interpolate(frame, [0, 18], [0, 1], {extrapolateRight: "clamp"});
const zone = {position: "absolute", border: "2px dashed rgba(255,255,255,.25)", borderRadius: 12};
return (
<div style={{flex: 1, background: brand.bg, opacity: fade}}>
{/* LEFT THIRD: your brand — safe from YouTube's overlays */}
<div style={{position: "absolute", left: 80, top: 90, width: 560}}>
<Img src={staticFile(brand.logo)} style={{width: 220}} />
<div style={{color: brand.fg, font: "700 56px Inter", marginTop: 24}}>{brand.name}</div>
<div style={{color: brand.accent, font: "500 30px Inter", marginTop: 8}}>Subscribe for more →</div>
</div>
{/* RIGHT TWO-THIRDS: leave these empty; YouTube draws the live elements here */}
<div style={{...zone, width: 615, height: 345, right: 90, top: 110}} /> {/* next-video card */}
<div style={{...zone, width: 294, height: 294, right: 250, bottom: 150, borderRadius: 999}} /> {/* subscribe circle */}
</div>
);
};
Ship the dashed guides only in a preview build; the final render drops them, leaving a clean plate whose right side is intentionally quiet. The outro itself can hold a static brand or loop a subtle motion for the full 20s — but nothing that competes for attention with the cards.
Reusable brand template
Both compositions read a single brand prop — no hardcoded names, colors, logos, or audio. Swap the object (or pass --props) to re-skin every channel intro/outro from one codebase.
// brand.json — the only thing that changes per channel
{ "name": "PixelForge", "logo": "logo.png", "sting": "sting.mp3",
"bg": "#0B0B14", "fg": "#FFFFFF", "accent": "#7C5CFF" }
# render intro + outro for every brand file in /brands
for f in brands/*.json; do
name=$(basename "$f" .json)
npx remotion render Intro "out/${name}-intro.mp4" --props="$f"
npx remotion render Outro "out/${name}-outro.mp4" --props="$f"
done
Keep fonts, layout, and timing fixed in the template so 20 channels stay structurally consistent and only the brand identity differs.
Output checklist
- Intro ≤5s; logo readable by ~2s; logo hit lands exactly on the audio impact frame.
- Outro is ≥20s of held layout; total video ≥25s so end-screen elements are allowed.
- Right two-thirds of the outro left quiet for YouTube's elements; own branding in the left third only.
- Nothing important within ~10% of any edge or in the bottom UI band.
- Up to 4 end-screen elements planned (1 video + subscribe is the highest-CTR layout).
- Every text/color/logo/audio comes from the
brandprop — one template, many channels.
Deliver & verify (rendered stills → MP4)
Packaged helper (
scripts/): tile your stills withscripts/contact-sheet.sh sheet.png f-hook.png f-mid.png f-end.png, then assert the encode withscripts/probe-mp4.sh out.mp4 [WxH] [fps]. Seescripts/README.md.
This is HEAVY tier: the deliverables are real MP4 plates (intro + outro). Verify the logo hit and the end-screen safe zones as stills before encoding — a sting that lands a frame off, or a logo stamped where YouTube draws its subscribe button, is expensive to discover after a full render.
Output contract:
- A Remotion project with both compositions registered (
<Composition>+ zodschema+defaultProps), all motion frame-driven — noDate.now()/Math.random()/ timers. - Sting impact baked to the frame (
IMPACT = Math.round(0.8 * fps)), not detected at runtime; audio via<Audio src={staticFile()}>so the export carries the sting. - Deliverable = the rendered
out/*-intro.mp4+out/*-outro.mp4plus the project, so the user can re-skin via thebrandprop and re-export.
Verify loop — render stills → inspect → encode.
# 1. Frame-exact stills WITH SHIPPED brand props (not just defaultProps).
# Intro: windup / impact / settle. Outro: fade-in / held end-screen plate.
npx remotion still Intro out/i-windup.png --frame=12 --props=./brand.json
npx remotion still Intro out/i-impact.png --frame=24 --props=./brand.json # = round(0.8*fps)
npx remotion still Intro out/i-settle.png --frame=40 --props=./brand.json
npx remotion still Outro out/o-end.png --frame=N --props=./brand.json
# 2. Inspect each PNG — fidelity (logo readable + captions/tagline correct; on the impact
# frame the logo is full-scale and the flash fires) AND artifacts (end-screen elements
# inside YouTube safe zones — branding in the LEFT third only, right two-thirds quiet,
# nothing within ~10% of any edge or in the bottom UI band; no off-canvas text/overflow).
# 3. Only once the stills check out, encode both plates:
npx remotion render Intro out/intro.mp4 --props=./brand.json
npx remotion render Outro out/outro.mp4 --props=./brand.json
- Verify the impact frame explicitly (logo snapped to full, white flash decaying) — the sting must land on it, not near it.
- Drop the dashed end-screen guides for the final render; verify the right two-thirds is intentionally quiet.
- README demo:
npx remotion render Intro out/demo.gif --codec=gif.
Before you finish:
npx remotion stillrenders cleanly at windup/impact/settle (intro) and the held plate (outro) — no errors, no missing logo/sting assets.- On the impact frame the logo is full-scale and legible; intro ≤5s, outro ≥20s held (video ≥25s total).
- Frame-driven only — sting impact baked to a frame; no
Date.now()/Math.random()/ timers. - End-screen elements land inside YouTube safe zones — branding in the left third, right two-thirds quiet, nothing in the bottom UI band or within ~10% of an edge.
- Both MP4s encoded with the sting muxed in and play; every text/color/logo/audio comes from the
brandprop; (optional) GIF rendered for the README.
Reference files
references/intro-outro.md— the full runnable Remotion compositions for both intro and outro, a CSS/GSAP logo-sting variant, an exact end-screen coordinate map for 16:9 and notes for 1080×1920, the method for finding an audio sting's impact frame and syncing the reveal to it, and the brand-prop schema with the batch render pipeline.
FAQ
What does the youtube-intro-outro skill do?
This skill should be used when the user asks to "make a YouTube intro", "create a channel intro", "build a logo sting/bumper", "design an outro / end screen / end card", "add subscribe and next-video cards", "make an intro animation", "build a reusable intro template", or "sync the logo reveal to an audio sting". Covers the 3-5s branded intro, the last-20s end-screen outro inside YouTube's element safe zones, timing conventions, audio-sting sync, and a swap-the-brand template.
How do I install youtube-intro-outro?
Run npx skills add https://github.com/iart-ai/youtube-video-skills --skill youtube-intro-outro in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/youtube-intro-outro/ (personal) or .claude/skills/youtube-intro-outro/ (project).
Which AI agents can use youtube-intro-outro?
Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.
Is youtube-intro-outro safe to install?
No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.
Who maintains youtube-intro-outro?
It is published by iart-ai in iart-ai/youtube-video-skills. It has 733 recorded installs.
More from iart-ai/youtube-video-skills
audiogram
iart-ai/youtube-video-skills
This skill should be used when the user asks to "make an audiogram", "turn a podcast into a video", "create a waveform video", "make a podcast clip video", "convert audio to video", "animate a waveform/audio bars", "add a moving waveform to my voiceover", or "make a square/vertical clip for a podcast quote". Covers amplitude-driven waveforms, frequency bars, synced captions, cover-art layout, a progress bar, and 1:1 / 9:16 social framing.
Popular media & creative skills
hyperframes
heygen-com/hyperframes
Read first to make, edit, animate or render any video with HyperFrames (HTML rendered to video), including launch films, explainers, music videos, charts, maps, vertical clips, title cards, captions and overlays. Holds the render contract, the work loop and what each kind of video needs.
media-use
heygen-com/hyperframes
Get or make any media for a HyperFrames video - music, sound effects, images, icons, logos, voiceover, avatar and generated video, transcripts, cutouts, colour grades and looks - with HeyGen or free local tools, and mix placed audio. Also for footage that looks dark, flat or dull, or should be stylized or hidden.
hyperframes-registry
heygen-com/hyperframes
About 450 ready-made HyperFrames blocks and components installed as editable source - transitions, overlays, titles, kinetic type, captions, charts, map overlays, 3D, camera moves. Use it before hand-building any named visual (CRT scanlines, glitch, film grain, a chart); also for hyperframes add and catalog.
hyperframes-creative
heygen-com/hyperframes
Non-animation creative direction for HyperFrames videos. Use for design spec (frame.md / design.md) handling, palettes, typography, narration, beat planning, audio-reactive visuals, composition patterns, and brand / style decisions. For atomic motion patterns and scene blueprints, use hyperframes-animation.
ai-video-generation
101-skills/superpowers
Generate AI videos with Google Veo, Seedance 2.0, HappyHorse, Wan, Grok and 40+ models via inference.sh CLI. Models: Veo 3.1, Veo 3, Seedance 2.0, HappyHorse 1.0, Wan 2.5, Grok Imagine Video, OmniHuman, Fabric, HunyuanVideo. Capabilities: text-to-video, image-to-video, reference-to-video, video editing, lipsync, avatar animation, video upscaling, foley sound. Use for: social media videos, marketing content, explainer videos, product demos, AI avatars. Triggers: video generation, ai video, text to video, image to video, veo, animate image, video from image, ai animation, video generator, generate video, t2v, i2v, ai video maker, create video with ai, runway alternative, pika alternative, sora alternative, kling alternative, seedance, happyhorse
ai-image-generation
101-skills/superpowers
Generate AI images with GPT-Image-2, FLUX, Gemini, Grok, Seedream, Reve and 50+ models via inference.sh CLI. Models: GPT-Image-2, FLUX Dev LoRA, FLUX.2 Klein LoRA, Gemini 3 Pro Image, Grok Imagine, Seedream 4.5, Reve, ImagineArt. Capabilities: text-to-image, image-to-image, inpainting, LoRA, image editing, upscaling, text rendering. Use for: AI art, product mockups, concept art, social media graphics, marketing visuals, illustrations. Triggers: flux, image generation, ai image, text to image, stable diffusion, generate image, ai art, midjourney alternative, dall-e alternative, text2img, t2i, image generator, ai picture, create image with ai, generative ai, ai illustration, grok image, gemini image, gpt image, openai image, chatgpt image