import { AbsoluteFill, OffthreadVideo, Sequence, staticFile, interpolate, spring, useCurrentFrame, useVideoConfig, } from "remotion"; import { COLORS, FONT, SPRING_CFG } from "./styles"; // ─── CONFIG ────────────────────────────────────────────────────────── const INTRO_DURATION = 3; // seconds const OUTRO_DURATION = 2; // seconds const TOTAL_DURATION = 60; // seconds (YC wants ~1 min) const TALKING_HEAD_DURATION = TOTAL_DURATION - INTRO_DURATION - OUTRO_DURATION; // ─── INTRO CARD ────────────────────────────────────────────────────── const IntroCard = () => { const frame = useCurrentFrame(); const { fps } = useVideoConfig(); const nameY = spring({ frame, fps, config: SPRING_CFG, from: 60, to: 0, delay: 0, }); const companyY = spring({ frame, fps, config: SPRING_CFG, from: 40, to: 0, delay: 5, }); const taglineOpacity = interpolate( frame, [1.5 * fps, 2 * fps], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" } ); const fadeOut = interpolate( frame, [(INTRO_DURATION - 0.4) * fps, INTRO_DURATION * fps], [1, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" } ); return ( {/* Accent glow */}
{/* Founder name */}
Garfield Heron
{/* Company name */}
SquareMCP
{/* Subtitle */}
Y Combinator Application
); }; // ─── VIDEO PLACEHOLDER (subtle frame for your recording) ───────────── const VideoFrame = ({ children }: { children?: React.ReactNode }) => { const frame = useCurrentFrame(); const { fps } = useVideoConfig(); // Fade in from intro const fadeIn = interpolate( frame, [0, 0.5 * fps], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" } ); // Fade out to outro const fadeOut = interpolate( frame, [(TALKING_HEAD_DURATION - 0.5) * fps, TALKING_HEAD_DURATION * fps], [1, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" } ); return ( {/* Corner accents */}
{/* Corner dots */} {[ { top: 16, left: 16 }, { top: 16, right: 16 }, { bottom: 16, left: 16 }, { bottom: 16, right: 16 }, ].map((pos, i) => (
))} {/* Lower third - name + company */}
Garfield Heron
Founder, SquareMCP
squaremcp.com
{/* Placeholder text (remove when you overlay your actual video) */} {!children && (
YOUR RECORDING GOES HERE
Record yourself talking, then overlay it in Remotion
)} {children} ); }; // ─── OUTRO CARD ────────────────────────────────────────────────────── const OutroCard = () => { const frame = useCurrentFrame(); const { fps } = useVideoConfig(); const outroStart = (TOTAL_DURATION - OUTRO_DURATION) * fps; const localFrame = frame - outroStart; const scale = spring({ frame: localFrame, fps, config: SPRING_CFG, from: 0.9, to: 1, }); const opacity = interpolate( localFrame, [0, 0.5 * fps], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" } ); return ( {/* Logo mark */}
SquareMCP
One API. Every Platform.
squaremcp.com
); }; // ─── MAIN COMPOSITION ──────────────────────────────────────────────── export const YCAppVideo = () => { const frame = useCurrentFrame(); const { fps } = useVideoConfig(); const showIntro = frame < INTRO_DURATION * fps; const showOutro = frame >= (TOTAL_DURATION - OUTRO_DURATION) * fps; return ( {showIntro && } {showOutro && } ); };