<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jordan Atchison</title>
    <description>The latest articles on DEV Community by Jordan Atchison (@jordan_atchison_890b3f79f).</description>
    <link>https://dev.to/jordan_atchison_890b3f79f</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4207427%2F92140f87-a4ab-4d67-848d-096ebec7a023.png</url>
      <title>DEV Community: Jordan Atchison</title>
      <link>https://dev.to/jordan_atchison_890b3f79f</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jordan_atchison_890b3f79f"/>
    <language>en</language>
    <item>
      <title>How to build a 10-minute AI video with Claude Code (and what breaks)</title>
      <dc:creator>Jordan Atchison</dc:creator>
      <pubDate>Mon, 26 Oct 2026 01:45:47 +0000</pubDate>
      <link>https://dev.to/jordan_atchison_890b3f79f/how-to-build-a-10-minute-ai-video-with-claude-code-and-what-breaks-37ie</link>
      <guid>https://dev.to/jordan_atchison_890b3f79f/how-to-build-a-10-minute-ai-video-with-claude-code-and-what-breaks-37ie</guid>
      <description>&lt;p&gt;You can already get Claude Code to write a script and call an image model. Turning that into a 10-minute narrated YouTube video, with the same character from the first shot to the last and captions that land on the right word, is a different problem. The script is the easy part. Everything after it is wiring and bookkeeping.&lt;/p&gt;

&lt;p&gt;The same build works with Codex or the Gemini CLI. Anything that speaks MCP and can call tools in a loop will do.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A renderer&lt;/strong&gt; for the final cut. &lt;a href="https://www.remotion.dev" rel="noopener noreferrer"&gt;Remotion&lt;/a&gt; builds videos in React.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An image service&lt;/strong&gt; for the stills behind each scene.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A motion service&lt;/strong&gt; to animate stills into shots. &lt;a href="https://fal.ai" rel="noopener noreferrer"&gt;fal&lt;/a&gt; puts the current video models behind one API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A voice service&lt;/strong&gt; for narration and word-level timings.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Claude Code is the conductor. It plans the script, decides what each scene needs, and calls each service through its API or MCP server.&lt;/p&gt;

&lt;h2&gt;
  
  
  The loop
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Write the script, then split it into scenes.&lt;/li&gt;
&lt;li&gt;Generate a still for each scene.&lt;/li&gt;
&lt;li&gt;Animate each still into a shot.&lt;/li&gt;
&lt;li&gt;Generate the narration and word timings.&lt;/li&gt;
&lt;li&gt;Put shots, audio, and captions on a Remotion timeline and render.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For a 30-second video you can have this working in an afternoon.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it breaks at 10 minutes
&lt;/h2&gt;

&lt;p&gt;No model renders ten continuous minutes. A single generation tops out at a few seconds (Veo 3.1 caps at 8), so a long video is always dozens of short clips stitched together. Three things stop being afterthoughts:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consistency.&lt;/strong&gt; The image model has no memory between calls. By shot ten your main character has a different face and the room is a different room. The fix is managing reference images yourself: one clean reference per recurring character and place, passed into every shot that needs it and labelled inline (&lt;code&gt;image_1 is the emperor, image_2 is the throne room&lt;/code&gt;). A multi-view character sheet (front, three-quarter, profile) helps when a shot needs a new angle. That bookkeeping grows with every scene.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Timing.&lt;/strong&gt; Captions have to sit on the exact word being spoken. You get word timings from the voice service, but mapping every timing onto every caption onto every scene's frame range is on you. One off-by-one and the subtitles drift for the rest of the video.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;State.&lt;/strong&gt; A project this long doesn't fit in a context window. Which scenes are done? Which failed? Which references go where? Once the agent forgets, it redoes work or skips it, and you're babysitting a spreadsheet of shot statuses.&lt;/p&gt;

&lt;p&gt;None of this is hard on its own. Together, the glue becomes the whole project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Skipping the glue
&lt;/h2&gt;

&lt;p&gt;That glue is what we built &lt;a href="https://framesail.com/long-form-video-generator" rel="noopener noreferrer"&gt;Framesail&lt;/a&gt; to handle. It's a &lt;a href="https://framesail.com/long-form-video-generator" rel="noopener noreferrer"&gt;long-form AI video generator&lt;/a&gt; you can drive from Claude Code over one MCP connection: it keeps your characters and settings the same in every shot, sets captions on the right words, and tracks every scene so the agent can stop and pick up in a new session without losing its place.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http framesail https://api.framesail.com/mcp &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer YOUR_FRAMESAIL_KEY"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you're making short clips, the from-scratch stack is the right call. If you're making long YouTube videos, the glue is the work.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://framesail.com/blog/long-form-video-with-claude-code" rel="noopener noreferrer"&gt;Framesail blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claudecode</category>
      <category>mcp</category>
      <category>video</category>
    </item>
  </channel>
</rss>
