Back to Skills
    šŸ¦ž

    whatsapp-video-mockup

    whatsapp-video-mockup

    By @danpeg
    View on GitHub
    SKILL.md
    # WhatsApp Video Skill
    
    Create animated WhatsApp-style chat videos using Remotion. Perfect for X, TikTok, Instagram Reels.
    
    ## Features
    
    - šŸ“± Realistic iPhone frame with Dynamic Island
    - šŸ’¬ WhatsApp dark mode UI (accurate colors, bubbles, timestamps)
    - šŸ“œ Auto-scrolling as messages extend
    - šŸ”¤ Large, readable fonts (optimized for mobile viewing)
    - šŸŽµ Message notification sounds
    - ✨ Spring animations on message appearance
    - āŒØļø Typing indicator ("..." bubbles)
    - šŸ”— Link preview cards
    - āœ… Read receipts (blue checkmarks)
    - **Bold** and `code` formatting support
    
    ## Default Settings
    
    - **Aspect ratio:** 4:5 (1080Ɨ1350) - optimal for X/Instagram feed
    - **No intro/outro** - starts and ends with the chat
    - **2x fonts** - readable on mobile devices
    - **Auto-scroll** - keeps all messages visible
    
    ## Prerequisites
    
    This skill requires the **Remotion Best Practices** skill:
    
    ```bash
    npx skills add remotion-dev/skills -a claude-code -y -g
    ```
    
    ## Quick Start
    
    ```bash
    cd ~/Projects/remotion-test
    ```
    
    Edit the conversation in `src/WhatsAppVideo.tsx`, then render:
    
    ```bash
    npx remotion render WhatsAppDemo out/my-video.mp4 --concurrency=4
    ```
    
    ## How to Create a New Video
    
    ### 1. Define Your Messages
    
    Edit the `ChatMessages` component in `src/WhatsAppVideo.tsx`:
    
    ```tsx
    // Incoming message (from assistant)
    <Message
      text="Your message text here"
      isOutgoing={false}
      time="8:40 AM"
      delay={125}  // Frame when message appears (30fps)
    />
    
    // Outgoing message (from user)
    <Message
      text="Your outgoing message"
      isOutgoing={true}
      time="8:41 AM"
      delay={200}
      showCheck={true}
    />
    
    // Typing indicator (shows "..." bubbles)
    <TypingIndicator delay={80} duration={45} />
    ```
    
    ### 2. Timing Guide
    
    - **30 fps** = 30 frames per second
    - `delay={30}` = appears at 1 second
    - `delay={60}` = appears at 2 seconds
    - `duration={45}` = lasts 1.5 seconds
    
    **Typical flow:**
    1. First message: `delay={20}` (~0.7s)
    2. Typing indicator: `delay={80}`, `duration={45}`
    3. Response: `delay={125}` (after typing ends)
    4. Next typing: `delay={175}`, `duration={45}`
    5. Next response: `delay={220}`
    
    ### 3. Adjust Scrolling
    
    In `ChatMessages`, update the scroll interpolation based on your message count:
    
    ```tsx
    const scrollAmount = interpolate(
      frame,
      [scrollStart, scrollStart + 60, messageFrame, lastFrame],
      [0, firstScroll, firstScroll, finalScroll],
      { extrapolateLeft: "clamp", extrapolateRight: "clamp" }
    );
    ```
    
    Increase scroll values if messages overflow.
    
    ### 4. Text Formatting
    
    Messages support:
    - **Bold**: `**bold text**`
    - `Code`: backticks around text
    - Line breaks: `\n` in the string
    - Emojis: just use them directly šŸŽ¬
    
    ### 5. Customizing the Header
    
    In `ChatHeader` component, change:
    - Name: `Pokey 🐔` → your assistant name
    - Status: `online`
    - Avatar emoji
    
    ### 6. Update Duration
    
    In `Root.tsx`, set `durationInFrames` to match your video length:
    - Count frames until last message appears + ~100 frames buffer
    - At 30fps: 450 frames = 15 seconds
    
    ### 7. Render
    
    ```bash
    # Standard render
    npx remotion render WhatsAppDemo out/video.mp4 --concurrency=4
    
    # Higher quality
    npx remotion render WhatsAppDemo out/video.mp4 --codec h264 --crf 18
    
    # Preview in browser
    npm run dev
    ```
    
    ## Platform Dimensions
    
    Edit `Root.tsx` to change dimensions:
    
    | Platform | Dimensions | Aspect Ratio | Use Case |
    |----------|------------|--------------|----------|
    | **X/Instagram feed** | 1080Ɨ1350 | 4:5 | Default, most visible |
    | **X/TikTok/Reels** | 1080Ɨ1920 | 9:16 | Full vertical |
    | **X square** | 1080Ɨ1080 | 1:1 | Universal |
    | **YouTube/X landscape** | 1920Ɨ1080 | 16:9 | Horizontal |
    
    ## Project Structure
    
    ```
    ~/Projects/remotion-test/
    ā”œā”€ā”€ src/
    │   ā”œā”€ā”€ WhatsAppVideo.tsx   # Main video component
    │   └── Root.tsx            # Composition config
    ā”œā”€ā”€ public/
    │   └── sounds/
    │       ā”œā”€ā”€ pop.mp3         # Message received
    │       └── send.mp3        # Message sent
    └── out/                    # Rendered videos
    ```
    
    ## Sound Effects
    
    Sounds are triggered with Sequence:
    ```tsx
    <Sequence from={125}>
      <Audio src={staticFile("sounds/pop.mp3")} volume={0.5} />
    </Sequence>
    ```
    
    ## Tips
    
    1. **Preview while editing**: Run `npm run dev` to see changes live
    2. **Frame-by-frame**: Use timeline scrubber to check timing
    3. **Keep messages concise**: Long messages may need scroll adjustment
    4. **Test on mobile**: Check readability at actual size
    
    ## Asking Pokey to Generate
    
    Just describe the conversation:
    - "WhatsApp video: me asking you to [X]"
    - "Make a chat video showing [conversation]"
    
    Pokey will write the messages, set timing, render, and send the MP4.