Nutri-E Marketing Asset Creation Guide¶
Complete guide for creating marketing materials, social media content, and video assets for Nutri-E using ChatGPT with DALL-E.
Table of Contents¶
- Project Overview
- Brand Guidelines
- Key Features to Highlight
- Image Generation with DALL-E
- App Store Screenshots
- Social Media Graphics
- Video Content
- KlingAI + CapCut Workflow
- Grok Video Generation
- Educational Symptom Videos
- Messaging Guidelines
- Prohibited Content
- Quality Checklist
- File Naming Convention
- Official Links & CTAs
Project Overview¶
About Nutri-E¶
Purpose: iOS supplement tracking application Target Audience: Health-conscious individuals who take vitamins, minerals, and supplements
Key Features: - AI food scanning (GPT-4 Vision) - Dose tracking - Nutrient analysis with RDA - Schedule management - Streak tracking - NIH DSLD database integration
Tech Stack: iOS (SwiftUI), NIH DSLD database, GPT-4 Vision
Brand Mascots¶
Nutri-E Character: - Appearance: Purple/blue egg-shaped mascot with large cute eyes - Color Palette: Purple, blue, violet tones - Personality: Main character, health-focused, knowledgeable - Usage: Primary branding, app icon, product features
Cuti-E Character: - Appearance: Pink/coral egg-shaped companion mascot with large cute eyes - Color Palette: Pink, coral, soft pastels - Personality: Supportive, caring, playful, friendly - Usage: Customer support, social media engagement, community interaction - Relationship: Companion to Nutri-E, appears together in marketing materials
IMPORTANT: Both are mascot characters, NOT separate apps. Cuti-E represents the supportive, caring side of the Nutri-E ecosystem.
Reference Screenshots¶
Marketing assets should reference actual app screenshots for accurate UI representation. Use the screenshot library in the ChatGPT Project for: - Accurate UI representation - Correct color schemes - Proper feature depiction - Authentic user flows - DALL-E image generation reference
Brand Guidelines¶
Nutri-E Brand¶
Colors: Health/wellness focused (greens, blues from screenshots) Design Style: Clean, medical, professional Voice: Scientific, trustworthy, health-conscious
Nutri-E Character (Primary Mascot)¶
Colors: Purple, blue, violet Design Style: Health-focused, professional yet friendly Voice: Knowledgeable, trustworthy, empowering Usage: Main branding, app features, product demonstrations
Cuti-E Character (Companion Mascot)¶
Colors: Pink, coral, soft pastels Design Style: Friendly, approachable, playful Voice: Fun, caring, supportive Usage: Social media posts, support interactions, community engagement Character Relationship: Companion to Nutri-E, often appears together in dual-character marketing
CRITICAL: Use actual screenshots for all UI representations. Don't create mockups from scratch.
Key Features to Highlight¶
- "AI-Powered Food Analysis" - GPT-4 Vision analyzing meals
- "Smart Nutrient Tracking" - RDA progress bars
- "Never Run Out" - Stock prediction feature
- "Schedule Your Supplements" - Schedule management
- "Track Your Streaks" - Adherence monitoring
- "NIH DSLD Database" - 100,000+ supplements searchable
Image Generation with DALL-E¶
🔴 CRITICAL REQUIREMENT - READ THIS FIRST:
EVERY TIME you start a NEW ChatGPT conversation to generate Nutri-E images, you MUST: 1. Navigate to ChatGPT → Projects → "Nutri-E Brand Assets" 2. Start a NEW conversation in the project 3. IMMEDIATELY upload
website/images/nutri-e-mascot.pngas your FIRST action 4. THEN (and only then) generate imagesWHY THIS IS MANDATORY: - ChatGPT has NO memory between conversations - Without the mascot reference, generated images will have the WRONG mascot design - You will waste time and credits regenerating images - This applies to ALL image types: symptom images, social posts, marketing graphics
THIS CANNOT BE SKIPPED. UPLOAD THE MASCOT REFERENCE FIRST. EVERY. SINGLE. TIME.
ChatGPT can generate custom marketing images using DALL-E. Use this for creating unique visuals that complement app screenshots.
When to Use DALL-E¶
Good Use Cases: - Social media hero images - Educational graphics (vitamin benefits, nutrient info) - Lifestyle imagery (people taking supplements, healthy meals) - Cuti-E character illustrations - Background images for video scenes - Icon sets and visual metaphors
When to Use Screenshots Instead: - Actual app UI demonstrations - Feature showcases - App Store preview images
DALL-E Prompt Guidelines¶
Format: [Subject] + [Style] + [Composition] + [Brand elements]
Example Prompts:
"Purple egg-shaped mascot character named Nutri-E with large cute eyes,
friendly expression, holding vitamin bottles, purple and blue color palette,
3D render style, clean background, health and wellness theme"
"Pink egg-shaped mascot character named Cuti-E (companion character)
with large cute eyes, caring expression, holding a smartphone showing
a health app, pastel pink and coral color palette, 3D render style,
clean minimalist background, supportive personality"
"Modern flat illustration of vitamin bottles and fresh fruits arranged
artistically, health and wellness theme, vibrant greens and blues,
professional medical aesthetic, white background"
"Lifestyle photo of a young adult at breakfast table using smartphone
to scan vitamin bottles, natural morning light, healthy meal visible,
clean modern kitchen, photorealistic style"
Brand-Consistent Prompts¶
For Nutri-E (Professional): - Keywords: "modern", "clean", "medical", "professional", "health tech" - Colors: "greens", "blues", "white backgrounds" - Style: "minimalist", "flat design", "photorealistic"
For Cuti-E (Playful): - Keywords: "cute", "friendly", "playful", "mascot" - Colors: "pink", "pastel", "soft colors" - Style: "cartoon", "3D render", "character design"
Image Specifications¶
- Resolution: Request "high resolution" or "4K" for print quality
- Aspect Ratio: Specify dimensions (e.g., "16:9 landscape", "9:16 vertical", "1:1 square")
- Format: DALL-E outputs PNG (good for transparency)
- Iterations: Generate 2-3 variations, select best
Combining DALL-E with Screenshots¶
Layered Approach: 1. Generate background image with DALL-E (e.g., lifestyle scene) 2. Overlay app screenshot on top 3. Add text and CTA 4. Export final composite
Example Workflow:
1. DALL-E: "Modern kitchen countertop with vitamin bottles,
soft natural light, blurred background, photorealistic"
2. Add Nutri-E screenshot floating above scene
3. Add headline: "Your supplement routine, simplified"
4. Export for Instagram (1080x1080px)
App Store Screenshots¶
Dimensions: 1170x2532px (iPhone)
Requirements¶
- Use real UI from reference screenshots
- Add compelling captions overlaid on screenshots
- Don't obscure important UI elements
- Maintain brand colors
- Show features in action, not static screens
Caption Examples¶
- "See exactly how your supplements add up"
- "AI analyzes your meals in seconds"
- "Never forget a dose with smart schedules"
- "Track nutrients against your daily goals"
- "Know exactly when to reorder"
Social Media Graphics¶
Formats¶
Instagram Feed: 1080x1080px (square) Instagram Stories: 1080x1920px (vertical) Twitter Header: 1500x500px (wide)
Content Ideas¶
- Feature highlights with app screenshots
- "Did you know?" supplement facts
- User journey visualizations
- Tips for supplement adherence
- App update announcements
Always include clear call-to-action
Video Content¶
We use two main video generation tools: KlingAI (for multi-scene narratives) and Grok (for single-image educational clips).
🔐 KlingAI Authentication: Login uses Google OAuth. Use credentials from .nutrie-secrets (codiedev42@gmail.com). Navigate to https://app.klingai.com and click "Continue with Google".
VIDEO COMPILATION: Use FFmpeg for automated video compilation. See /Users/post/Library/CloudStorage/GoogleDrive-codiedev42@gmail.com/My Drive/Nutri-E Marketing/Social Media Posts/TikTok/FFMPEG_VIDEO_AUTOMATION.md for complete guide.
FFmpeg Automated Workflow (RECOMMENDED)¶
Why FFmpeg over CapCut: - ✅ Fully automatable via command line (no browser UI) - ✅ Fast and reliable (seconds vs minutes) - ✅ Perfect for batch processing - ✅ Consistent output quality
Standard Video Structure: 1. Intro (5s) - "LOOK HERE!" hook with pointing gesture 2. Content (20-25s) - Educational symptom clips (4-6 videos × 5s each) 3. CTA/Outro (3-5s) - App promotion ending
CTA Ending Location (use in ALL educational videos):
/Users/post/Library/CloudStorage/GoogleDrive-codiedev42@gmail.com/
My Drive/Nutri-E Marketing/Social Media Posts/TikTok/Educational/
Vitamin-C/App-Promotion/track-vitamins-smarter-cta.mov
Quick Compilation Steps:
# 1. Copy CTA ending to project folder
cp "/path/to/track-vitamins-smarter-cta.mov" ./app-cta-ending.mov
# 2. Create concat_list.txt with all clips in order
cat > concat_list.txt << 'EOF'
file 'intro-video.mp4'
file 'symptom-1.mp4'
file 'symptom-2.mp4'
file 'symptom-3.mp4'
file 'app-cta-ending.mov'
EOF
# 3. Pre-compilation validation (CRITICAL - prevents missing clips)
# Step 3a: Validate concat list syntax
cat concat_list.txt
# Ensure:
# - All files use "file 'filename.mp4'" format (with quotes)
# - No typos in filenames
# - All files exist in current directory (or use absolute paths)
# Step 3b: Validate all files have matching resolutions
echo "=== Checking resolutions ==="
for file in intro.mp4 clip1.mp4 clip2.mp4 bumper.mp4 cta.mp4; do
res=$(ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 "$file" 2>/dev/null || echo "FILE NOT FOUND")
printf "%-30s %s\n" "$file:" "$res"
done
# Expected: All clips should have SAME resolution (e.g., 1176x1764)
# If bumper/CTA have different resolution (e.g., 464x688), rescale them:
ffmpeg -i bumper.mp4 -vf "scale=1176:1764:force_original_aspect_ratio=decrease,pad=1176:1764:(ow-iw)/2:(oh-ih)/2" \
-c:v libx264 -preset fast -crf 23 -c:a aac -b:a 192k bumper-rescaled.mp4 -y
# Then update concat_list.txt to use bumper-rescaled.mp4
# Step 3c: Validate individual clip durations
echo "=== Individual Clip Durations ==="
for file in intro.mp4 clip1.mp4 clip2.mp4 bumper-rescaled.mp4 cta-rescaled.mp4; do
duration=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$file" 2>/dev/null || echo "0")
printf "%-30s %.6f seconds\n" "$file:" "$duration"
done
# 4. Compile with FFmpeg
# METHOD 1: Concat demuxer (fast but requires matching formats)
ffmpeg -f concat -safe 0 -i concat_list.txt \
-c:v libx264 -preset fast -crf 23 \
-c:a aac -b:a 192k \
final-compilation.mp4 -y
# METHOD 2: Filter complex (more robust, handles resolution mismatches)
# Use this if concat demuxer drops clips due to format differences
ffmpeg \
-i intro.mp4 \
-i clip1.mp4 \
-i clip2.mp4 \
-i bumper-rescaled.mp4 \
-i cta-rescaled.mp4 \
-filter_complex "[0:v][0:a][1:v][1:a][2:v][2:a][3:v][3:a][4:v][4:a]concat=n=5:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" \
-c:v libx264 -preset fast -crf 23 -c:a aac -b:a 192k \
final-compilation.mp4 -y
# 5. Post-compilation validation (CRITICAL - confirms all clips present)
# Step 5a: Check video duration matches expected total
expected_duration=$(echo "5.085 + 5.062 + 5.062 + 5.062 + 5.062 + 5.062 + 6.042 + 6.042" | bc)
actual_duration=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 final-compilation.mp4)
echo "Expected: ${expected_duration}s | Actual: ${actual_duration}s"
# Step 5b: Validate audio/video streams match
ffprobe -v error -show_entries stream=codec_type,duration -of default=noprint_wrappers=1 final-compilation.mp4
# Both streams should show SAME duration (no mismatch like 130s video / 41s audio)
# Step 5c: Verify all clips are present (durations sum correctly)
cat > validate-clips.sh << 'VALIDATE_EOF'
#!/bin/bash
echo "=== Individual Clip Durations ==="
clips=(
"intro-video.mp4"
"symptom-1.mp4"
"symptom-2.mp4"
"symptom-3.mp4"
"app-cta-ending.mov"
)
for file in "${clips[@]}"; do
duration=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$file")
printf "%-30s %s seconds\n" "$file:" "$duration"
done
echo ""
final=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 final-compilation.mp4)
echo "Final video: $final seconds"
VALIDATE_EOF
chmod +x validate-clips.sh && ./validate-clips.sh
# Step 5d: Visual verification (extract frame from each clip position)
# CRITICAL: Extract frames at bumper and CTA timestamps to verify they're present
# Example for 8-clip video (intro + 5 symptoms + bumper + CTA):
ffmpeg -ss 2.5 -i final-compilation.mp4 -vframes 1 verify-intro.png -y
ffmpeg -ss 8 -i final-compilation.mp4 -vframes 1 verify-symptom-1.png -y
ffmpeg -ss 13 -i final-compilation.mp4 -vframes 1 verify-symptom-2.png -y
ffmpeg -ss 18 -i final-compilation.mp4 -vframes 1 verify-symptom-3.png -y
ffmpeg -ss 23 -i final-compilation.mp4 -vframes 1 verify-symptom-4.png -y
ffmpeg -ss 28 -i final-compilation.mp4 -vframes 1 verify-symptom-5.png -y
ffmpeg -ss 33 -i final-compilation.mp4 -vframes 1 verify-bumper.png -y # Should show "NUTRI-E PRODUCTIONS"
ffmpeg -ss 39 -i final-compilation.mp4 -vframes 1 verify-cta.png -y # Should show app CTA
# Visually confirm each clip appears in the final video
# If bumper/CTA frames show symptom clips instead, clips were dropped during compilation!
# Expected behavior:
# - Video and audio durations should match (no mismatch)
# - Total duration equals sum of individual clip durations (±0.1s)
# - Each clip's frame is visually present at expected timestamp
# - Bumper shows "NUTRI-E PRODUCTIONS" logo
# - CTA shows app download message
# Common issues:
# - If duration is SHORT (e.g., 30s instead of 42s): Clips were dropped due to resolution mismatch
# → Solution: Rescale bumper/CTA to match symptom clip resolution (Step 3b)
# - If video 130s but audio 41s: Timestamp errors from stream copy
# → Solution: Re-encode with `-c:v libx264` instead of `-c copy`
Example: Vitamin D compilation (Oct 26, 2025) - 8 clips total (intro + 6 symptoms + bumper + CTA) - Initial issue: Bumper and CTA were dropped (video only 30.4s instead of 42.5s) - Root cause: Resolution mismatch (symptom clips 1176×1764, bumper/CTA 464×688) - Solution: Rescaled bumper/CTA to 1176×1764, used filter_complex concat - Final output: 15.9MB, 42.46 seconds, 1176×1764 - Compilation time: ~7.6 seconds with filter_complex
Common Issue - Mismatched Durations:
# Problem: Video shows 130s but audio only 41s
# Cause: ffmpeg -c copy creates timestamp errors with some clips
# Solution: Re-encode instead of stream copy
ffmpeg -f concat -safe 0 -i concat_list.txt \
-c:v libx264 -preset fast -crf 23 \
-c:a aac -b:a 192k \
final-compilation.mp4 -y
# Validation confirms fix: Both streams now 41.5s
Intro Video Creation (Vitamin/Nutrient Educational Series)¶
Purpose: Attention-grabbing 5-second hook for vitamin/nutrient symptom compilations
Reference Videos:
- Vitamin C Intro: /Users/post/Library/CloudStorage/GoogleDrive-codiedev42@gmail.com/My Drive/Nutri-E Marketing/Social Media Posts/TikTok/Educational/Vitamin-C/vitamin-c-please-stop-scrolling.mp4
CRITICAL Requirements:
- First Frame Format:
- Must match Vitamin C intro first frame style EXACTLY
- Replace "VITAMIN C" text with current vitamin/nutrient name (e.g., "VITAMIN D", "MAGNESIUM", "IRON")
- Keep all other elements: Nutri-E character, sign with "PLEASE STOP SCROLLING", orange background
-
Use Vitamin C first frame as reference when prompting ChatGPT
-
Last Frame Format:
- Must match Vitamin C intro last frame style EXACTLY
- Replace "VITAMIN C" text with current vitamin/nutrient name
- Keep all other elements consistent with Vitamin C style
-
Use Vitamin C last frame as reference when prompting ChatGPT
-
Duration: 5 seconds (same as Vitamin C)
-
Video Generation Workflow:
# Step 1: Generate first and last frame images in ChatGPT # Use Vitamin C intro frames as visual reference # Prompt example: "Create an image matching this reference exactly, but replace 'VITAMIN C' text with 'VITAMIN D'. Keep the same composition, character pose, background color, and sign design." # Step 2: Upload BOTH frames (start + end) to KlingAI # ALWAYS use HIGHEST available model with start + end frame support: # - VIDEO 2.1 Master (best dynamics + prompt adherence, ~35 credits) # - VIDEO 2.1 (good value, ~30 credits) # - VIDEO 1.6 (fallback, 35 credits) # Do NOT use VIDEO 2.5 Turbo (only supports single start frame) # Step 3: Creative video prompt (attention-grabbing motion) # Examples: - "Nutri-E character bounces excitedly, sign pulses and glows, camera zooms in slightly, energetic attention-grabbing hook, 5 seconds, vertical video" - "Character waves enthusiastically, sign shakes to draw attention, background subtly animates, playful high-energy intro, 5 seconds" - "Character jumps into frame holding sign, sign flashes urgently, dramatic zoom effect, scroll-stopping hook, 5 seconds, 9:16 format" # Step 4: TWO SEPARATE ChatGPT REQUESTS (CRITICAL FOR BRAND CONSISTENCY) # IMPORTANT: Generate first and last frames in SEPARATE conversations # This ensures proper validation at each step and maintains Nutri-E brand consistency ## Request #1: Generate FIRST Frame # 1. Start NEW conversation in Nutri-E Brand Assets ChatGPT project # 2. Upload ONLY the reference FIRST frame (e.g., Vitamin D first frame with "PLEASE STOP SCROLLING") # 3. Use this prompt: "CRITICAL: Study the uploaded reference image VERY CAREFULLY to match the EXACT Nutri-E brand style. Please generate ONE image - the FIRST FRAME for [VITAMIN NAME] intro: Match the uploaded image EXACTLY, but replace '[PREVIOUS VITAMIN]' text with '[NEW VITAMIN]': - Keep EXACT same Nutri-E character pose and expression - Keep EXACT same orange/yellow gradient background - Keep EXACT same 'PLEASE STOP SCROLLING' sign (don't change this text) - Keep EXACT same character size and positioning - ONLY change the nutrient name AT THE TOP OF THE IMAGE (the large text above the character, positioned at top center): '[PREVIOUS VITAMIN]' → '[NEW VITAMIN]' Format: Vertical 9:16 ratio (attempt 1176×1764 pixels if possible, but I understand DALL-E may default to 1024×1536) The goal is that this [NEW VITAMIN] first frame should look IDENTICAL to the reference except for the vitamin letter change." # 4. Download and validate the generated FIRST frame # 5. Check resolution: sips -g pixelWidth -g pixelHeight first-frame.png # 6. Visually compare with reference to ensure brand consistency ## Request #2: Generate LAST Frame (SEPARATE CONVERSATION) # 1. Start ANOTHER NEW conversation in Nutri-E Brand Assets ChatGPT project # 2. Upload ONLY the reference LAST frame (e.g., Vitamin D last frame with "LOOK AT THIS") # 3. Use this prompt: "CRITICAL: Study the uploaded reference image VERY CAREFULLY to match the EXACT Nutri-E brand style. Please generate ONE image - the LAST FRAME for [VITAMIN NAME] intro: Match the uploaded image EXACTLY, but replace '[PREVIOUS VITAMIN]' text with '[NEW VITAMIN]': - Keep EXACT same Nutri-E character pose and expression - Keep EXACT same orange/yellow gradient background - Keep EXACT same 'LOOK AT THIS' sign (don't change this text) - Keep EXACT same character size and positioning - ONLY change the nutrient name AT THE TOP OF THE IMAGE (the large text above the character, positioned at top center): '[PREVIOUS VITAMIN]' → '[NEW VITAMIN]' Format: Vertical 9:16 ratio (attempt 1176×1764 pixels if possible, but I understand DALL-E may default to 1024×1536) The goal is that this [NEW VITAMIN] last frame should look IDENTICAL to the reference except for the vitamin letter change." # 4. Download and validate the generated LAST frame # 5. Check resolution: sips -g pixelWidth -g pixelHeight last-frame.png # 6. Visually compare with reference to ensure brand consistency ## Why Two Separate Requests? # - Ensures validation at each step (first frame, then last frame) # - Prevents uploading wrong frames to KlingAI # - Maintains clarity: one reference image = one generated image # - Easier to track which frame is being generated # - Allows independent validation of brand consistency for each frame ## Common Mistakes to Avoid: # ❌ DON'T generate both frames in a single request # ❌ DON'T upload both reference frames at once # ❌ DON'T skip validation before uploading to KlingAI # ✅ DO use separate conversations for each frame # ✅ DO validate resolution and style after each generation # ✅ DO save frames with clear names (vitamin-a-first-frame.png, vitamin-a-last-frame.png) ## Step 4b: CRITICAL VALIDATION BEFORE KLINGAI UPLOAD (MANDATORY) # BEFORE uploading to KlingAI, ALWAYS validate both frames with Read tool: # First Frame Checklist: # ✅ "VITAMIN [X]" text visible at top (clear, not cut off) # ✅ Nutri-E character present (purple, correct style) # ✅ Sign shows COMPLETE "PLEASE STOP SCROLLING" text (all words visible) # ✅ Orange/yellow gradient background # ✅ No fading, incomplete text, or cut-off elements # Last Frame Checklist: # ✅ "VITAMIN [X]" text visible at top # ✅ Nutri-E character present with correct pose # ✅ Sign shows COMPLETE "LOOK AT THIS" text (all words visible) # ✅ Character holding sign with both hands visible # ✅ Orange/yellow gradient background # **If EITHER frame fails validation:** # 1. STOP - Do NOT upload to KlingAI # 2. Regenerate the failed frame in ChatGPT with corrected prompt # 3. Emphasize in prompt: "Ensure ALL sign text is fully visible and legible" # 4. Re-validate with Read tool # 5. Only proceed when BOTH frames pass all checks # Common Issues to Catch: # ❌ Sign text cut off or faded (e.g., "PLEASE" only, missing "STOP SCROLLING") # ❌ Vitamin name partially obscured # ❌ Character pose doesn't match reference # ❌ Wrong background color # Why This Matters: # - KlingAI video generation costs ~35 credits per video # - Using bad frames wastes credits and time (5+ minutes per generation) # - Final video will have incomplete text throughout # - Must regenerate entire intro video if frames are bad # Step 5: Upload both validated frames to KlingAI VIDEO 2.1 # (After BOTH frames pass Step 4b validation) # Step 6: Download and validate final video (CRITICAL) # Extract first frame ffmpeg -i intro-video.mp4 -vf "select='eq(n\,0)'" -vframes 1 /tmp/first-frame.png -y # Extract last frame ffmpeg -sseof -1 -i intro-video.mp4 -vframes 1 /tmp/last-frame.png -y # Validate duration and frames duration=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 intro-video.mp4) echo "Duration: ${duration}s (should be ~5s)" # Visually confirm: # - First frame shows "PLEASE STOP SCROLLING" # - Last frame shows "LOOK AT THIS" (or matches reference last frame) # - Duration is approximately 5 seconds # - Both frames match reference vitamin style -
File Naming:
- Format:
{vitamin-name}-intro-please-stop-scrolling.mp4 -
Examples:
vitamin-d-intro-please-stop-scrolling.mp4,magnesium-intro-please-stop-scrolling.mp4 -
Quality Control:
- ✅ First frame shows correct vitamin/nutrient name
- ✅ Last frame matches Vitamin C style (e.g., "LOOK AT THIS")
- ✅ Style matches Vitamin C intro exactly (character, composition, colors)
- ✅ Duration validation:
ffprobeconfirms ~5 seconds (not 130s!) - ✅ Audio/video sync: Both streams have matching durations
- ✅ Motion is attention-grabbing and energetic
- ✅ Text is readable and prominent
- ✅ Video resolution matches symptom clips (1176×1764 recommended)
Why This Matters: - Consistent branding across all vitamin/nutrient series - Proven attention-grabbing format from Vitamin C success - Easy for users to recognize the series - Professional, cohesive marketing presence
Completed Educational Video Compilations¶
Status Tracking (Last updated: Oct 27, 2025)
| Vitamin/Nutrient | Status | Duration | Clips | Location | Notes |
|---|---|---|---|---|---|
| Vitamin C | ✅ Complete | 35.5s | 7 | Vitamin-C/vitamin-c-FINAL.mp4 |
Original template video |
| Vitamin D | ✅ Complete | 42.5s | 8 | Vitamin-D/videos/vitamin-d-FINAL.mp4 |
Intro + 6 symptoms + bumper + CTA |
| Vitamin A | ✅ Complete | 47.7s | 9 | Vitamin-A/vitamin-a-deficiency-6-symptoms-tiktok.mp4 |
Intro + 6 deficiency symptoms + bumper + CTA. Validated Oct 26, 2025 |
| Vitamin E | ✅ Complete | 47.6s | 9 | Vitamin-E/vitamin-e-deficiency-6-symptoms-tiktok.mp4 |
Intro + 6 deficiency symptoms + bumper + CTA. Playwright automation. Oct 27, 2025 |
| Vitamin B12 | 📋 Planned | - | - | - | - |
| Iron | 📋 Planned | - | - | - | - |
| Calcium | 📋 Planned | - | - | - | - |
| Magnesium | 📋 Planned | - | - | - | - |
Vitamin D Details (Oct 26, 2025): - Content: 1 intro + 3 deficiency symptoms + 3 overdose symptoms + bumper + CTA - Symptoms Covered: - Deficiency: Bone pain, muscle weakness, confusion/brain fog - Overdose: Excessive thirst, nausea/vomiting, kidney problems - Resolution: 1176×1764 (9:16 vertical) - File Size: 15.9MB - Key Learning: Resolution mismatch caused bumper/CTA to be dropped initially; solved by rescaling to match symptom clips
Vitamin E Details (Oct 27, 2025):
- Content: 1 intro + 6 deficiency symptoms + bumper + CTA
- Symptoms Covered: Nerve damage, coordination problems, muscle weakness, vision problems, bleeding risk, heart failure
- Resolution: 1176×1764 (9:16 vertical)
- File Size: 15MB
- Automation: 100% Playwright automation (image generation, video creation, downloads)
- Key Learning: Some KlingAI videos lack audio tracks - add silent audio before concatenation with: ffmpeg -i input.mp4 -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100 -c:v copy -c:a aac -shortest output.mp4
- Success Factor: Playwright persistence - kept trying upload interface until it worked (Frame Mode → Click upload area)
Vitamin C Details (Template): - Content: 1 intro + 5 symptom clips + CTA - Resolution: 1176×1764 (9:16 vertical) - Established Style: "PLEASE STOP SCROLLING" → "LOOK AT THIS" transition - Reference: Used as template for all subsequent vitamin videos
Next Video Priority: Vitamin B12 (continuing vitamin series)
KlingAI + CapCut Workflow (Manual Editing Only)¶
Use Case: App feature showcases, user journey narratives, product demos Format: Vertical 9:16 (1080x1920px) Platform: TikTok, Snapchat, Instagram Reels
6-Second Scene Format¶
Each scene requires: 1. Start Image: Description or screenshot reference 2. End Image: Description (becomes next scene's start) 3. Visual Prompt: What happens during 6 seconds 4. Sound Prompt: Audio description (music, voice, SFX)
Example Scene Chain (30-second video = 5 scenes)¶
Scene 1 (0-6s): - Start: Nutri-E app icon - End: Today dashboard appearing - Visual: "App icon expands smoothly to reveal Today tab" - Sound: "Upbeat tech startup, subtle whoosh"
Scene 2 (6-12s): - Start: Today dashboard - End: AI analyzing food photo - Visual: "Hand holds phone scanning meal, AI processing animation" - Sound: "Camera click, processing beep"
Scene 3 (12-18s): - Start: AI results screen - End: Nutrient progress bars filling - Visual: "Nutrients extracted from meal, RDA bars animate upward" - Sound: "Success chime, soft background music"
Scene 4 (18-24s): - Start: Nutrient tracking view - End: Schedule reminder notification - Visual: "Scrolling through daily nutrients, notification appears" - Sound: "Notification sound, gentle alert"
Scene 5 (24-30s): - Start: Schedule screen - End: App icon with "Download Now" text - Visual: "Schedule view zooms out to app icon, CTA appears" - Sound: "Upbeat outro music, voiceover: 'Get Nutri-E today'"
CapCut Assembly¶
- Import all 6s clips in order
- Add transitions between scenes (0.5s crossfade recommended)
- Add text overlays/captions for mobile viewing
- Add background music track
- Final export: 9:16 vertical (1080x1920px)
Grok Video Generation¶
Use Case: Educational content, single-concept videos, symptom awareness Format: 6-second clips with only first image + prompt (no end image needed) Platform: TikTok, Snapchat, Instagram Stories/Reels
Workflow¶
- Generate start image with DALL-E or select from library
- Write visual prompt describing the 6-second action
- Submit to Grok - Grok animates the single image
- Add text overlay in CapCut for context
- Export vertical 9:16 format
Why Grok vs KlingAI?¶
| Feature | KlingAI | Grok |
|---|---|---|
| Input | Start + End images | Single image only |
| Best For | Multi-scene stories | Single concepts |
| Control | High (scene chaining) | Simpler, faster |
| Use Case | App demos | Educational clips |
Educational Symptom Videos¶
🔴 AUTOMATION REQUIREMENT: ALL tasks MUST be fully automated - NO manual user intervention allowed Content Strategy: Create 1 video per vitamin/nutrient symptom (deficiency or excess) Tool: KlingAI for video generation (image-to-video) Goal: Educational awareness to drive app downloads
🔴 CRITICAL: ALL symptom images MUST be generated in the Nutri-E Brand Assets ChatGPT project - URL: https://chatgpt.com/g/g-p-68fcac3259e881918c75f86c0522f88d - WHY: This project has the consistent Nutri-E mascot character reference to show the character experiencing symptoms
Symptom Image Requirements: - MUST show Nutri-E mascot character experiencing the symptom - Character with skin rash (for B3 deficiency) - Character looking fatigued (for fatigue symptoms) - Character holding stomach (for digestive issues) - Character looking sad/depressed (for depression symptoms) - Character holding head (for memory loss/headache symptoms) - Include text overlay: "Low [Vitamin Name]" or "[Vitamin Name] Deficiency" - Include NIH citation: "Source: NIH Office of Dietary Supplements"
⚠️ PRE-GENERATION CHECKLIST (Complete BEFORE starting): - ✅ Opened ChatGPT and navigated to Nutri-E Brand Assets project (https://chatgpt.com/g/g-p-68fcac3259e881918c75f86c0522f88d) - ✅ Started NEW conversation within the project - ✅ Have Nutri-E mascot reference ready to upload (will be in conversation history) - ✅ Researched symptom from NIH/approved source - ✅ Documented source URL and exact quote - ✅ Have 4-line text format ready (VITAMIN [X] DEFICIENCY/EXCESS header)
Google Drive Folder Structure¶
📁 REQUIRED FOLDER ORGANIZATION:
/Google Drive/Nutri-E Marketing/Social Media Posts/TikTok/Educational/
├── Vitamin-[X]/ # One folder per vitamin/nutrient
│ ├── Images/ # All generated images from ChatGPT
│ │ ├── symptom-1-skin-rash.png
│ │ ├── symptom-2-fatigue.png
│ │ └── ...
│ ├── Videos/ # Individual symptom videos from KlingAI
│ │ ├── deficiency-skin-rash.mp4
│ │ ├── deficiency-fatigue.mp4
│ │ └── ...
│ ├── frames/ # Extracted frames for verification
│ │ ├── skin-rash-frame-0s.png
│ │ ├── skin-rash-frame-2.5s.png
│ │ ├── skin-rash-frame-5s.png
│ │ └── ...
│ ├── Full-Compilation/ # Final compiled videos
│ │ └── vitamin-[x]-compilation-final.mp4
│ ├── NIH_SOURCE_DATA.md # All NIH citations and quotes
│ ├── CONTENT_STRATEGY.md # Planning doc
│ └── README.md # Overview and notes
Example for Vitamin B3:
/Vitamin-B3/
├── Images/
│ ├── vitamin-b3-skin-rash.png
│ ├── vitamin-b3-fatigue.png
│ ├── vitamin-b3-digestive.png
│ ├── vitamin-b3-depression.png
│ ├── vitamin-b3-memory-loss.png
│ └── vitamin-b3-headache.png
├── Videos/
│ └── (KlingAI generated videos)
└── NIH_SOURCE_DATA.md
Symptom Video Format¶
Template: 1. DALL-E Image: Visual representation of symptom (MUST use Nutri-E Brand Assets project) 2. KlingAI Video: 5-second animation with static camera 3. Text Overlay: Symptom name + "Track with Nutri-E" 4. CTA: "Download now" or "Learn more"
Example Videos¶
Vitamin D Deficiency: Fatigue
DALL-E Prompt:
"Person sitting at desk looking exhausted, holding their head,
soft dramatic lighting, health illustration style, muted colors"
Grok Prompt:
"Person slowly slumps forward, rubbing temples, looking increasingly tired,
subtle movement, 6 seconds, realistic motion"
Text Overlay:
"Constant fatigue?"
"Could be Vitamin D deficiency"
"Track your intake with Nutri-E"
CTA: "Download now → nutrieapp.com"
Vitamin C Deficiency: Weak Immunity
DALL-E Prompt:
"Person sneezing with tissues scattered around, cozy home setting,
soft natural light, health awareness illustration"
Grok Prompt:
"Person sneezes repeatedly, reaches for tissues, gentle head movement,
6 seconds, natural motion"
Text Overlay:
"Getting sick often?"
"Your Vitamin C might be low"
"Track nutrients with Nutri-E"
CTA: "Start tracking → nutrieapp.com"
Iron Deficiency: Pale Skin
DALL-E Prompt:
"Close-up of person's face looking pale and tired, mirror reflection,
bathroom setting, soft lighting, health awareness style"
Grok Prompt:
"Person examines face in mirror, touches cheek, concerned expression,
subtle head movement, 6 seconds"
Text Overlay:
"Looking pale lately?"
"Could be iron deficiency"
"Monitor your levels with Nutri-E"
CTA: "Get Nutri-E today"
Vitamin A Excess: Vision Problems
DALL-E Prompt:
"Person squinting at phone screen, rubbing eyes in discomfort,
dim office lighting, health warning style"
Grok Prompt:
"Person squints, blinks hard, rubs eyes in discomfort,
camera slowly zooms in on face, 6 seconds"
Text Overlay:
"Blurry vision?"
"Too much Vitamin A can cause this"
"Track your max intake with Nutri-E"
CTA: "Stay safe → nutrieapp.com"
Common Symptoms to Cover¶
Deficiencies: - Vitamin D: Fatigue, bone pain, muscle weakness - Vitamin B12: Numbness, memory problems, fatigue - Vitamin C: Weak immunity, slow wound healing - Iron: Pale skin, shortness of breath, dizziness - Calcium: Weak bones, muscle cramps - Magnesium: Muscle twitches, anxiety, insomnia
Excess (Toxicity): - Vitamin A: Vision problems, headaches, nausea - Vitamin E: Bleeding risk, nausea - Iron: Stomach pain, constipation - Calcium: Kidney stones, constipation
Symptom Video Best Practices¶
- Focus on relatable symptoms - Choose common, everyday experiences
- Avoid medical diagnosis language - Use "could be" not "is caused by"
- Always include app CTA - Drive downloads
- One symptom per video - Keep it simple and focused
- Use empathetic tone - "Struggling with X?" not "You have X"
- Batch production - Create 5-10 videos at once for consistency
- CRITICAL: Include source citations - ALL symptom information MUST include credible source attribution
Source Citation Requirements (CRITICAL FOR LEGAL COMPLIANCE)¶
⚠️ MANDATORY: All symptom information in educational videos MUST include proper source citations.
Why This Matters: - Legal compliance - health claims require credible backing - Builds trust and credibility with audience - Protects against misinformation lawsuits - Demonstrates professional, science-based approach
🔴 ABSOLUTE REQUIREMENT: NIH OFFICE OF DIETARY SUPPLEMENTS CONSUMER FACTSHEETS ONLY
ONLY Approved Source: 1. NIH Office of Dietary Supplements - CONSUMER Factsheets - Primary Source (USE THIS): Consumer factsheets at https://ods.od.nih.gov/factsheets/list-all/ - Format: https://ods.od.nih.gov/factsheets/[NutrientName]-Consumer/ - Examples: - Iron: https://ods.od.nih.gov/factsheets/Iron-Consumer/ - Vitamin B12: https://ods.od.nih.gov/factsheets/VitaminB12-Consumer/ - Vitamin D: https://ods.od.nih.gov/factsheets/VitaminD-Consumer/ - Professional versions: Use only for additional context, NOT as primary symptom source - DSLD Database: https://dsld.od.nih.gov/ (for supplement information only)
❌ DO NOT USE any other sources including: - ❌ Mayo Clinic - ❌ Harvard Health Publishing - ❌ Cleveland Clinic - ❌ WebMD or commercial health sites - ❌ Peer-reviewed journals (unless specifically approved) - ❌ FDA general content - ❌ Wikipedia or general reference sites
Why NIH Only: - Government-backed authority - Most legally defensible source - Consistent citation format across all videos - No commercial bias - Comprehensive coverage of all nutrients
MANDATORY Citation Format for Symptom Images:
NO OTHER CITATION FORMATS PERMITTED
Symptom Generation Workflow (UPDATED):
⚠️ ABSOLUTE RULE: EVERY symptom MUST be researched and validated from approved sources BEFORE image generation. NO EXCEPTIONS.
🔴 CRITICAL: ALWAYS USE NUTRI-E BRAND ASSETS PROJECT
BEFORE generating ANY symptom images:
1. Navigate to ChatGPT
2. Click on "Projects" in sidebar
3. Select "Nutri-E Brand Assets" project
4. Start NEW conversation within the project
5. 🔴 MANDATORY FIRST STEP: Upload Nutri-E mascot reference image
- CRITICAL: This MUST be done at the START of EVERY new ChatGPT conversation
- File location: website/images/nutri-e-mascot.png
- Why: ChatGPT has NO memory of the mascot from previous conversations
- Without this: Generated images will NOT match Nutri-E brand style
- DO THIS FIRST: Before typing any prompts or generating any images
6. Generate symptom image AFTER mascot reference is uploaded
❌ NEVER generate symptom images in: - Regular ChatGPT conversations (outside project) - Random new chats without project context - Different projects
✅ ALWAYS generate in Nutri-E Brand Assets project for: - Brand consistency across all assets - Access to all reference images - Proper organization of vitamin content - Project-specific context and style
For EACH symptom:
- Research symptom FIRST using NIH ODS Consumer factsheet ONLY
- 🔴 CRITICAL: Use CONSUMER factsheet (URL format: https://ods.od.nih.gov/factsheets/[Nutrient]-Consumer/)
- Example URLs:
- Iron: https://ods.od.nih.gov/factsheets/Iron-Consumer/
- Vitamin B12: https://ods.od.nih.gov/factsheets/VitaminB12-Consumer/
- Vitamin D: https://ods.od.nih.gov/factsheets/VitaminD-Consumer/
- Do NOT proceed without finding symptom in NIH ODS Consumer factsheet
- Do NOT use symptoms from memory or assumptions
- Do NOT use Professional factsheets as primary source
- Do NOT use any other sources (Mayo Clinic, WebMD, etc.)
- Document source URL (Consumer factsheet) and exact quote from source
- Verify symptom is actually stated in source (not implied or inferred)
- START NEW CONVERSATION in Nutri-E Brand Assets project (CRITICAL)
- 🔴 UPLOAD NUTRI-E MASCOT REFERENCE IMAGE FIRST (MANDATORY - CANNOT SKIP)
- File:
website/images/nutri-e-mascot.png - Timing: IMMEDIATELY after starting new conversation, BEFORE any prompts
- Reason: ChatGPT forgets mascot design between conversations
- Result if skipped: Generated images will have WRONG mascot design
- Generate image with symptom information + source citation (AFTER mascot upload)
- Add source citation in image text overlay (bottom, small font)
- Validate that citation is legible and accurate
- Archive source URL (Consumer factsheet) in project documentation
REPEAT for every symptom - Do NOT batch generate without individual source validation
CRITICAL Image Text Requirements (ALL symptom images MUST include):
4-Line Text Overlay Format:
LINE 1 (Very top, medium font): "VITAMIN [NAME] DEFICIENCY" or "VITAMIN [NAME] EXCESS"
LINE 2 (Top, large bold): "[SYMPTOM NAME]"
LINE 3 (Middle, medium): "[Brief description]"
LINE 4 (Bottom, small, legible): "Source: NIH Office of Dietary Supplements"
Why This Matters: - ✅ Clarifies which vitamin/nutrient the symptom relates to - ✅ Distinguishes deficiency vs excess (too little vs too much) - ✅ Educational value - viewers learn what nutrient is involved - ✅ Brand consistency - all symptom videos follow same format - ✅ Source credibility - builds trust with citations
Example - Vitamin A Deficiency: Night Blindness:
Research:
- Source: NIH Office of Dietary Supplements
- URL: https://ods.od.nih.gov/factsheets/VitaminA-HealthProfessional/
- Fact: "Night blindness is one of the first signs of vitamin A deficiency"
Image Text Overlay (4 lines):
LINE 1: "VITAMIN A DEFICIENCY"
LINE 2: "NIGHT BLINDNESS"
LINE 3: "Hard to see in low light"
LINE 4: "Source: NIH Office of Dietary Supplements"
Example - Vitamin D Excess: Kidney Problems:
Research:
- Source: NIH Office of Dietary Supplements
- URL: https://ods.od.nih.gov/factsheets/VitaminD-HealthProfessional/
- Fact: "Excess vitamin D can cause kidney damage"
Image Text Overlay (4 lines):
LINE 1: "VITAMIN D EXCESS"
LINE 2: "KIDNEY PROBLEMS"
LINE 3: "Too much can damage kidneys"
LINE 4: "Source: NIH Office of Dietary Supplements"
Validation Checklist Before Publishing: - ✅ LINE 1 present: "VITAMIN [NAME] DEFICIENCY" or "VITAMIN [NAME] EXCESS" at very top - ✅ LINE 2 present: Symptom name in large bold font - ✅ LINE 3 present: Brief symptom description - ✅ LINE 4 present: Source citation at bottom (small, legible) - ✅ Vitamin/nutrient name visible: Clearly identifies which nutrient - ✅ Deficiency vs Excess clarified: States "DEFICIENCY" or "EXCESS" - ✅ Symptom information is accurate per NIH ODS factsheet - ✅ Source is ONLY NIH Office of Dietary Supplements (no other sources permitted) - ✅ Citation is visible and legible in image - ✅ NIH ODS source URL is archived in project docs - ✅ No exaggerated or unsupported claims - ✅ Character design matches Nutri-E brand style - ✅ Background color appropriate for nutrient theme - ✅ Text is readable with dark outline/shadow for contrast
NEVER: - ❌ Use ANY symptom without validating it from NIH ODS FIRST - ❌ Use symptoms from non-NIH sources (Mayo Clinic, WebMD, blogs, social media, commercial sites) - ❌ Use symptoms from memory or assumptions (ALWAYS research NIH ODS first) - ❌ Publish symptom content without "Source: NIH Office of Dietary Supplements" citation - ❌ Make health claims not supported by NIH Office of Dietary Supplements - ❌ Exaggerate symptom severity beyond what NIH ODS states - ❌ Batch generate symptoms without individual NIH ODS validation for each one - ❌ Use citations from any source other than NIH Office of Dietary Supplements
Legal Disclaimer (add to video descriptions):
"This content is for educational purposes only and is not medical advice.
Information sourced from NIH Office of Dietary Supplements. Consult your
healthcare provider for personalized medical guidance."
Complete Vitamin Video Production Workflow¶
🤖 MOSTLY AUTOMATED - Claude Code uses Playwright browser automation for Steps 1-4 (image generation, video creation, downloads). Steps 5-10 are automated via command line tools.
Purpose: End-to-end workflow for creating educational vitamin/nutrient symptom compilation videos (intro + symptoms + bumper + CTA)
Target Platforms: TikTok, Instagram Reels, Snapchat Format: Vertical 9:16 (1176×1764 pixels) Tools: ChatGPT (DALL-E) via Playwright, KlingAI via Playwright, ffmpeg
Workflow Overview¶
This workflow produces a complete educational video compilation consisting of: 1. Intro video (5s) - Attention-grabbing hook with vitamin name 2. Symptom videos (5s each) - 3-6 symptom animations 3. Bumper video (5s) - Nutri-E Productions branding 4. CTA video (5s) - App download call-to-action
Total Duration: 25-50 seconds depending on symptom count
Automation Level: - ✅ Steps 1-4: Fully automated via Playwright (ChatGPT image generation, KlingAI video creation, downloads) - ✅ Steps 5-10: Fully automated via bash/ffmpeg (verification, concatenation, validation, documentation)
Step 1: Generate Symptom Images in ChatGPT¶
🤖 AUTOMATED WITH PLAYWRIGHT - Claude Code uses browser automation to generate all images.
CRITICAL: All symptom images MUST be generated in the Nutri-E Brand Assets ChatGPT project.
CONTINUOUS WORKFLOW - DO NOT STOP BETWEEN SYMPTOMS:
For EACH symptom (1-6), follow this loop WITHOUT STOPPING:
- Submit prompt for symptom image
- Monitor generation in intervals (check every 15-30 seconds)
- Wait for "Image created" status
- DO NOT move to next symptom until current one is validated
- Validate result immediately after generation
- ✅ Correct vitamin name in LINE 1
- ✅ Correct symptom name in LINE 2
- ✅ Description matches NIH source in LINE 3
- ✅ NIH source credit in LINE 4
- ✅ Nutri-E character visible and correct style
- ✅ Background gradient matches symptom type (deficiency vs excess)
- Decision point:
- ✅ If validation passes: Download image → Continue to NEXT symptom (loop back to step 1)
- ❌ If validation fails: Regenerate with corrected prompt → Return to step 2
- After ALL 6 symptoms validated: Proceed to Step 2 (Upload to KlingAI)
RESEARCH REQUIREMENTS:
- Research symptom FIRST from NIH Office of Dietary Supplements ONLY
- Document NIH ODS source URL and exact quote
- Verify symptom is actually stated in NIH ODS factsheet
-
Do NOT use any other sources (Mayo Clinic, WebMD, etc.)
-
Navigate to Nutri-E Brand Assets project (AUTOMATED)
- Claude uses Playwright to open ChatGPT
- Navigates to Projects → Nutri-E Brand Assets
- Starts NEW conversation for this vitamin
-
Uploads Nutri-E mascot reference if needed
-
Generate symptom image (AUTOMATED) using 4-line format:
-
Download and verify
- Save with descriptive filename:
vitamin-a-symptom-1-night-blindness.png - Check resolution:
sips -g pixelWidth -g pixelHeight filename.png -
Visually confirm 4-line format and source citation
-
Repeat for all symptoms (typically 3-6 symptoms per vitamin)
Example Prompt for Vitamin A Night Blindness:
Generate a vertical 9:16 image (1176×1764 pixels if possible) showing:
4-LINE TEXT OVERLAY:
LINE 1 (Very top, medium font): "VITAMIN A DEFICIENCY"
LINE 2 (Top, large bold): "NIGHT BLINDNESS"
LINE 3 (Middle, medium): "Hard to see in low light"
LINE 4 (Bottom, small, legible): "Source: NIH Office of Dietary Supplements"
VISUAL: Nutri-E mascot (purple egg-shaped character with large cute eyes)
in a dimly lit room, struggling to see in darkness, concerned expression,
health education style, soft dark blue/purple tones
Background: Dark blue gradient (represents low light environment)
Character: Matches uploaded Nutri-E mascot reference
Text: Dark outline for readability against background
Step 1b: Check KlingAI for Existing Videos (IMPORTANT)¶
💡 TIME-SAVER: Before generating new videos, check if any already exist from previous sessions.
🔐 AUTHENTICATION NOTE: KlingAI login uses Google OAuth with credentials from .nutrie-secrets (codiedev42@gmail.com). Click "Continue with Google" when prompted.
Why This Matters: - KlingAI stores all generated videos in your account history - Videos from interrupted sessions may still be available - Each video generation costs ~35 credits - Downloading existing videos is FREE and instant
How to Check (via Playwright automation): 1. Navigate to KlingAI "My Creations" page 2. Look for recently generated videos matching current vitamin 3. Check video timestamps and content 4. Download any usable videos before generating new ones
Example from Vitamin E (Oct 27, 2025): - Found symptom 3 (muscle weakness) already generated from previous session - Downloaded immediately instead of regenerating - Saved 35 credits + 5 minutes generation time - Still needed to generate symptom 4 (vision problems)
Validation Before Using Existing Videos: - ✅ Check video content matches expected symptom (extract first frame) - ✅ Verify resolution (1176×1764) - ✅ Confirm duration (~5 seconds) - ✅ Ensure correct vitamin name appears in video
Step 2: Generate Videos in KlingAI¶
🔐 AUTHENTICATION: KlingAI login uses Google OAuth. Use the same Google credentials as ChatGPT (codiedev42@gmail.com) from .nutrie-secrets file. Navigate to https://app.klingai.com and click "Continue with Google" or equivalent OAuth button.
🤖 100% AUTOMATED WITH PLAYWRIGHT - Claude Code uses browser automation to upload images and generate videos. DO NOT DO THIS MANUALLY.
CRITICAL: This step is FULLY AUTOMATED using Playwright. Claude Code will: - Navigate to KlingAI using browser automation - Upload each symptom image automatically - Configure settings (VIDEO 2.1, 5s, 9:16, Professional Mode) - Write animation prompts automatically - Submit video generation requests ONE AT A TIME - Check periodically (every 30-60 seconds) if video is complete - Validate each completed video before moving to next - If validation fails, regenerate that video - Continue autonomously WITHOUT stopping to ask user
🔑 PLAYWRIGHT PERSISTENCE (Critical Lesson from Vitamin E):
If upload interface doesn't appear immediately: - ✅ DO: Keep trying, navigate back to Frame Mode, wait for page load, click upload area - ✅ DO: Try clicking "Click / Drop / Paste" upload area directly in Frame Mode - ✅ DO: Wait for page to fully load before interacting - ❌ DON'T: Give up after first few attempts - Playwright HAS worked before for this workflow - ❌ DON'T: Try multiple different URLs - stick to Frame Mode and persist
Example: Vitamin E symptom 4 generation initially struggled with upload interface access. Persisted by returning to Frame Mode, waiting for load, clicking upload area directly. SUCCESS after persistence!
For EACH symptom image (AUTOMATED BY CLAUDE):
- Upload to KlingAI (100% AUTOMATED - Claude uses Playwright)
- Navigate to https://app.klingai.com/global/image-to-video/frame-mode/new
- Wait for page to fully load (5 seconds)
- Click on "Click / Drop / Paste" upload area directly
- Use
browser_file_uploadtool to select image file -
Verify upload succeeded before proceeding
-
Configure video settings (100% AUTOMATED - Claude uses Playwright)
- Duration: 5 seconds
- Aspect ratio: 9:16 vertical
-
Quality: Professional mode (if available)
-
Write creative prompt (100% AUTOMATED - Claude does this) describing subtle animation:
Example for Night Blindness: "Nutri-E character squints and strains to see in darkness, subtle head movement, concerned expression, gentle animation, 5 seconds, vertical video" Example for Xerophthalmia: "Character rubs dry eyes in discomfort, gentle blinking motion, worried expression, subtle movements, 5 seconds, 9:16 format" -
Generate video
- Click "Generate"
- Wait for processing (typically 2-4 minutes per video)
- Check completion status periodically (every 30-60 seconds)
- When complete, validate the video plays correctly and shows expected content
-
Download immediately after validation
-
Repeat for all symptoms iteratively
- WORKFLOW: Generate → Wait → Validate → Download → Next symptom
- Do NOT submit all 6 at once without validation
- If validation fails (wrong content, error), regenerate that specific symptom
- Continue autonomously through all symptoms without stopping
Step 3: Wait for Video Generation to Complete¶
Timing: Approximately 3-5 minutes for a batch of 6 videos
While waiting: - Keep KlingAI tab open - Videos will appear in "My Creations" as they complete - You'll see progress indicators for each video
When all videos show "Complete": - Proceed to Step 4 (Download)
Step 4: Download All Videos from KlingAI¶
🤖 AUTOMATED WITH PLAYWRIGHT - Claude Code uses browser automation to download all videos.
CRITICAL: Verify you have ALL expected videos before proceeding.
- Navigate to KlingAI "My Creations" page (AUTOMATED)
-
Claude checks video count matches expected symptoms (e.g., 6 symptoms = 6 videos)
-
Download EACH video (AUTOMATED):
Claude uses Playwright JavaScript execution to trigger downloads:
// Right-click video to open context menu
const video = document.querySelectorAll('video')[INDEX];
const contextEvent = new MouseEvent('contextmenu', {
bubbles: true,
cancelable: true,
view: window,
button: 2
});
video.dispatchEvent(contextEvent);
// Then click "Download" button
const buttons = Array.from(document.querySelectorAll('button'));
const downloadBtn = buttons.find(btn => btn.textContent.includes('Download'));
downloadBtn.click();
-
Rename downloaded videos with descriptive names:
# Move to project directory cd "/path/to/Vitamin-[X]/videos/" # Rename KlingAI downloads mv ~/Downloads/kling_20251027_Image_to_Video__1261_0.mp4 symptom-1-night-blindness.mp4 mv ~/Downloads/kling_20251027_Image_to_Video__1254_0.mp4 symptom-2-xerophthalmia.mp4 mv ~/Downloads/kling_20251027_Image_to_Video__1248_0.mp4 symptom-3-visual-impairment.mp4 # ... etc for all symptoms -
Verify file count
-
🚨 CRITICAL: Visual Content Validation (MANDATORY) 🚨
⚠️ WARNING: Filename verification alone is NOT sufficient. KlingAI can have misnamed/mislabeled files in download history.
Real-world incident (Vitamin E, Oct 27, 2025):
- Downloaded symptom-3-muscle-weakness.mp4 and symptom-4-vision-problems.mp4 from KlingAI
- Filenames were CORRECT
- File sizes and durations were CORRECT (5 seconds each)
- Content was WRONG: Both files contained "Increased Bleeding Risk" content (symptom 5)
- Result: Final video had 3 duplicate "bleeding risk" segments, missing muscle weakness and vision problems entirely
- Cost: Wasted 30+ minutes of concatenation + validation before discovering issue
MANDATORY validation BEFORE concatenation:
# Extract first frame from EACH symptom video
cd "/path/to/Vitamin-[X]/videos/"
for i in {1..6}; do
symptom_file=$(ls symptom-$i-*.mp4 2>/dev/null | head -1)
if [ -n "$symptom_file" ]; then
ffmpeg -i "$symptom_file" -vf "select='eq(n\,0)'" -vframes 1 "/tmp/verify-symptom-$i.png" -y -loglevel error
echo "✅ Extracted frame from $symptom_file"
else
echo "❌ Missing symptom $i video!"
fi
done
echo ""
echo "🔍 MANUAL REVIEW REQUIRED:"
echo "Open /tmp/verify-symptom-*.png files and confirm:"
echo " - Each frame shows the CORRECT symptom name (not duplicates)"
echo " - No mismatched content (e.g., 'bleeding risk' in muscle weakness file)"
echo " - Vitamin name matches current vitamin being produced"
echo " - All 6 symptoms are unique (no duplicate frames)"
Visual inspection checklist: - ✅ verify-symptom-1.png: Shows symptom 1 name (e.g., "NIGHT BLINDNESS") - ✅ verify-symptom-2.png: Shows symptom 2 name (e.g., "XEROPHTHALMIA") - ✅ verify-symptom-3.png: Shows symptom 3 name (e.g., "MUSCLE WEAKNESS") - NOT a duplicate! - ✅ verify-symptom-4.png: Shows symptom 4 name (e.g., "VISION PROBLEMS") - NOT a duplicate! - ✅ verify-symptom-5.png: Shows symptom 5 name (unique content) - ✅ verify-symptom-6.png: Shows symptom 6 name (unique content) - ✅ All frames show correct vitamin name in LINE 1 (e.g., "VITAMIN E DEFICIENCY") - ✅ No duplicate symptom names across all 6 frames
If ANY frame shows wrong content: 1. ❌ STOP immediately - do NOT proceed to concatenation 2. Identify which symptom file(s) are incorrect 3. Delete the incorrect file(s) 4. Re-generate the missing symptom(s) in KlingAI 5. Re-download and re-validate 6. Only proceed when ALL frames pass validation
Why this matters: - Prevents wasted time concatenating videos with wrong content - Catches KlingAI mislabeling issues before final production - Ensures final video has all unique symptoms (no duplicates) - Saves credits by avoiding re-generation of entire compilation
Time investment: 2-3 minutes for validation vs. 30+ minutes wasted on incorrect compilation
Step 4b: Fix Videos Without Audio Tracks (CRITICAL)¶
⚠️ ISSUE: Some KlingAI-generated videos may not include audio tracks, which causes concatenation failures.
Symptom: When running concatenation, you see error:
[fc#0 @ 0x...] Stream specifier ':a' in filtergraph description matches no streams.
Error binding filtergraph inputs/outputs: Invalid argument
Root Cause: KlingAI sometimes generates videos without audio streams. The filter_complex concat method expects both video AND audio streams from all inputs.
Solution: Add silent audio track to videos missing audio BEFORE concatenation.
Detection:
# Check if video has audio stream
ffprobe -v error -select_streams a:0 -show_entries stream=codec_type symptom-4-vision-problems.mp4
# If output is empty, video has no audio track
Fix (example from Vitamin E production, symptom 4):
cd "/path/to/Vitamin-[X]/videos/"
# Add silent audio track to video without audio
ffmpeg -i symptom-4-vision-problems.mp4 \
-f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100 \
-c:v copy \
-c:a aac \
-shortest \
symptom-4-vision-problems-temp.mp4 -y
# Replace original with fixed version
mv symptom-4-vision-problems-temp.mp4 symptom-4-vision-problems.mp4
When to Apply: - ✅ BEFORE running concatenation script - ✅ After downloading all videos from KlingAI - ✅ Only for videos that fail audio stream detection
Validation After Fix:
# Verify audio stream now exists
ffprobe -v error -select_streams a:0 -show_entries stream=codec_type symptom-4-vision-problems.mp4
# Expected output: codec_type=audio
Why This Matters: - Prevents concatenation failures due to missing audio streams - Ensures all videos have consistent stream structure - Silent audio track is unnoticeable but allows filter_complex to work - Saves time by fixing before concatenation attempt
Step 5: Verify All Videos with ffprobe¶
CRITICAL: Verify resolution and duration BEFORE concatenation to catch issues early.
Check each video:
# Navigate to vitamin directory
cd "/path/to/Vitamin-[X]/"
# Verify intro video
ffprobe -v error -select_streams v:0 -show_entries stream=width,height,duration -of default=noprint_wrappers=1 vitamin-x-intro.mp4
# Verify all symptom videos
for i in {1..6}; do
echo "=== Symptom $i ==="
ffprobe -v error -select_streams v:0 -show_entries stream=width,height,duration -of default=noprint_wrappers=1 videos/symptom-$i-*.mp4
done
Expected output:
Validation checklist: - ✅ All videos have same resolution (1176×1764 or consistent) - ✅ All videos have ~5 second duration (5.0-5.1s acceptable) - ✅ No corrupt or incomplete files (ffprobe shows valid data) - ✅ Video count matches expected symptoms (e.g., 6 videos for 6 symptoms)
If resolution mismatch found: - Rescale videos to match before concatenation (see Step 6b)
Step 6: Copy Bumper and CTA Videos¶
Location of shared assets:
/Users/post/Library/CloudStorage/GoogleDrive-codiedev42@gmail.com/
My Drive/Nutri-E Marketing/Social Media Posts/TikTok/Educational/
Vitamin-D/videos/
Copy to current vitamin directory:
# Navigate to current vitamin directory
cd "/path/to/Vitamin-[X]/videos/"
# Copy bumper and CTA from Vitamin D (or most recent vitamin)
cp "/Users/post/Library/CloudStorage/GoogleDrive-codiedev42@gmail.com/My Drive/Nutri-E Marketing/Social Media Posts/TikTok/Educational/Vitamin-D/videos/bumper-rescaled.mp4" .
cp "/Users/post/Library/CloudStorage/GoogleDrive-codiedev42@gmail.com/My Drive/Nutri-E Marketing/Social Media Posts/TikTok/Educational/Vitamin-D/videos/cta-rescaled.mp4" .
# Verify files copied
ls -lh bumper-rescaled.mp4 cta-rescaled.mp4
If bumper/CTA resolution doesn't match symptom videos:
# Check bumper resolution
ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 bumper-rescaled.mp4
# If different from symptom clips (e.g., 464x688 vs 1176x1764), rescale:
ffmpeg -i bumper-rescaled.mp4 \
-vf "scale=1176:1764:force_original_aspect_ratio=decrease,pad=1176:1764:(ow-iw)/2:(oh-ih)/2" \
-c:v libx264 -preset fast -crf 23 -c:a aac -b:a 192k \
bumper-rescaled-1176x1764.mp4 -y
# Repeat for CTA
ffmpeg -i cta-rescaled.mp4 \
-vf "scale=1176:1764:force_original_aspect_ratio=decrease,pad=1176:1764:(ow-iw)/2:(oh-ih)/2" \
-c:v libx264 -preset fast -crf 23 -c:a aac -b:a 192k \
cta-rescaled-1176x1764.mp4 -y
Step 7: Create Concatenation List (concat.txt)¶
File location: In the vitamin root directory (NOT videos/ subdirectory)
Proper order: 1. Intro 2. All symptoms (in logical order) 3. Bumper 4. CTA
Create concat.txt file:
# Navigate to vitamin root directory
cd "/path/to/Vitamin-[X]/"
# Create concat.txt with proper file paths
cat > concat.txt << 'EOF'
file 'vitamin-a-intro.mp4'
file 'videos/symptom-1-night-blindness.mp4'
file 'videos/symptom-2-xerophthalmia.mp4'
file 'videos/symptom-3-visual-impairment.mp4'
file 'videos/symptom-4-respiratory-disease-risk.mp4'
file 'videos/symptom-5-anemia.mp4'
file 'videos/symptom-6-increased-infection-severity.mp4'
file 'videos/bumper-rescaled.mp4'
file 'videos/cta-rescaled.mp4'
EOF
# Verify concat.txt contents
cat concat.txt
CRITICAL validation before concatenation:
# Verify all files exist
while IFS= read -r line; do
file=$(echo "$line" | sed "s/file '//;s/'//")
if [ -f "$file" ]; then
echo "✅ $file exists"
else
echo "❌ $file MISSING"
fi
done < concat.txt
# If any files missing, STOP and fix before proceeding
Step 8: Concatenate Videos with ffmpeg¶
CRITICAL: Use filter_complex method for KlingAI videos. The concat demuxer with -c copy creates audio/video timestamp mismatches.
Navigate to vitamin root directory:
Method 1: filter_complex (RECOMMENDED - Use this for KlingAI videos)
ffmpeg \
-i vitamin-a-intro.mp4 \
-i videos/symptom-1-night-blindness.mp4 \
-i videos/symptom-2-xerophthalmia.mp4 \
-i videos/symptom-3-visual-impairment.mp4 \
-i videos/symptom-4-respiratory-disease-risk.mp4 \
-i videos/symptom-5-anemia.mp4 \
-i videos/symptom-6-increased-infection-severity.mp4 \
-i videos/bumper-rescaled.mp4 \
-i videos/cta-rescaled.mp4 \
-filter_complex "[0:v][0:a][1:v][1:a][2:v][2:a][3:v][3:a][4:v][4:a][5:v][5:a][6:v][6:a][7:v][7:a][8:v][8:a]concat=n=9:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" \
-c:v libx264 -preset fast -crf 23 -c:a aac -b:a 192k \
videos/vitamin-a-FINAL.mp4 -y
Why filter_complex? - ✅ Handles KlingAI videos correctly (no timestamp errors) - ✅ Prevents audio/video duration mismatches - ✅ Ensures all clips are included (no dropped bumper/CTA) - ✅ More robust than concat demuxer
Method 2: concat demuxer (NOT RECOMMENDED - causes issues)
# ❌ DO NOT USE - Creates audio/video mismatches with KlingAI videos
# Example issue: Video 170s, Audio 35s
ffmpeg -f concat -safe 0 -i concat.txt \
-c copy \
videos/vitamin-a-FINAL.mp4 -y
Expected output (filter_complex):
Compilation time: ~9 seconds for 9 clips (47 seconds total)
🚨 VALIDATION CHECKPOINT 🚨¶
MANDATORY BEFORE PROCEEDING:
Before marking the video as complete, you MUST complete the 14-item validation checklist.
📋 Validation Tools:
- Mascot Reference: website/images/nutri-e-mascot.png (COMPARE FIRST - ADDED OCT 28, 2025)
- Checklist Location: MARKETING_GUIDE.md lines 969-983
- Validation Script: scripts/validate-video.sh (auto-opens mascot reference)
- Report Template: validation-report-template.md
Required Actions:
1. ✅ COMPARE frames to mascot reference (cream face, brown eyebrows, pink cheeks)
2. ✅ Run ./scripts/validate-video.sh [VITAMIN] [video-file.mp4] (includes Step 0: mascot check)
3. ✅ Complete validation-report-[vitamin].md with ALL 14 items
4. ✅ Verify character matches Nutri-E mascot (item #12 - CRITICAL)
5. ✅ Archive validation report for legal compliance
⚠️ DO NOT SKIP: Mascot comparison is MANDATORY. Script will auto-open reference and block if not confirmed.
Step 9: Validate Final Video¶
🚨 CRITICAL - DO NOT SKIP THIS STEP 🚨
Validation is REQUIRED to ensure all clips are present and the video is correct. DO NOT mark the video as complete until ALL validation steps pass.
Use the validation enforcer script:
This script will: - Extract verification frames from the video - Display the mandatory 14-item checklist - Prompt you to confirm ALL items are checked - Verify character design consistency - Ensure validation report is created
Manual validation checklist (ALL 14 items required):
Complete validation script:
# Navigate to vitamin directory
cd "/path/to/Vitamin-[X]/"
echo "=== VALIDATION REPORT ==="
echo ""
# 1. Duration check
echo "1. Duration:"
DURATION=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 videos/vitamin-a-FINAL.mp4)
echo " Actual: ${DURATION}s"
echo " Expected: ~47.4s (intro 5s + 6 symptoms 30s + bumper 6s + CTA 6s)"
echo ""
# 2. Resolution check
echo "2. Resolution:"
RES=$(ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 videos/vitamin-a-FINAL.mp4)
echo " Actual: $RES"
echo " Expected: 1176x1764"
echo ""
# 3. Audio/Video sync check (CRITICAL!)
echo "3. Audio/Video Sync:"
ffprobe -v error -show_entries stream=codec_type,duration -of default=noprint_wrappers=1 videos/vitamin-a-FINAL.mp4
echo " ✅ PASS: Both streams have same duration (±0.1s)"
echo " ❌ FAIL: Duration mismatch (re-encode with filter_complex needed)"
echo ""
# 4. Visual validation (extract frames)
echo "4. Extracting validation frames..."
ffmpeg -ss 0 -i videos/vitamin-a-FINAL.mp4 -vframes 1 /tmp/verify-intro.png -y -loglevel error
ffmpeg -ss 38 -i videos/vitamin-a-FINAL.mp4 -vframes 1 /tmp/verify-bumper.png -y -loglevel error
ffmpeg -ss 44 -i videos/vitamin-a-FINAL.mp4 -vframes 1 /tmp/verify-cta.png -y -loglevel error
echo " Frames saved to /tmp/verify-*.png"
echo " MANUALLY REVIEW:"
echo " - verify-intro.png: Shows VITAMIN [X] + PLEASE STOP SCROLLING"
echo " - verify-bumper.png: Shows NUTRI-E PRODUCTIONS logo"
echo " - verify-cta.png: Shows 'Track your vitamins smarter' + nutrieapp.com"
echo ""
# 5. File size check
echo "5. File Size:"
ls -lh videos/vitamin-a-FINAL.mp4 | awk '{print " "$5" (typical: 15-40MB for 40-50s video)"}'
echo ""
echo "=== VALIDATION COMPLETE ==="
echo "Review all checks above before marking video as complete."
Critical validation failures and fixes:
Failure 1: Audio/Video duration mismatch
codec_type=video
duration=170.003011 # ❌ WRONG
codec_type=audio
duration=35.353469 # ❌ WRONG (only intro audio!)
Cause: concat demuxer with -c copy creates timestamp errors
Fix: Re-encode using filter_complex (Step 8, Method 1)
Failure 2: Short duration (missing bumper/CTA)
Cause: Bumper and CTA were dropped during concatenation Fix: Rescale bumper/CTA to match symptom resolution (Step 6), then re-encode with filter_complex
Failure 3: Visual frames show wrong content - verify-bumper.png shows a symptom clip instead of "NUTRI-E PRODUCTIONS" - verify-cta.png shows a symptom clip instead of app CTA
Cause: Clips were dropped or in wrong order Fix: Verify concat.txt order (Step 7), ensure all files exist, re-encode with filter_complex
✅ Success criteria (ALL must pass): - ✅ Duration: 45-50 seconds (depends on symptom count) - ✅ Resolution: 1176x1764 (matches symptom clips) - ✅ Audio/Video sync: Both streams within 0.1s of each other - ✅ Intro frame: Shows correct vitamin name + "PLEASE STOP SCROLLING" - ✅ Bumper frame: Shows "NUTRI-E PRODUCTIONS" logo - ✅ CTA frame: Shows "Track your vitamins smarter" + nutrieapp.com - ✅ File size: 15-40MB (reasonable for video length) - ✅ No visual glitches or corruption
ONLY after ALL validation steps pass, proceed to Step 10.
Step 10: Update Status Tracking¶
Update "Completed Educational Video Compilations" table in this document (line 564):
| Vitamin A | ✅ Complete | 47.7s | 9 | `Vitamin-A/vitamin-a-deficiency-6-symptoms-tiktok.mp4` | Intro + 6 deficiency symptoms + bumper + CTA. Validated Oct 26, 2025 |
Move final video to main directory with descriptive name:
Document key details: - Total duration - Number of clips (intro + symptoms + bumper + CTA) - Symptoms covered (list in notes) - Final video filename (descriptive, includes platform) - Any special considerations or issues resolved
Step 11: Document Lessons Learned (REQUIRED)¶
⚠️ CRITICAL: After completing each vitamin video, you MUST analyze what went wrong, update documentation, and improve the workflow for the next vitamin. This step is NON-NEGOTIABLE.
Create a lessons learned document:
cd "/path/to/Vitamin-[X]/"
cat > LESSONS_LEARNED.md << 'EOF'
# Vitamin [X] Production - Lessons Learned
**Date Completed**: [Date]
**Production Duration**: [Hours/Days]
## What Went Well
- ✅ [List successes]
- ✅ [What worked smoothly]
- ✅ [Efficient processes]
## What Went Wrong
- ❌ **Issue**: [Specific problem]
- **Root Cause**: [Why it happened]
- **Impact**: [How it affected workflow/quality/cost]
- **Time Lost**: [Estimate]
- **Credits Wasted**: [If applicable]
## Changes Made to Workflow
- 📝 **Updated**: [Which documentation files]
- 📝 **Added**: [New sections/instructions]
- 📝 **Clarified**: [Ambiguous instructions]
## Improvements for Next Vitamin
- 🔧 [Specific change to make]
- 🔧 [Process improvement]
- 🔧 [Tool/automation enhancement]
## Documentation Updates
- [ ] MARKETING_GUIDE.md updated
- [ ] Workflow instructions clarified
- [ ] Common issues section updated
- [ ] Example prompts improved
EOF
Analyze and document:
- What went wrong?
- Generated duplicate videos (wasted credits)
- Browser connection issues
- Missed validation steps
-
Incorrect workflow understanding
-
Why did it happen?
- Instructions said "generate all at once"
- No iterative validation built into workflow
-
Ambiguous guidance in documentation
-
What should change?
- Update MARKETING_GUIDE.md with correct workflow
- Add validation checkpoints
- Clarify automation vs. manual steps
- Add error recovery procedures
Update affected documentation files:
# Example: Update MARKETING_GUIDE.md
# - Fix incorrect "generate all at once" instruction
# - Add iterative validation workflow
# - Clarify when to wait and check status
# - Add duplicate prevention guidance
CRITICAL RULE: If you discover incorrect or ambiguous instructions during production, you MUST fix them immediately so the next vitamin production runs smoothly.
Why this step exists: - Prevents repeating the same mistakes - Improves efficiency with each vitamin - Builds institutional knowledge - Reduces credit waste and production time - Creates better documentation for future work
Common Issues and Solutions¶
Issue 1: Audio/video duration mismatch (MOST COMMON - CRITICAL)
Symptoms:
codec_type=video
duration=170.003011 # Video shows 170 seconds
codec_type=audio
duration=35.353469 # Audio only 35 seconds
Cause: Using concat demuxer with -c copy creates timestamp errors with KlingAI videos
Root Cause: KlingAI videos use HE-AAC audio which has complex frame timing that -c copy cannot handle correctly
Impact: Video appears longer than it actually is, audio cuts off early, bumper/CTA missing
Solution:
# ✅ ALWAYS use filter_complex for KlingAI videos
ffmpeg \
-i vitamin-a-intro.mp4 \
-i videos/symptom-1.mp4 \
... (all inputs) \
-filter_complex "[0:v][0:a][1:v][1:a]...[8:v][8:a]concat=n=9:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" \
-c:v libx264 -preset fast -crf 23 -c:a aac -b:a 192k \
videos/vitamin-a-FINAL.mp4 -y
Prevention: NEVER use concat demuxer (-f concat -c copy) for KlingAI videos
Issue 2: Bumper/CTA dropped from final video (short duration)
Symptoms: - Duration: 35.3s (expected ~47s) - verify-bumper.png shows symptom instead of "NUTRI-E PRODUCTIONS" - verify-cta.png shows symptom instead of app CTA
Cause: Resolution mismatch between symptom clips and bumper/CTA Solution: Rescale bumper/CTA to match symptom resolution (Step 6)
ffmpeg -i bumper-rescaled.mp4 \
-vf "scale=1176:1764:force_original_aspect_ratio=decrease,pad=1176:1764:(ow-iw)/2:(oh-ih)/2" \
-c:v libx264 -preset fast -crf 23 -c:a aac -b:a 192k \
bumper-rescaled-1176x1764.mp4 -y
Issue 3: Missing symptom video
Symptoms: File count doesn't match expected symptoms Cause: Didn't download all videos from KlingAI Solution: Check KlingAI "My Creations", download missing video, restart from Step 4
# Verify file count
ls -1 videos/symptom-*.mp4 | wc -l
# Should match expected count (e.g., 6 for Vitamin A)
Issue 4: Non-monotonic DTS warnings during concatenation
Symptoms: Warning messages during ffmpeg concatenation Impact: Warnings only, not errors (usually safe to ignore) Solution: ffmpeg automatically corrects, final video should be fine (validate in Step 9)
Issue 5: All symptom images look different (inconsistent branding)
Symptoms: Each symptom has different character style, colors, or composition Cause: Generated images outside Nutri-E Brand Assets project Solution: Always use Nutri-E Brand Assets project for consistency (Step 1)
Prevention: 1. Navigate to ChatGPT → Projects → Nutri-E Brand Assets 2. Start NEW conversation for each vitamin 3. Upload Nutri-E mascot reference BEFORE generating images
Issue 6: Validation skipped, video marked complete too early
Symptoms: Discovered issues after video was already "done" Cause: Skipping Step 9 (Validate Final Video) Impact: Wasted time, need to re-do entire concatenation
Solution: NEVER skip validation Prevention: Run complete validation script (Step 9) BEFORE marking video complete
File Organization Example¶
Vitamin A Directory Structure:
Vitamin-A/
├── vitamin-a-intro.mp4 # Intro video (5s)
├── vitamin-a-deficiency-6-symptoms-tiktok.mp4 # FINAL OUTPUT (47.7s, 15MB)
├── tiktok-caption.txt # TikTok caption and hashtags
├── concat.txt # Concatenation list
├── frames/ # Generated symptom images (optional)
│ ├── vitamin-a-symptom-1-night-blindness.png
│ ├── vitamin-a-symptom-2-xerophthalmia.png
│ └── ...
└── videos/
├── symptom-1-night-blindness.mp4 # Downloaded from KlingAI
├── symptom-2-xerophthalmia.mp4
├── symptom-3-visual-impairment.mp4
├── symptom-4-respiratory-disease-risk.mp4
├── symptom-5-anemia.mp4
├── symptom-6-increased-infection-severity.mp4
├── bumper-rescaled.mp4 # Copied from Vitamin D
└── cta-rescaled.mp4 # Copied from Vitamin D
🚨 VALIDATION CHECKPOINT 🚨¶
BEFORE PUBLISHING ANY VIDEO:
📋 Required Validation:
- COMPARE frames to website/images/nutri-e-mascot.png (MANDATORY - ADDED OCT 28, 2025)
- Complete ALL 14 items from validation checklist (lines 969-983)
- Run ./scripts/validate-video.sh [VITAMIN] [video-file.mp4] (auto-opens mascot reference)
- Create validation-report-[vitamin].md documenting all checks
- Verify character MATCHES Nutri-E mascot (CRITICAL)
⚠️ Character Design Validation is MANDATORY: Item #12 on checklist - Cream/beige FACE inside purple hood/body (NOT just purple blob) - White circular eye outlines around black pupils - Brown eyebrows (NOT purple, NOT missing) - Soft pink cheeks - Empathetic expression appropriate for symptom
FAILURE CASE (Oct 28, 2025): B12 video had generic purple blobs instead of Nutri-E mascot. Cost: 210 credits wasted. Script now auto-opens mascot reference to prevent this.
DO NOT proceed to publication without completing validation report.
Workflow Summary Checklist¶
Before starting a new vitamin video:
Pre-Production: - ✅ Opened ChatGPT → Nutri-E Brand Assets project - ✅ Researched all symptoms from NIH Office of Dietary Supplements ONLY - ✅ Documented NIH ODS source URLs for each symptom - ✅ Generated intro video first frame + last frame in ChatGPT - ✅ Uploaded both frames to KlingAI VIDEO 2.0+ (NOT Turbo) - ✅ Downloaded intro video and validated (~5 seconds)
Production: - ✅ Generated all symptom images in Nutri-E Brand Assets project (4-line format) - ✅ Uploaded all symptom images to KlingAI (VIDEO 2.0+, 5 seconds each) - ✅ Waited for all videos to complete (~3-5 minutes) - ✅ Downloaded ALL videos from KlingAI (verified count matches symptoms)
Post-Production:
- ✅ Verified all videos with ffprobe (resolution + duration)
- ✅ Copied bumper and CTA from previous vitamin directory
- ✅ Created concat.txt in proper order (intro → symptoms → bumper → CTA)
- ✅ Validated all files exist before concatenation
- ✅ Concatenated with filter_complex (NOT concat demuxer!)
- ✅ CRITICAL: Validated final video (Step 9) - DO NOT SKIP
- ✅ Ran ./scripts/validate-video.sh [VITAMIN] [video-file.mp4]
- ✅ Completed ALL 14 items on validation checklist (lines 969-983)
- ✅ Character design consistent (cream/beige face inside purple hood/body, white circular eye outlines, brown eyebrows, soft pink cheeks)
- ✅ Created validation-report-[vitamin].md documenting all checks
- ✅ Duration matches expected (~47s for 9 clips)
- ✅ Audio/video sync (both streams same duration)
- ✅ Visual frames extracted and manually reviewed
- ✅ Bumper shows "NUTRI-E PRODUCTIONS"
- ✅ CTA shows "Track your vitamins smarter"
- ✅ Updated status tracking table in MARKETING_GUIDE.md
Time Estimate: 45-60 minutes total for 6-symptom video (+ 15 minutes for validation)
REMEMBER: The video is NOT complete until ALL 14 validation items pass, including character design verification!
Messaging Guidelines¶
Nutri-E Voice¶
Tone: Professional, knowledgeable, empowering
Key Messages: - "Take control of your health" - "Science-backed supplement tracking" - "Never wonder if you're getting enough nutrients" - "Built with NIH's DSLD database" - "AI-powered nutrition insights"
Cuti-E Voice (Social/Support)¶
Tone: Friendly, supportive, playful
Key Messages: - "We're here to help!" - "Let's make tracking easy together" - "Your health journey, simplified" - "Tracking supplements should be fun!"
Prohibited Content¶
What NOT to Include¶
❌ Medical diagnoses or treatment claims ❌ Before/after health transformations ❌ Fake reviews without disclosure ❌ Competitor comparisons ❌ Health claims not backed by science ❌ Screenshots that don't match actual app UI
Focus on: Tracking and organization features, NOT medical outcomes.
Quality Checklist¶
Before delivering any asset, verify:
- ✅ Uses actual app screenshots from reference library
- ✅ Colors match brand guidelines (Nutri-E vs Cuti-E)
- ✅ Text is readable and properly sized
- ✅ Dimensions match specified requirements
- ✅ Messaging is accurate and compelling
- ✅ No medical claims or prohibited language
- ✅ Call-to-action is clear
- ✅ Composition is balanced and professional
File Naming Convention¶
Format: [app]_[type]_[feature]_[dimension]_v[version].[ext]
Examples¶
nutrie_appstore_nutrient-tracking_1170x2532_v1.png
nutrie_instagram_hero_1080x1080_v2.jpg
nutrie_video_tutorial_1080x1920_v1.mp4
nutrie_tiktok_ai-feature_1080x1920_v1.mp4
cutie_social_support-post_1080x1080_v1.png
File Organization¶
marketing-assets/
├── app-store/
│ ├── screenshots/
│ └── preview-video/
├── social-media/
│ ├── instagram/
│ ├── tiktok/
│ └── snapchat/
├── video-scenes/
│ ├── klingai-prompts/
│ └── capcut-projects/
└── website/
└── hero-images/
Official Links & CTAs¶
Website¶
https://www.nutrieapp.com
App Store¶
https://apps.apple.com/us/app/nutri-e/id6753125391
Social Media¶
- TikTok: https://www.tiktok.com/@nutrieapp
- Snapchat: https://snapchat.com/t/eHxw752K
Call-to-Action Options¶
Download CTAs: - "Download now at nutrieapp.com" - "Get Nutri-E on the App Store" - "Start tracking today - nutrieapp.com" - "Available now on iOS"
Social CTAs: - "Follow us @nutrieapp on TikTok" - "Add us on Snapchat" - "Join the Nutri-E community"
Engagement CTAs: - "Try it free today" - "Track smarter, not harder" - "Never miss a dose again"
Standard Link Placement¶
All marketing materials should include:
- Primary CTA: App Store link or website
- Secondary: Website URL for more info
- Social handles: @nutrieapp (TikTok), Snapchat link
- Hashtags: #NutriE #SupplementTracking #HealthTech
For mobile-first platforms (TikTok/Snapchat): Use short, memorable CTAs optimized for quick scanning.
Creative Direction Guidelines¶
When Creating Marketing Assets¶
- Study screenshots thoroughly before creating any asset
- Maintain brand consistency across all materials
- Create compelling narratives that resonate with health-conscious users
- Ensure accuracy - all features shown must exist in the app
- Optimize for conversion - every asset should drive downloads
Deliverables Should Include¶
- The final asset (or detailed description if image generation needed)
- Rationale for design choices
- Alternative versions if applicable
- A/B testing suggestions
Questions to Ask Before Starting¶
- Target audience specifics
- Preferred messaging angle
- Specific features to highlight
- Platform requirements
- Current marketing campaigns to align with
- Competitor differentiation points
- User pain points to address
Platform-Specific Guidelines¶
TikTok¶
- Duration: 6-30 seconds optimal
- Format: Vertical 9:16 (1080x1920px)
- Hook: First 3 seconds are critical
- Text: Large, readable captions (many watch muted)
- Trends: Leverage trending sounds when relevant
- Hashtags: Use 3-5 relevant hashtags
Snapchat¶
- Duration: 5-10 seconds per snap
- Format: Vertical 9:16 (1080x1920px)
- Style: Authentic, less polished than Instagram
- Text: Keep minimal, use Snapchat's native text tools
- Links: Use Snap link stickers
Instagram¶
- Feed: Square 1080x1080px
- Stories: Vertical 1080x1920px
- Reels: Vertical 1080x1920px, 15-90 seconds
- Captions: First line should hook, use emojis sparingly
- Hashtags: Use 10-15 relevant hashtags
YouTube Shorts¶
- Duration: Up to 60 seconds (30-48 seconds optimal)
- Format: Vertical 9:16 (1176x1764px or 1080x1920px)
- Audio: Use YouTube Audio Library for royalty-free music
- Title: Include keywords and emojis (100 char limit)
- Description: Front-load keywords, include links (5000 char limit)
- Hashtags: Use 3-5 relevant hashtags in description
- Scheduling: Stagger uploads (daily at consistent times)
YouTube Upload Workflow¶
Pre-Upload Preparation¶
1. Remove Original Audio (if needed):
2. Video Files Ready for Upload:
- Vitamin E: vitamin-e-deficiency-6-symptoms-tiktok.mp4
- Vitamin D: vitamin-d-FINAL-silent.mp4
- Vitamin A: vitamin-a-deficiency-6-symptoms-tiktok-silent.mp4
YouTube Studio Upload Process¶
Step 1: Navigate and Upload 1. Go to https://studio.youtube.com 2. Click "Last opp videoer" (Upload videos) 3. Select video file
Step 2: Fill Details Tab
- Title (38-100 chars): Include keyword + emoji + CTA
- Example: 6 Warning Signs of Vitamin E Deficiency 💜 Track Your Vitamins with Nutri-E
- Description (front-load keywords):
Did you know Vitamin [X] deficiency can cause serious health issues? Watch for these [N] warning signs:
1. [Symptom 1]
2. [Symptom 2]
...
Track your vitamin intake and stay healthy with Nutri-E! 💜
Download now: https://www.nutrieapp.com
App Store: https://apps.apple.com/us/app/nutri-e/id6753125391
#Vitamin[X] #HealthTips #Supplements #Nutrition #WellnessJourney #HealthyLiving #NutriE
Step 3: Video Elements Tab - Add Related Video: Link to another Nutri-E video (optional) - Add Subtitles: Will be available after processing (optional)
Step 4: Checks Tab - Wait for copyright check to complete (~1-2 minutes) - Verify "Fant ingen problemer" (No issues found)
Step 5: Visibility Tab - Add Music from Audio Library
CRITICAL: Add music BEFORE scheduling/publishing!
- In Visibility tab, click "Lydbibliotek" (Audio Library) in left sidebar
- Filter by:
- Genre: Ambient, Calm, Happy (for health content)
- Mood: Peaceful, Uplifting, Inspirational
- Duration: Match or exceed video length
- Recommended tracks for health/wellness:
- "Ambient Relaxation" (calm, non-distracting)
- "Uplifting Piano" (inspirational, positive)
- "Soft Background" (minimal, professional)
- Click "Add to video" button
- Adjust volume: Lower to 20-30% for background only
Step 6: Schedule Publishing 1. Click "Planlegg" (Schedule) section 2. Set date: Stagger by 1 day intervals - Vitamin E: October 29, 12:00 - Vitamin D: October 30, 12:00 - Vitamin A: October 31, 12:00 3. Set time: 12:00 (noon, optimal posting time) 4. Click "Planlegg" (Schedule) button 5. Confirm scheduling in dialog
Post-Upload¶
Video will show:
- Video link: https://youtube.com/shorts/[VIDEO_ID]
- Scheduled date and time
- Status: "Planlagt video" (Scheduled video)
Posting Schedule Best Practices: - Post daily at consistent times (e.g., 12:00 noon) - Stagger vitamin series videos 24 hours apart - Avoid weekends for initial posts (lower engagement) - Monitor first 48 hours for engagement metrics
Success Metrics to Track¶
Video Performance¶
- View count and completion rate
- Engagement rate (likes, comments, shares)
- Click-through rate to App Store
- Follower growth
Asset Performance¶
- App Store conversion rate
- Screenshot view duration
- Preview video completion rate
- Download conversion by traffic source
A/B Testing Ideas¶
- Different opening hooks (problem vs. solution)
- Feature focus (AI vs. scheduling vs. nutrients)
- CTA placement (beginning vs. end)
- Music style (upbeat vs. calm)
- Visual style (UI-focused vs. lifestyle)
Related Documentation¶
- CLAUDE.md - Full project architecture and technical details
- README.md - Project overview and setup
- website/ - Marketing website source files
- QUICK_REFERENCE.md - Common development workflows
Support¶
For questions about marketing assets or brand guidelines: - Review the screenshot library in ChatGPT Project - Use DALL-E for custom image generation - Check website at https://www.nutrieapp.com - Follow @nutrieapp on TikTok for latest content examples
Last Updated: October 2025