← back to Goodquestion Ai

video-html/create-all-configs.js

822 lines

#!/usr/bin/env node
/**
 * Creates all 18 video configs for blog post videos.
 * Each config follows the generate-video.js pipeline format.
 */

const fs = require('fs');
const path = require('path');

const CONFIGS_DIR = path.join(__dirname, 'configs');
const VIDEOS_DIR = '/root/Projects/goodquestion-ai/videos';
fs.mkdirSync(CONFIGS_DIR, { recursive: true });

const AVATAR = {
  image: '/root/Projects/goodquestion-ai/dashboard-captures/avatar/avatar-front.png',
  maxDuration: 3,
  position: 'bottom-right',
  size: 200,
};

const CTA_SLIDE = {
  template: 'cta',
  brand: 'Agent Abrams',
  handle: '@agentabrams',
  url: 'goodquestion.ai',
  tagline: 'One person. One server. Production-grade AI.',
  narration: 'Follow along at good question dot A I. Find me on X at agent abrams. Until next time.',
  duration: 6,
};

function output(slug) {
  return {
    landscape: `${VIDEOS_DIR}/${slug}-landscape.mp4`,
    vertical: `${VIDEOS_DIR}/${slug}-vertical.mp4`,
  };
}

const configs = [
  // 1. zone-culling
  {
    title: 'Zone Culling Nearly Killed My 3D App',
    slides: [
      {
        template: 'hook',
        headline: 'The Optimization That Broke Everything',
        subtext: 'When hiding objects makes your app disappear',
        narration: 'Hey, it is Agent Abrams. I enabled one optimization flag and my entire 3D scene went black. Here is how zone culling nearly killed my app.',
        duration: 7,
        avatar: true,
      },
      {
        template: 'big-number',
        numbers: [
          { value: 2320, label: 'Objects In Scene', color: '#00D4FF' },
          { value: 88, suffix: '%', label: 'Hidden By Culling', color: '#FF6B35' },
          { value: 0, label: 'Objects Visible', color: '#00E68C' },
        ],
        narration: 'Twenty three hundred objects in the scene. Eighty eight percent hidden by the culler. And the result? Zero objects visible. Complete black screen.',
        duration: 8,
      },
      {
        template: 'feature-list',
        title: 'The Fix',
        items: [
          { text: 'Zero lines of custom culling code written', color: '#00D4FF' },
          { text: 'Used the framework\'s built-in frustum culling instead', color: '#FF6B35' },
          { text: 'Scene renders instantly, no manual zone management', color: '#00E68C' },
          { text: 'Lesson: read the docs before reinventing the wheel', color: '#00D4FF' },
        ],
        narration: 'The fix? Zero lines of custom code. I deleted my manual culling system entirely and used the framework is built-in frustum culling. Scene renders instantly. The lesson: always read the docs before reinventing the wheel.',
        duration: 10,
      },
      {
        template: 'comparison',
        title: 'Custom Culling vs Built-In',
        before: { value: '400+', label: 'Lines of Code' },
        after: { value: '0', label: 'Lines Needed' },
        change: 'Deleted everything',
        narration: 'Four hundred lines of custom culling logic. Replaced by zero. Sometimes the best code is the code you delete.',
        duration: 7,
      },
      CTA_SLIDE,
    ],
    avatar: AVATAR,
    output: output('zone-culling'),
  },

  // 2. skill-system
  {
    title: 'Building a Skill System for Claude Code',
    slides: [
      {
        template: 'hook',
        headline: 'How I Turned AI Into a Teammate',
        subtext: 'A reusable skill system for autonomous agents',
        narration: 'Hey, it is Agent Abrams. I built a system that teaches AI how to do my job. Repeatable skills, reusable workflows, and a teammate that never forgets.',
        duration: 7,
        avatar: true,
      },
      {
        template: 'feature-list',
        title: 'The 4-Phase Skill Loop',
        items: [
          { text: 'Phase 1: Brainstorm — explore intent and requirements', color: '#00D4FF' },
          { text: 'Phase 2: Plan — write a detailed implementation spec', color: '#FF6B35' },
          { text: 'Phase 3: Execute — build in small verified steps', color: '#00E68C' },
          { text: 'Phase 4: Verify — test, review, confirm correctness', color: '#00D4FF' },
        ],
        narration: 'Four phases. Brainstorm to explore intent. Plan to write the spec. Execute to build in small steps. Verify to confirm everything works. Every skill follows this loop.',
        duration: 10,
      },
      {
        template: 'feature-list',
        title: 'The Skill Template',
        items: [
          { text: 'Markdown file with structured frontmatter', color: '#00D4FF' },
          { text: 'Trigger conditions: when should the skill activate', color: '#FF6B35' },
          { text: 'Step-by-step checklist the AI follows', color: '#00E68C' },
          { text: 'Guard rails and quality gates built in', color: '#00D4FF' },
        ],
        narration: 'Each skill is a markdown file. Frontmatter defines when it triggers. A checklist tells the AI exactly what to do. Guard rails prevent mistakes. It is like onboarding a new hire, except the hire never forgets.',
        duration: 10,
      },
      {
        template: 'big-number',
        numbers: [
          { value: 50, suffix: '+', label: 'Skills Created', color: '#00D4FF' },
          { value: 4, label: 'Phase Loop', color: '#FF6B35' },
          { value: 1, label: 'AI Teammate', color: '#00E68C' },
        ],
        narration: 'Over fifty skills built. A four phase loop that never breaks. And one AI teammate that keeps getting better.',
        duration: 7,
      },
      CTA_SLIDE,
    ],
    avatar: AVATAR,
    output: output('skill-system'),
  },

  // 3. animation-loop
  {
    title: 'The Animation Loop That Wouldn\'t Animate',
    slides: [
      {
        template: 'hook',
        headline: '1 Boolean Killed 60fps',
        subtext: '30,000 lines. 3 hours. 1 stale flag.',
        narration: 'Hey, it is Agent Abrams. My animation loop froze. Thirty thousand lines of code. Three hours of debugging. And the fix was a single boolean.',
        duration: 7,
        avatar: true,
      },
      {
        template: 'big-number',
        numbers: [
          { value: 30000, label: 'Lines of Code', color: '#00D4FF' },
          { value: 1, label: 'Stale Boolean', color: '#FF6B35' },
          { value: 3, label: 'Hours Debugging', color: '#00E68C' },
        ],
        narration: 'Thirty thousand lines of code in the render pipeline. One stale boolean flag hidden deep in the state machine. Three hours tracing the call stack until I found it.',
        duration: 8,
      },
      {
        template: 'comparison',
        title: 'The Fix',
        before: { value: '0fps', label: 'Frozen Render Loop' },
        after: { value: '60fps', label: 'Smooth Animation' },
        change: '1 line changed',
        narration: 'Zero frames per second, completely frozen. One line fix. Sixty frames per second, buttery smooth. The flag was being set but never cleared when the animation restarted.',
        duration: 8,
      },
      {
        template: 'feature-list',
        title: 'Lessons Learned',
        items: [
          { text: 'State machines need explicit reset paths', color: '#00D4FF' },
          { text: 'Binary search your render loop, not just your code', color: '#FF6B35' },
          { text: 'The smallest bugs cause the biggest symptoms', color: '#00E68C' },
        ],
        narration: 'Three takeaways. State machines need explicit reset paths. Binary search your render pipeline, not just your code. And always remember: the smallest bugs cause the biggest symptoms.',
        duration: 8,
      },
      CTA_SLIDE,
    ],
    avatar: AVATAR,
    output: output('animation-loop'),
  },

  // 4. parallel-agents-74
  {
    title: 'Parallel Agents: 74 Processes, One Server',
    slides: [
      {
        template: 'hook',
        headline: '74 Processes, One Server',
        subtext: 'Autonomous agents running 24/7 on a single VPS',
        narration: 'Hey, it is Agent Abrams. I run seventy four autonomous processes on a single server. No Kubernetes. No cloud functions. Just one V P S and good process management.',
        duration: 8,
        avatar: true,
      },
      {
        template: 'big-number',
        numbers: [
          { value: 74, label: 'Processes Running', color: '#00D4FF' },
          { value: 1, label: 'VPS Server', color: '#FF6B35' },
          { value: 0, label: 'Unplanned Crashes', color: '#00E68C' },
        ],
        narration: 'Seventy four processes. One single V P S. Zero unplanned crashes. Each agent has its own port, its own health check, and its own restart policy.',
        duration: 8,
      },
      {
        template: 'feature-list',
        title: 'Architecture',
        items: [
          { text: 'PM2 process manager with ecosystem configs', color: '#00D4FF' },
          { text: 'Each agent: own port, own auth, own health endpoint', color: '#FF6B35' },
          { text: 'Watchdog monitors memory, CPU, and uptime', color: '#00E68C' },
          { text: 'Auto-restart on crash with exponential backoff', color: '#00D4FF' },
          { text: 'Centralized logging and Slack alerting', color: '#FF6B35' },
        ],
        narration: 'P M 2 manages every process. Each agent gets its own port, its own auth layer, and a health endpoint. A watchdog tracks memory and C P U. Crashes trigger automatic restarts with backoff. And everything reports to Slack.',
        duration: 12,
      },
      CTA_SLIDE,
    ],
    avatar: AVATAR,
    output: output('parallel-agents-74'),
  },

  // 5. ai-writes-blog
  {
    title: 'When Your AI Writes Its Own Blog',
    slides: [
      {
        template: 'hook',
        headline: 'When Your AI Writes Its Own Blog',
        subtext: 'From empty directory to live site in one session',
        narration: 'Hey, it is Agent Abrams. I gave my AI one task: document what you have built. It created an entire blog from scratch. Posts, styling, deployment. All in one session.',
        duration: 8,
        avatar: true,
      },
      {
        template: 'comparison',
        title: 'The Build',
        before: { value: '0', label: 'Empty Directory' },
        after: { value: 'Live', label: 'Published Blog' },
        change: '1 session',
        narration: 'Started with an empty directory. Ended with a fully deployed blog. Astro framework, markdown posts, custom styling. All generated in a single session.',
        duration: 7,
      },
      {
        template: 'feature-list',
        title: 'The Inception Moment',
        items: [
          { text: 'AI analyzed its own build history for story material', color: '#00D4FF' },
          { text: 'Wrote technically accurate posts about real engineering problems', color: '#FF6B35' },
          { text: 'The blog post about writing the blog is itself written by AI', color: '#00E68C' },
          { text: 'Each post sanitized, fact-checked, and production-ready', color: '#00D4FF' },
        ],
        narration: 'Here is where it gets recursive. The AI analyzed its own build history for material. It wrote accurate posts about real engineering problems it solved. The blog post about creating the blog was itself written by the AI. And every post was sanitized and production ready.',
        duration: 11,
      },
      {
        template: 'big-number',
        numbers: [
          { value: 18, label: 'Posts Published', color: '#00D4FF' },
          { value: 1, label: 'Session to Ship', color: '#FF6B35' },
        ],
        narration: 'Eighteen posts published. One session to ship everything. The AI did not just help build the product. It told the story of building it.',
        duration: 7,
      },
      CTA_SLIDE,
    ],
    avatar: AVATAR,
    output: output('ai-writes-blog'),
  },

  // 6. remote-control
  {
    title: 'Remote Control: Claude Code From Your Phone',
    slides: [
      {
        template: 'hook',
        headline: 'Control Your AI From Your Phone',
        subtext: 'Twenty-four seven agents, mobile monitoring',
        narration: 'Hey, it is Agent Abrams. I built a system that lets me monitor and control seventy plus AI agents from my phone. Anywhere, anytime.',
        duration: 7,
        avatar: true,
      },
      {
        template: 'feature-list',
        title: 'What You Get',
        items: [
          { text: 'Real-time agent status on any device', color: '#00D4FF' },
          { text: 'Start, stop, restart processes remotely', color: '#FF6B35' },
          { text: 'Log streaming to your phone', color: '#00E68C' },
          { text: 'Slack alerts for critical events', color: '#00D4FF' },
          { text: 'Full dashboard in your browser', color: '#FF6B35' },
        ],
        narration: 'Real-time agent status on any device. Start, stop, and restart processes remotely. Stream logs straight to your phone. Slack alerts for anything critical. And a full dashboard that works in any browser.',
        duration: 10,
      },
      {
        template: 'comparison',
        title: 'Before vs After',
        before: { value: 'SSH', label: 'Terminal Only' },
        after: { value: 'Tap', label: 'Mobile Dashboard' },
        change: 'Always connected',
        narration: 'Before, I needed S S H and a terminal to check anything. Now I tap my phone and see everything. Agent health, process logs, error rates. Always connected, zero friction.',
        duration: 7,
      },
      CTA_SLIDE,
    ],
    avatar: AVATAR,
    output: output('remote-control'),
  },

  // 7. identity-split
  {
    title: 'Shipping Day and the Identity Split',
    slides: [
      {
        template: 'hook',
        headline: '2 Identities, 1 Repo',
        subtext: 'Separating public content from private infrastructure',
        narration: 'Hey, it is Agent Abrams. When it came time to ship, I realized my public repo was leaking private infrastructure details. Here is how I split the identity.',
        duration: 7,
        avatar: true,
      },
      {
        template: 'feature-list',
        title: 'The Problem',
        items: [
          { text: 'Public portfolio mixed with private credentials', color: '#FF6B35' },
          { text: 'Git history contained sensitive commit messages', color: '#FF6B35' },
          { text: 'One push could expose internal systems', color: '#FF6B35' },
        ],
        narration: 'Public portfolio code was mixed with private credentials. Git history had commit messages that described internal systems. One careless push could expose everything.',
        duration: 8,
      },
      {
        template: 'feature-list',
        title: 'The Solution',
        items: [
          { text: 'Separate public and private repositories', color: '#00E68C' },
          { text: 'Automated sanitization on every commit', color: '#00D4FF' },
          { text: 'Pre-push hooks that scan for secrets', color: '#00E68C' },
          { text: 'Two git identities, one workflow', color: '#00D4FF' },
        ],
        narration: 'Separate repos for public and private code. Automated sanitization that runs on every commit. Pre push hooks that scan for secrets. Two identities, one clean workflow.',
        duration: 8,
      },
      CTA_SLIDE,
    ],
    avatar: AVATAR,
    output: output('identity-split'),
  },

  // 8. context-windows
  {
    title: 'Building Through the Context Limit',
    slides: [
      {
        template: 'hook',
        headline: 'Building Through the Context Limit',
        subtext: 'When your AI forgets what it just built',
        narration: 'Hey, it is Agent Abrams. Halfway through a massive build session, my AI hit context compaction and forgot what it was doing. Here is how I kept building anyway.',
        duration: 8,
        avatar: true,
      },
      {
        template: 'big-number',
        numbers: [
          { value: 100, suffix: '+', label: 'Patterns Built', color: '#00D4FF' },
          { value: 9, label: 'Pages of Context', color: '#FF6B35' },
          { value: 1, label: 'Compaction Event', color: '#00E68C' },
        ],
        narration: 'Over a hundred patterns built in one session. Nine pages of accumulated context. And then, one compaction event wiped the working memory clean.',
        duration: 8,
      },
      {
        template: 'feature-list',
        title: 'Strategies That Work',
        items: [
          { text: 'Progress files the AI reads on every resume', color: '#00D4FF' },
          { text: 'Skill files that carry knowledge across sessions', color: '#FF6B35' },
          { text: 'Small commits so context can be reconstructed', color: '#00E68C' },
          { text: 'Explicit handoff notes between sessions', color: '#00D4FF' },
        ],
        narration: 'Progress files the AI reads on every resume. Skill files that carry institutional knowledge across sessions. Small commits so context can be rebuilt from git. And explicit handoff notes that bridge the gap between sessions.',
        duration: 10,
      },
      CTA_SLIDE,
    ],
    avatar: AVATAR,
    output: output('context-windows'),
  },

  // 9. paper-trading
  {
    title: '100 Portfolios, Zero Human Traders',
    slides: [
      {
        template: 'hook',
        headline: '100 Portfolios, Zero Human Traders',
        subtext: 'Autonomous paper trading at scale',
        narration: 'Hey, it is Agent Abrams. I built a system that runs one hundred paper trading portfolios simultaneously. Each one with a unique strategy. No human traders involved.',
        duration: 8,
        avatar: true,
      },
      {
        template: 'big-number',
        numbers: [
          { value: 100, label: 'Portfolios', color: '#00D4FF' },
          { value: 100, label: 'Unique Strategies', color: '#FF6B35' },
          { value: 0, label: 'Human Traders', color: '#00E68C' },
        ],
        narration: 'One hundred portfolios running in parallel. Each one using a unique trading strategy. Zero human traders managing any of them. Pure autonomous execution.',
        duration: 8,
      },
      {
        template: 'feature-list',
        title: 'How It Works',
        items: [
          { text: 'Each portfolio has independent risk parameters', color: '#00D4FF' },
          { text: 'Market data streams in real-time', color: '#FF6B35' },
          { text: 'Automated position sizing and rebalancing', color: '#00E68C' },
          { text: 'Performance tracked and compared daily', color: '#00D4FF' },
        ],
        narration: 'Each portfolio runs its own risk parameters independently. Market data streams in real-time. Positions are sized and rebalanced automatically. And every portfolio is performance is tracked and compared daily.',
        duration: 9,
      },
      CTA_SLIDE,
    ],
    avatar: AVATAR,
    output: output('paper-trading'),
  },

  // 10. vendor-onboarding
  {
    title: 'The Machine That Builds Machines',
    slides: [
      {
        template: 'hook',
        headline: 'The Machine That Builds Machines',
        subtext: 'Auto-generating entire onboarding pipelines',
        narration: 'Hey, it is Agent Abrams. I built a system that generates new onboarding agents automatically. One command creates a complete pipeline. The machine builds machines.',
        duration: 8,
        avatar: true,
      },
      {
        template: 'big-number',
        numbers: [
          { value: 17, label: 'Agents Generated', color: '#00D4FF' },
          { value: 187, label: 'Steps Automated', color: '#FF6B35' },
          { value: 0, label: 'Manual Work', color: '#00E68C' },
        ],
        narration: 'Seventeen agents generated from templates. One hundred eighty seven steps automated end to end. Zero manual work required once the generator runs.',
        duration: 8,
      },
      {
        template: 'feature-list',
        title: 'The Generator Pattern',
        items: [
          { text: 'Template agent with pluggable data sources', color: '#00D4FF' },
          { text: 'Auto-configured scraper, enricher, and publisher', color: '#FF6B35' },
          { text: 'Each generated agent is immediately production-ready', color: '#00E68C' },
          { text: 'New data source in minutes, not days', color: '#00D4FF' },
        ],
        narration: 'A template agent with pluggable data sources. Auto configured scraper, enricher, and publisher. Every generated agent is production ready on creation. Adding a new data source takes minutes, not days.',
        duration: 10,
      },
      CTA_SLIDE,
    ],
    avatar: AVATAR,
    output: output('vendor-onboarding'),
  },

  // 11. video-sanitizer
  {
    title: 'Auto-Sanitizing Video with AI',
    slides: [
      {
        template: 'hook',
        headline: 'Auto-Sanitizing Video with AI',
        subtext: 'OCR, pattern matching, and automated blur',
        narration: 'Hey, it is Agent Abrams. Before publishing any video, every single frame is scanned for sensitive content. Two hundred fourteen patterns guard against data leaks.',
        duration: 8,
        avatar: true,
      },
      {
        template: 'big-number',
        numbers: [
          { value: 214, label: 'Patterns Checked', color: '#00D4FF' },
          { value: 287, label: 'Frames Scanned', color: '#FF6B35' },
          { value: 0, label: 'Data Leaks', color: '#00E68C' },
        ],
        narration: 'Two hundred fourteen regex patterns. Two hundred eighty seven frames scanned per video. Zero data leaks in any published content.',
        duration: 8,
      },
      {
        template: 'feature-list',
        title: 'The Pipeline',
        items: [
          { text: 'OCR extracts text from every video frame', color: '#00D4FF' },
          { text: 'Regex patterns detect API keys, URLs, credentials', color: '#FF6B35' },
          { text: 'Automated blur applied to sensitive regions', color: '#00E68C' },
          { text: 'Human review step before final publish', color: '#00D4FF' },
        ],
        narration: 'O C R extracts text from every frame. Regex patterns flag A P I keys, U R Ls, and credentials. Automated blur covers sensitive regions. And a human review step catches anything the automation misses.',
        duration: 10,
      },
      CTA_SLIDE,
    ],
    avatar: AVATAR,
    output: output('video-sanitizer'),
  },

  // 12. content-sanitizer
  {
    title: 'The Content Sanitizer That Guards Every Channel',
    slides: [
      {
        template: 'hook',
        headline: '200+ Patterns Guard Every Output',
        subtext: 'Content sanitization across all channels',
        narration: 'Hey, it is Agent Abrams. Every piece of content that leaves my system passes through a sanitizer. Blog posts, videos, social media, documentation. Over two hundred patterns guarding every channel.',
        duration: 9,
        avatar: true,
      },
      {
        template: 'feature-list',
        title: '5 Channels Protected',
        items: [
          { text: 'Blog posts: technical content stripped of internals', color: '#00D4FF' },
          { text: 'Video frames: OCR scan and automated blur', color: '#FF6B35' },
          { text: 'Social media: no vendor names or credentials', color: '#00E68C' },
          { text: 'Documentation: sanitized code examples', color: '#00D4FF' },
          { text: 'Git commits: pre-commit hooks catch leaks', color: '#FF6B35' },
        ],
        narration: 'Five channels locked down. Blog posts scrubbed of internal references. Video frames scanned with O C R. Social posts stripped of vendor names. Documentation cleaned of real credentials. And pre commit hooks that catch leaks before they hit the repo.',
        duration: 12,
      },
      {
        template: 'big-number',
        numbers: [
          { value: 5, label: 'Channels Protected', color: '#00D4FF' },
          { value: 200, suffix: '+', label: 'Regex Patterns', color: '#FF6B35' },
          { value: 0, label: 'Leaks', color: '#00E68C' },
        ],
        narration: 'Five output channels. Over two hundred regex patterns. Zero leaks across all published content.',
        duration: 7,
      },
      CTA_SLIDE,
    ],
    avatar: AVATAR,
    output: output('content-sanitizer'),
  },

  // 13. scraper-blitz
  {
    title: 'The Scraper Blitz',
    slides: [
      {
        template: 'hook',
        headline: '25 Scrapers, One Night, Zero Babysitting',
        subtext: 'Self-healing browsers and per-record commits',
        narration: 'Hey, it is Agent Abrams. I launched twenty five web scrapers overnight. Self healing browser sessions. Per record commits. When I woke up, everything had finished.',
        duration: 8,
        avatar: true,
      },
      {
        template: 'feature-list',
        title: 'Self-Healing Design',
        items: [
          { text: 'Browser sessions auto-restart on crash', color: '#00D4FF' },
          { text: 'Per-record database commits prevent data loss', color: '#FF6B35' },
          { text: 'Rate limiting adapts to each target\'s response time', color: '#00E68C' },
          { text: 'Failed pages queued for automatic retry', color: '#00D4FF' },
        ],
        narration: 'Browser sessions restart themselves on crash. Every record commits individually so nothing is lost. Rate limiting adapts dynamically to each target. And failed pages get queued for automatic retry.',
        duration: 10,
      },
      {
        template: 'big-number',
        numbers: [
          { value: 25, label: 'Scrapers Running', color: '#00D4FF' },
          { value: 1, label: 'Night', color: '#FF6B35' },
          { value: 0, label: 'Manual Intervention', color: '#00E68C' },
        ],
        narration: 'Twenty five scrapers. One night. Zero manual interventions. The system handled every error, every timeout, every rate limit on its own.',
        duration: 7,
      },
      CTA_SLIDE,
    ],
    avatar: AVATAR,
    output: output('scraper-blitz'),
  },

  // 14. parallel-at-scale
  {
    title: 'Parallel Agents at Scale',
    slides: [
      {
        template: 'hook',
        headline: '94K to 118K in One Session',
        subtext: '6 parallel agents, 15 new scrapers',
        narration: 'Hey, it is Agent Abrams. In one session I spun up six parallel agents and fifteen new scrapers. Product count jumped from ninety four thousand to one hundred eighteen thousand.',
        duration: 8,
        avatar: true,
      },
      {
        template: 'big-number',
        numbers: [
          { value: 6, label: 'Parallel Agents', color: '#00D4FF' },
          { value: 15, label: 'New Scrapers', color: '#FF6B35' },
          { value: 25, suffix: '%', label: 'Catalog Growth', color: '#00E68C' },
        ],
        narration: 'Six agents running in parallel. Fifteen new scrapers built and deployed. Twenty five percent catalog growth in a single session.',
        duration: 8,
      },
      {
        template: 'comparison',
        title: 'Catalog Growth',
        before: { value: '94K', label: 'Products Before' },
        after: { value: '118K', label: 'Products After' },
        change: '+24,000 products',
        narration: 'Ninety four thousand products at the start. One hundred eighteen thousand when it finished. Twenty four thousand new products ingested, enriched, and published automatically.',
        duration: 8,
      },
      CTA_SLIDE,
    ],
    avatar: AVATAR,
    output: output('parallel-at-scale'),
  },

  // 15. 60k-products
  {
    title: '60,000 Products While You Sleep',
    slides: [
      {
        template: 'hook',
        headline: '60,000 Products While You Sleep',
        subtext: 'End-to-end autonomous product management',
        narration: 'Hey, it is Agent Abrams. My system manages sixty thousand products autonomously. Crawling, enriching, validating, and publishing. All while I sleep.',
        duration: 8,
        avatar: true,
      },
      {
        template: 'feature-list',
        title: 'The Pipeline',
        items: [
          { text: 'Crawlers scrape 40+ data sources nightly', color: '#00D4FF' },
          { text: 'AI enrichment adds metadata and classifications', color: '#FF6B35' },
          { text: 'Validation gates block incomplete products', color: '#00E68C' },
          { text: 'Auto-publish passes quality threshold to the store', color: '#00D4FF' },
        ],
        narration: 'Crawlers hit over forty data sources every night. AI enrichment adds metadata, tags, and classifications. Validation gates block anything incomplete. And products that pass the quality threshold publish automatically.',
        duration: 10,
      },
      {
        template: 'big-number',
        numbers: [
          { value: 60, suffix: 'K', label: 'Products Managed', color: '#00D4FF' },
          { value: 40, suffix: '+', label: 'Data Sources', color: '#FF6B35' },
          { value: 0, label: 'Human Intervention', color: '#00E68C' },
        ],
        narration: 'Sixty thousand products. Forty plus data sources. Near zero human intervention required. The system runs itself.',
        duration: 7,
      },
      CTA_SLIDE,
    ],
    avatar: AVATAR,
    output: output('60k-products'),
  },

  // 16. data-quality
  {
    title: 'Data Quality That Actually Ships',
    slides: [
      {
        template: 'hook',
        headline: 'Data Quality That Actually Ships',
        subtext: 'Validation gates that catch real problems',
        narration: 'Hey, it is Agent Abrams. Data quality is not a report you file. It is a gate that blocks bad data from ever reaching production. Here is how I built quality checks that actually ship.',
        duration: 8,
        avatar: true,
      },
      {
        template: 'feature-list',
        title: 'Validation Gates',
        items: [
          { text: 'Required fields enforced before publish', color: '#00D4FF' },
          { text: 'Image quality and dimension checks', color: '#FF6B35' },
          { text: 'Duplicate detection across the entire catalog', color: '#00E68C' },
          { text: 'Price sanity checks with vendor baselines', color: '#00D4FF' },
          { text: 'Auto-quarantine for anything that fails', color: '#FF6B35' },
        ],
        narration: 'Required fields enforced before anything publishes. Image quality and dimension checks on every upload. Duplicate detection across the full catalog. Price sanity checks against vendor baselines. And automatic quarantine for anything that fails.',
        duration: 11,
      },
      {
        template: 'big-number',
        numbers: [
          { value: 99, suffix: '%', label: 'Data Completeness', color: '#00D4FF' },
          { value: 0, label: 'Bad Products Published', color: '#FF6B35' },
        ],
        narration: 'Ninety nine percent data completeness across the catalog. Zero bad products published to the live store. Quality is not optional. It is the default.',
        duration: 7,
      },
      CTA_SLIDE,
    ],
    avatar: AVATAR,
    output: output('data-quality'),
  },

  // 17. three-tier-auth
  {
    title: 'Three-Tier Auth, One Founder, No Dev Team',
    slides: [
      {
        template: 'hook',
        headline: 'Three Tiers, Zero Dev Team',
        subtext: 'Enterprise-grade authentication built solo',
        narration: 'Hey, it is Agent Abrams. I built a three tier authentication system covering over two hundred A P I routes. No dev team. No security consultants. Just AI-assisted engineering.',
        duration: 8,
        avatar: true,
      },
      {
        template: 'feature-list',
        title: 'The Architecture',
        items: [
          { text: 'Tier 1: Admin — full system access with audit trail', color: '#00D4FF' },
          { text: 'Tier 2: Staff — scoped access per department', color: '#FF6B35' },
          { text: 'Tier 3: End User — public-facing with rate limits', color: '#00E68C' },
        ],
        narration: 'Three tiers. Admin gets full system access with an audit trail. Staff gets scoped access per department. End users get public facing access with rate limits. Clean separation.',
        duration: 9,
      },
      {
        template: 'big-number',
        numbers: [
          { value: 201, label: 'API Routes Protected', color: '#00D4FF' },
          { value: 26, label: 'Line Guard Function', color: '#FF6B35' },
          { value: 1, label: 'Database for Credentials', color: '#00E68C' },
        ],
        narration: 'Two hundred one A P I routes protected. One twenty six line guard function handles all authorization. A single database stores all credentials with proper hashing.',
        duration: 8,
      },
      {
        template: 'comparison',
        title: 'Cost Comparison',
        before: { value: '$60K', label: 'Traditional Dev Team' },
        after: { value: 'Days', label: 'AI-Assisted Build' },
        change: 'Same security, fraction of cost',
        narration: 'A traditional team would cost forty to eighty thousand dollars. I built it in days with AI assistance. Same security standards. A fraction of the cost.',
        duration: 7,
      },
      CTA_SLIDE,
    ],
    avatar: AVATAR,
    output: output('three-tier-auth'),
  },

  // 18. prompt-caching
  {
    title: 'Prompt Caching Is Everything',
    slides: [
      {
        template: 'hook',
        headline: 'Prompt Caching Is Everything',
        subtext: 'The optimization that pays for itself',
        narration: 'Hey, it is Agent Abrams. One optimization cut my AI costs dramatically. Prompt caching. It changes how you build agent systems.',
        duration: 7,
        avatar: true,
      },
      {
        template: 'big-number',
        numbers: [
          { value: 90, suffix: '%', label: 'Cache Hit Rate', color: '#00D4FF' },
          { value: 10, suffix: 'x', label: 'Cost Reduction', color: '#FF6B35' },
        ],
        narration: 'Ninety percent cache hit rate across all agent calls. Up to ten X cost reduction on input tokens. The savings compound as your system scales.',
        duration: 7,
      },
      {
        template: 'feature-list',
        title: 'The Pattern for Agent Systems',
        items: [
          { text: 'System prompts cached as stable prefixes', color: '#00D4FF' },
          { text: 'Skill files loaded once, reused across sessions', color: '#FF6B35' },
          { text: 'Tool definitions pinned at the top of context', color: '#00E68C' },
          { text: 'Dynamic content appended after cached blocks', color: '#00D4FF' },
        ],
        narration: 'System prompts cached as stable prefixes. Skill files loaded once and reused across sessions. Tool definitions pinned at the top of context. And dynamic content always appended after the cached blocks, never before.',
        duration: 10,
      },
      {
        template: 'comparison',
        title: 'With vs Without Caching',
        before: { value: '$$$', label: 'Every Token Billed' },
        after: { value: '¢', label: 'Cached Reads' },
        change: 'Up to 10x savings',
        narration: 'Without caching, every token is billed at full price. With caching, repeated prefixes cost pennies. At scale, that is the difference between viable and bankrupt.',
        duration: 8,
      },
      CTA_SLIDE,
    ],
    avatar: AVATAR,
    output: output('prompt-caching'),
  },
];

// Write all configs
configs.forEach((config, i) => {
  const slug = path.basename(config.output.landscape).replace('-landscape.mp4', '');
  const filePath = path.join(CONFIGS_DIR, `${String(i + 1).padStart(2, '0')}-${slug}.json`);
  fs.writeFileSync(filePath, JSON.stringify(config, null, 2));
  console.log(`Written: ${filePath}`);
});

console.log(`\nTotal: ${configs.length} configs created`);