<?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: Alex Shev</title>
    <description>The latest articles on DEV Community by Alex Shev (@alexshev).</description>
    <link>https://dev.to/alexshev</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%2F3812101%2Fa5dfb3f9-d006-41a1-a868-995b7f219269.png</url>
      <title>DEV Community: Alex Shev</title>
      <link>https://dev.to/alexshev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alexshev"/>
    <language>en</language>
    <item>
      <title>Your Wix Site Is Not the Problem. The Migration Workflow Is.</title>
      <dc:creator>Alex Shev</dc:creator>
      <pubDate>Fri, 19 Jun 2026 02:32:16 +0000</pubDate>
      <link>https://dev.to/alexshev/your-wix-site-is-not-the-problem-the-migration-workflow-is-4b4c</link>
      <guid>https://dev.to/alexshev/your-wix-site-is-not-the-problem-the-migration-workflow-is-4b4c</guid>
      <description>&lt;p&gt;Wix is good at the thing it was built for.&lt;/p&gt;

&lt;p&gt;It lets someone get a website online without opening a repo, choosing a framework, setting up hosting, wiring a CMS, or learning deployment.&lt;/p&gt;

&lt;p&gt;That is useful.&lt;/p&gt;

&lt;p&gt;For a lot of businesses, a Wix site is not a mistake. It is the reason they had a website at all.&lt;/p&gt;

&lt;p&gt;The problem usually starts later.&lt;/p&gt;

&lt;p&gt;The site grows. The business changes. Marketing wants better landing pages. SEO becomes more serious. Someone wants custom checkout logic. Someone wants the blog to behave differently. Someone wants better performance. Someone wants a dashboard, a pricing page, a gated area, a headless CMS, or a proper deployment workflow.&lt;/p&gt;

&lt;p&gt;And suddenly the team says:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Can we move this Wix site to React?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That question sounds simple.&lt;/p&gt;

&lt;p&gt;It is not.&lt;/p&gt;

&lt;p&gt;There is no clean universal "export to Next.js" button for the real version of this job.&lt;/p&gt;

&lt;p&gt;You are not just moving pixels.&lt;/p&gt;

&lt;p&gt;You are moving a live website with content, layout decisions, SEO assumptions, forms, media, tracking, business logic, and usually a few messy surprises nobody documented.&lt;/p&gt;

&lt;p&gt;That is why Wix-to-React migration is a workflow problem, not a framework problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  The naive version of this task
&lt;/h2&gt;

&lt;p&gt;The naive version sounds like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Take this Wix site and rebuild it in React.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An AI agent can try.&lt;/p&gt;

&lt;p&gt;It can open the page, inspect the layout, create a component, copy some text, approximate the styling, and produce something that looks close enough in a screenshot.&lt;/p&gt;

&lt;p&gt;That is fine for a demo.&lt;/p&gt;

&lt;p&gt;It is not enough for a migration.&lt;/p&gt;

&lt;p&gt;Because the first screenshot is not the website.&lt;/p&gt;

&lt;p&gt;The website is also:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;all the pages you forgot to mention&lt;/li&gt;
&lt;li&gt;mobile layouts&lt;/li&gt;
&lt;li&gt;navigation states&lt;/li&gt;
&lt;li&gt;images and files&lt;/li&gt;
&lt;li&gt;redirects&lt;/li&gt;
&lt;li&gt;metadata&lt;/li&gt;
&lt;li&gt;forms&lt;/li&gt;
&lt;li&gt;blog posts&lt;/li&gt;
&lt;li&gt;product pages&lt;/li&gt;
&lt;li&gt;CMS collections&lt;/li&gt;
&lt;li&gt;tracking scripts&lt;/li&gt;
&lt;li&gt;accessibility issues&lt;/li&gt;
&lt;li&gt;weird spacing that only exists on one page&lt;/li&gt;
&lt;li&gt;business content that is hidden behind menus&lt;/li&gt;
&lt;li&gt;SEO URLs that should not break&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you treat the job like a design clone, you miss the operational work.&lt;/p&gt;

&lt;p&gt;If you treat it like an operational migration, the task becomes much clearer.&lt;/p&gt;




&lt;h2&gt;
  
  
  The real question
&lt;/h2&gt;

&lt;p&gt;The real question is not:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Can React recreate this page?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Of course it can.&lt;/p&gt;

&lt;p&gt;The better question is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What exactly needs to survive the move?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That question changes the whole workflow.&lt;/p&gt;

&lt;p&gt;A brochure site with five static pages is one thing.&lt;/p&gt;

&lt;p&gt;A Wix site with blog content, member areas, forms, stores, bookings, and SEO history is another.&lt;/p&gt;

&lt;p&gt;For a small static site, you might rebuild everything in Next.js and move on.&lt;/p&gt;

&lt;p&gt;For a site using Wix CMS or Wix Stores, you have decisions to make:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;do you migrate the data out of Wix?&lt;/li&gt;
&lt;li&gt;do you keep Wix as a headless backend?&lt;/li&gt;
&lt;li&gt;do you recreate the CMS somewhere else?&lt;/li&gt;
&lt;li&gt;do you preserve the URL structure?&lt;/li&gt;
&lt;li&gt;do you rebuild forms manually?&lt;/li&gt;
&lt;li&gt;do you map products to a new ecommerce system?&lt;/li&gt;
&lt;li&gt;do you keep any Wix SDK integration?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are not code-generation questions.&lt;/p&gt;

&lt;p&gt;They are migration design questions.&lt;/p&gt;

&lt;p&gt;And if you skip them, the React app may look fine while the business workflow breaks.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why agents need a skill for this
&lt;/h2&gt;

&lt;p&gt;AI agents are pretty good at writing React components.&lt;/p&gt;

&lt;p&gt;They are less reliable when the task is open-ended and the definition of "done" is fuzzy.&lt;/p&gt;

&lt;p&gt;That is exactly what a Wix migration is.&lt;/p&gt;

&lt;p&gt;Without a workflow, the agent might do the most obvious thing:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;open the homepage&lt;/li&gt;
&lt;li&gt;copy the visual layout&lt;/li&gt;
&lt;li&gt;create a few components&lt;/li&gt;
&lt;li&gt;call it a migration&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;But a real migration needs a more boring sequence:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;inventory -&amp;gt; classify -&amp;gt; extract -&amp;gt; rebuild -&amp;gt; migrate data -&amp;gt; verify -&amp;gt; report gaps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is not glamorous.&lt;/p&gt;

&lt;p&gt;It is also the difference between a useful migration and a pretty mockup.&lt;/p&gt;

&lt;p&gt;This is where Terminal Skills becomes relevant.&lt;/p&gt;

&lt;p&gt;Terminal Skills is a catalog of reusable skills for AI agents. The point is not to give the agent one magic command. The point is to give it a repeatable operating procedure.&lt;/p&gt;

&lt;p&gt;For this exact problem, the useful skill is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wix-to-react
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The skill page is here:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://terminalskills.io/skills/wix-to-react
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important part is the shape of the workflow.&lt;/p&gt;

&lt;p&gt;It tells the agent to treat a Wix-to-React conversion as a migration with inspection, decisions, preservation rules, and verification, not as a one-shot clone.&lt;/p&gt;




&lt;h2&gt;
  
  
  What a Wix-to-React workflow should do first
&lt;/h2&gt;

&lt;p&gt;The first step should not be code.&lt;/p&gt;

&lt;p&gt;The first step should be inventory.&lt;/p&gt;

&lt;p&gt;Before the agent builds anything, it should answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how many pages exist?&lt;/li&gt;
&lt;li&gt;which pages are public?&lt;/li&gt;
&lt;li&gt;which pages are hidden or linked only from menus?&lt;/li&gt;
&lt;li&gt;what content is static?&lt;/li&gt;
&lt;li&gt;what content comes from Wix CMS?&lt;/li&gt;
&lt;li&gt;are there blog posts?&lt;/li&gt;
&lt;li&gt;are there products?&lt;/li&gt;
&lt;li&gt;are there forms?&lt;/li&gt;
&lt;li&gt;are there bookings, events, or members-only areas?&lt;/li&gt;
&lt;li&gt;what scripts are installed?&lt;/li&gt;
&lt;li&gt;what URLs need to be preserved?&lt;/li&gt;
&lt;li&gt;what assets need to be downloaded?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not busywork.&lt;/p&gt;

&lt;p&gt;This prevents the classic migration failure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The homepage was rebuilt, but half the website disappeared.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The homepage is usually the easiest page.&lt;/p&gt;

&lt;p&gt;The risk is in the boring pages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;thank-you pages&lt;/li&gt;
&lt;li&gt;old campaign landing pages&lt;/li&gt;
&lt;li&gt;policy pages&lt;/li&gt;
&lt;li&gt;blog detail templates&lt;/li&gt;
&lt;li&gt;category pages&lt;/li&gt;
&lt;li&gt;product variants&lt;/li&gt;
&lt;li&gt;forms connected to business processes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If those pages are not inventoried, they are easy to lose.&lt;/p&gt;




&lt;h2&gt;
  
  
  The second step is classification
&lt;/h2&gt;

&lt;p&gt;Once you know what exists, you need to classify it.&lt;/p&gt;

&lt;p&gt;Not every part of a Wix site should be migrated the same way.&lt;/p&gt;

&lt;p&gt;I would separate it like this:&lt;/p&gt;

&lt;h3&gt;
  
  
  Static marketing pages
&lt;/h3&gt;

&lt;p&gt;These are usually safe to rebuild directly in React or Next.js.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;homepage&lt;/li&gt;
&lt;li&gt;about page&lt;/li&gt;
&lt;li&gt;service pages&lt;/li&gt;
&lt;li&gt;contact page&lt;/li&gt;
&lt;li&gt;pricing page&lt;/li&gt;
&lt;li&gt;landing pages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent can rebuild these as components, sections, layouts, and reusable content blocks.&lt;/p&gt;

&lt;h3&gt;
  
  
  CMS-driven content
&lt;/h3&gt;

&lt;p&gt;This needs a data decision.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;blog posts&lt;/li&gt;
&lt;li&gt;case studies&lt;/li&gt;
&lt;li&gt;team members&lt;/li&gt;
&lt;li&gt;locations&lt;/li&gt;
&lt;li&gt;service areas&lt;/li&gt;
&lt;li&gt;resource libraries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can migrate this to another CMS, keep it in files, move it into a database, or use Wix as a headless backend through the Wix SDK.&lt;/p&gt;

&lt;p&gt;But the decision needs to be explicit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Business logic
&lt;/h3&gt;

&lt;p&gt;This is where a screenshot clone fails badly.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;forms&lt;/li&gt;
&lt;li&gt;bookings&lt;/li&gt;
&lt;li&gt;ecommerce&lt;/li&gt;
&lt;li&gt;member areas&lt;/li&gt;
&lt;li&gt;gated downloads&lt;/li&gt;
&lt;li&gt;payment flows&lt;/li&gt;
&lt;li&gt;email automations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are not visual elements.&lt;/p&gt;

&lt;p&gt;They are workflows.&lt;/p&gt;

&lt;p&gt;If the old site uses Wix Forms or Wix Stores, the new React app needs a replacement plan.&lt;/p&gt;

&lt;h3&gt;
  
  
  SEO and analytics
&lt;/h3&gt;

&lt;p&gt;This is easy to forget because it does not show up in the page design.&lt;/p&gt;

&lt;p&gt;But it matters.&lt;/p&gt;

&lt;p&gt;The migration should preserve or map:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;page titles&lt;/li&gt;
&lt;li&gt;meta descriptions&lt;/li&gt;
&lt;li&gt;canonical URLs&lt;/li&gt;
&lt;li&gt;open graph images&lt;/li&gt;
&lt;li&gt;headings&lt;/li&gt;
&lt;li&gt;structured data&lt;/li&gt;
&lt;li&gt;redirects&lt;/li&gt;
&lt;li&gt;analytics events&lt;/li&gt;
&lt;li&gt;pixels&lt;/li&gt;
&lt;li&gt;conversion tracking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a business already gets traffic from the Wix site, migration is not just a design task.&lt;/p&gt;

&lt;p&gt;It is a traffic-preservation task.&lt;/p&gt;




&lt;h2&gt;
  
  
  Rebuilding the UI is the easy part
&lt;/h2&gt;

&lt;p&gt;Once the inventory and classification are done, the React work becomes much easier.&lt;/p&gt;

&lt;p&gt;The agent can create:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a layout system&lt;/li&gt;
&lt;li&gt;shared header and footer&lt;/li&gt;
&lt;li&gt;reusable section components&lt;/li&gt;
&lt;li&gt;page templates&lt;/li&gt;
&lt;li&gt;image components&lt;/li&gt;
&lt;li&gt;content loaders&lt;/li&gt;
&lt;li&gt;route structure&lt;/li&gt;
&lt;li&gt;SEO metadata helpers&lt;/li&gt;
&lt;li&gt;form components&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where React and Next.js shine.&lt;/p&gt;

&lt;p&gt;Instead of editing every page manually inside a visual builder, you can create a system.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;components/
  Header.tsx
  Footer.tsx
  Hero.tsx
  ServiceGrid.tsx
  TestimonialSection.tsx
  ContactForm.tsx

app/
  page.tsx
  about/page.tsx
  services/[slug]/page.tsx
  blog/[slug]/page.tsx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal is not to recreate Wix as code.&lt;/p&gt;

&lt;p&gt;The goal is to turn the site into a maintainable product.&lt;/p&gt;

&lt;p&gt;That means reusable components, clear content sources, predictable routes, and a deployment workflow the team can understand.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Wix SDK option
&lt;/h2&gt;

&lt;p&gt;There is one important nuance.&lt;/p&gt;

&lt;p&gt;Moving to React does not always mean abandoning Wix completely.&lt;/p&gt;

&lt;p&gt;For some teams, Wix still owns useful business data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;products&lt;/li&gt;
&lt;li&gt;CMS collections&lt;/li&gt;
&lt;li&gt;bookings&lt;/li&gt;
&lt;li&gt;members&lt;/li&gt;
&lt;li&gt;blog content&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In that case, the migration may become:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;React/Next.js frontend + Wix as backend
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is where &lt;code&gt;@wix/sdk&lt;/code&gt; can matter.&lt;/p&gt;

&lt;p&gt;Instead of ripping everything out immediately, the new app can use Wix data as a headless backend while the frontend becomes custom.&lt;/p&gt;

&lt;p&gt;That is not the right answer for every project.&lt;/p&gt;

&lt;p&gt;But it is a real migration option.&lt;/p&gt;

&lt;p&gt;And it is exactly the kind of decision an agent should surface instead of guessing.&lt;/p&gt;

&lt;p&gt;A good workflow should say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;If the site depends on Wix CMS, Stores, Blog, or Forms, decide whether to migrate the data out or keep Wix as a backend before rebuilding those features.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is a much safer instruction than:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Convert Wix to React.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Verification matters more than generation
&lt;/h2&gt;

&lt;p&gt;The most dangerous part of this workflow is false confidence.&lt;/p&gt;

&lt;p&gt;The agent can generate a React app that looks convincing.&lt;/p&gt;

&lt;p&gt;But the migration is not done until the output is checked.&lt;/p&gt;

&lt;p&gt;A practical verification checklist should include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;every important URL has a matching route or redirect&lt;/li&gt;
&lt;li&gt;desktop and mobile layouts are checked&lt;/li&gt;
&lt;li&gt;images load from the right source&lt;/li&gt;
&lt;li&gt;navigation works&lt;/li&gt;
&lt;li&gt;forms submit somewhere real&lt;/li&gt;
&lt;li&gt;blog or CMS pages render from data&lt;/li&gt;
&lt;li&gt;metadata exists&lt;/li&gt;
&lt;li&gt;old URLs are mapped&lt;/li&gt;
&lt;li&gt;no obvious console errors appear&lt;/li&gt;
&lt;li&gt;performance is acceptable&lt;/li&gt;
&lt;li&gt;accessibility basics are not broken&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run build
npm run lint
npm run &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then check the running site:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And inspect actual pages in the browser.&lt;/p&gt;

&lt;p&gt;This is the same pattern I keep coming back to in agent workflows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;inspect -&amp;gt; decide -&amp;gt; run -&amp;gt; verify -&amp;gt; report
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The code generation part is only one step.&lt;/p&gt;

&lt;p&gt;The verification is where the work becomes trustworthy.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where Terminal Skills fits
&lt;/h2&gt;

&lt;p&gt;This is why I like the Terminal Skills framing.&lt;/p&gt;

&lt;p&gt;The useful thing is not "AI can write React."&lt;/p&gt;

&lt;p&gt;We already know that.&lt;/p&gt;

&lt;p&gt;The useful thing is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI can follow a repeatable migration workflow if the workflow is packaged clearly enough.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;wix-to-react&lt;/code&gt; skill gives the agent a more specific operating path.&lt;/p&gt;

&lt;p&gt;It turns a vague request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Move my Wix site to React.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Into something closer to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Inventory the Wix site.
Classify static pages, CMS content, business logic, and SEO requirements.
Choose whether to migrate data or use Wix as a backend.
Rebuild the frontend in React or Next.js.
Verify routes, content, forms, metadata, and deployment readiness.
Report what was completed and what still needs human decisions.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is much better.&lt;/p&gt;

&lt;p&gt;It reduces the number of hidden assumptions.&lt;/p&gt;

&lt;p&gt;It also makes the agent easier to supervise.&lt;/p&gt;

&lt;p&gt;Instead of asking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Did it convert the site?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can ask:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What pages did it inventory?
What content sources did it find?
Which Wix features still need a migration decision?
What routes were rebuilt?
What checks passed?
What is still missing?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those are better questions.&lt;/p&gt;

&lt;p&gt;They produce better work.&lt;/p&gt;




&lt;h2&gt;
  
  
  The agent should report gaps, not hide them
&lt;/h2&gt;

&lt;p&gt;One thing I would explicitly want in a Wix migration skill:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Do not pretend every Wix feature was migrated if it was only visually approximated.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This matters.&lt;/p&gt;

&lt;p&gt;If the old Wix site had a booking workflow and the new React app has a button that looks like "Book Now" but does nothing, that is not a migration.&lt;/p&gt;

&lt;p&gt;That is a visual placeholder.&lt;/p&gt;

&lt;p&gt;Placeholders are fine if they are labeled.&lt;/p&gt;

&lt;p&gt;They are dangerous if they are hidden.&lt;/p&gt;

&lt;p&gt;A good final report should say:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;rebuilt pages&lt;/li&gt;
&lt;li&gt;skipped pages&lt;/li&gt;
&lt;li&gt;assets copied&lt;/li&gt;
&lt;li&gt;data exported&lt;/li&gt;
&lt;li&gt;data not exported&lt;/li&gt;
&lt;li&gt;forms recreated&lt;/li&gt;
&lt;li&gt;forms still placeholder&lt;/li&gt;
&lt;li&gt;SEO mappings completed&lt;/li&gt;
&lt;li&gt;redirects still needed&lt;/li&gt;
&lt;li&gt;manual decisions required&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That kind of honesty is boring.&lt;/p&gt;

&lt;p&gt;It is also what makes agent work usable in production.&lt;/p&gt;




&lt;h2&gt;
  
  
  A realistic migration plan
&lt;/h2&gt;

&lt;p&gt;If I were using an agent for a Wix-to-React migration, I would want the workflow to look roughly like this.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 1: Discovery
&lt;/h3&gt;

&lt;p&gt;Open the Wix site.&lt;/p&gt;

&lt;p&gt;Map the visible pages.&lt;/p&gt;

&lt;p&gt;Check navigation, footer links, sitemap if available, blog index, product pages, and any public routes.&lt;/p&gt;

&lt;p&gt;Create an inventory file.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 2: Feature audit
&lt;/h3&gt;

&lt;p&gt;Identify whether the site uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wix CMS&lt;/li&gt;
&lt;li&gt;Wix Blog&lt;/li&gt;
&lt;li&gt;Wix Stores&lt;/li&gt;
&lt;li&gt;Wix Bookings&lt;/li&gt;
&lt;li&gt;Wix Forms&lt;/li&gt;
&lt;li&gt;member login&lt;/li&gt;
&lt;li&gt;custom code&lt;/li&gt;
&lt;li&gt;third-party scripts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This decides how risky the migration is.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 3: Content and asset extraction
&lt;/h3&gt;

&lt;p&gt;Download or document:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;images&lt;/li&gt;
&lt;li&gt;logos&lt;/li&gt;
&lt;li&gt;icons&lt;/li&gt;
&lt;li&gt;copy&lt;/li&gt;
&lt;li&gt;metadata&lt;/li&gt;
&lt;li&gt;blog content&lt;/li&gt;
&lt;li&gt;product data&lt;/li&gt;
&lt;li&gt;form fields&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do not start rebuilding until the content source is clear.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 4: React/Next.js rebuild
&lt;/h3&gt;

&lt;p&gt;Create the app structure.&lt;/p&gt;

&lt;p&gt;Build shared components.&lt;/p&gt;

&lt;p&gt;Recreate pages.&lt;/p&gt;

&lt;p&gt;Wire content.&lt;/p&gt;

&lt;p&gt;Add metadata.&lt;/p&gt;

&lt;p&gt;Add forms or placeholder warnings.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 5: Verification
&lt;/h3&gt;

&lt;p&gt;Run build checks.&lt;/p&gt;

&lt;p&gt;Open pages locally.&lt;/p&gt;

&lt;p&gt;Compare important pages visually.&lt;/p&gt;

&lt;p&gt;Check mobile.&lt;/p&gt;

&lt;p&gt;Check forms.&lt;/p&gt;

&lt;p&gt;Check SEO metadata.&lt;/p&gt;

&lt;p&gt;Check old-to-new URL mapping.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 6: Deployment readiness
&lt;/h3&gt;

&lt;p&gt;Prepare environment variables.&lt;/p&gt;

&lt;p&gt;Document backend dependencies.&lt;/p&gt;

&lt;p&gt;Write redirect rules.&lt;/p&gt;

&lt;p&gt;Create a final migration report.&lt;/p&gt;

&lt;p&gt;Only then should anyone talk about launch.&lt;/p&gt;




&lt;h2&gt;
  
  
  The bigger lesson
&lt;/h2&gt;

&lt;p&gt;Wix-to-React is a good example of where AI agent work is going.&lt;/p&gt;

&lt;p&gt;The value is not just producing code faster.&lt;/p&gt;

&lt;p&gt;The value is turning messy operational work into repeatable workflows.&lt;/p&gt;

&lt;p&gt;Most real tasks are not one command.&lt;/p&gt;

&lt;p&gt;They are sequences of judgment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;inspect the current system
understand what matters
choose the safest path
make the change
verify the result
explain the remaining risk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is true for video processing.&lt;/p&gt;

&lt;p&gt;It is true for deployment.&lt;/p&gt;

&lt;p&gt;It is true for content publishing.&lt;/p&gt;

&lt;p&gt;And it is definitely true for migrating a Wix site into React.&lt;/p&gt;

&lt;p&gt;The framework is not the hard part.&lt;/p&gt;

&lt;p&gt;The workflow is.&lt;/p&gt;

&lt;p&gt;That is why skills matter.&lt;/p&gt;

&lt;p&gt;Not because they make agents magical.&lt;/p&gt;

&lt;p&gt;Because they make agents less random.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;If you have a small Wix site and it still works, you may not need to migrate it.&lt;/p&gt;

&lt;p&gt;No-code tools are not automatically bad.&lt;/p&gt;

&lt;p&gt;But if your site has outgrown the builder, the migration needs to be treated like a real software project.&lt;/p&gt;

&lt;p&gt;Not a screenshot clone.&lt;/p&gt;

&lt;p&gt;Not a prompt.&lt;/p&gt;

&lt;p&gt;Not a one-click export fantasy.&lt;/p&gt;

&lt;p&gt;A workflow.&lt;/p&gt;

&lt;p&gt;That is the reason I like the &lt;code&gt;wix-to-react&lt;/code&gt; skill on Terminal Skills.&lt;/p&gt;

&lt;p&gt;It frames the job correctly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;inventory, classify, rebuild, verify, and report.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is how you move from "the agent made something that looks like my Wix site" to "the agent helped migrate the actual website."&lt;/p&gt;

&lt;p&gt;Explore the skill here:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://terminalskills.io/skills/wix-to-react
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And if you are building agent workflows around real work, not just demos, the broader Terminal Skills catalog is worth watching:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://terminalskills.io
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F51r7n7ciu3c39z0ibfb2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F51r7n7ciu3c39z0ibfb2.png" alt="Watercolor illustration of a website builder workflow becoming a structured React migration checklist" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>nextjs</category>
      <category>ai</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Solstice Cipher: a light-routing puzzle for the June Solstice Game Jam</title>
      <dc:creator>Alex Shev</dc:creator>
      <pubDate>Sun, 14 Jun 2026 15:41:40 +0000</pubDate>
      <link>https://dev.to/alexshev/solstice-cipher-a-light-routing-puzzle-for-the-june-solstice-game-jam-57lo</link>
      <guid>https://dev.to/alexshev/solstice-cipher-a-light-routing-puzzle-for-the-june-solstice-game-jam-57lo</guid>
      <description>&lt;p&gt;This is a submission for the &lt;a href="https://dev.to/challenges/june-game-jam-2026-06-03"&gt;June Solstice Game Jam&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Solstice Cipher&lt;/strong&gt; is a small browser puzzle game about the longest day, code-breaking, and the turning point between signal and shadow.&lt;/p&gt;

&lt;p&gt;The player rotates mirrors to route a solstice beam through every cipher node before landing on the final beacon. Each level is a tiny circuit of light: if the beam misses a cipher gate, the beacon does not unlock.&lt;/p&gt;

&lt;p&gt;The game is inspired by a few June themes from the challenge prompt:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the June solstice and the long arc of daylight&lt;/li&gt;
&lt;li&gt;light versus darkness&lt;/li&gt;
&lt;li&gt;turning points&lt;/li&gt;
&lt;li&gt;Alan Turing, code-breaking, and computational thinking&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Demo video: &lt;a href="https://desciple88.github.io/solstice-cipher-devto-game-jam/demo.html" rel="noopener noreferrer"&gt;watch in browser&lt;/a&gt; / &lt;a href="https://desciple88.github.io/solstice-cipher-devto-game-jam/demo.mp4" rel="noopener noreferrer"&gt;direct MP4&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Playable game: &lt;a href="https://desciple88.github.io/solstice-cipher-devto-game-jam/" rel="noopener noreferrer"&gt;https://desciple88.github.io/solstice-cipher-devto-game-jam/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Source code: &lt;a href="https://github.com/desciple88/solstice-cipher-devto-game-jam" rel="noopener noreferrer"&gt;https://github.com/desciple88/solstice-cipher-devto-game-jam&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;The game is a dependency-free HTML/CSS/JavaScript canvas app.&lt;/p&gt;

&lt;p&gt;The board is a 6x6 grid. A sunbeam enters from one side of the board, moves in one of four directions, and reflects when it hits a mirror:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/&lt;/code&gt; turns east to north, south to west, and so on&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;\&lt;/code&gt; turns east to south, north to west, and so on&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cipher nodes record whether the beam visited them. A level is solved only when the beam has touched all required cipher nodes and then reaches the beacon.&lt;/p&gt;

&lt;h2&gt;
  
  
  Controls
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Click or tap a mirror to rotate it.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Reset&lt;/strong&gt; or press &lt;code&gt;R&lt;/code&gt; to restart the level.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Next&lt;/strong&gt; or arrow keys to switch levels.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Hint&lt;/strong&gt; or press &lt;code&gt;H&lt;/code&gt; if the path gets stuck.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why the Turing Angle
&lt;/h2&gt;

&lt;p&gt;I wanted the Alan Turing category to feel like part of the mechanics, not just a label. The player is effectively debugging a simple signal machine: change one reflector, trace the path, see which gates activated, and iterate until the message resolves.&lt;/p&gt;

&lt;p&gt;It is not an Enigma simulator, but it borrows the feeling of signal routing, symbolic gates, and systematic code-breaking.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Used
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;HTML&lt;/li&gt;
&lt;li&gt;CSS&lt;/li&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;li&gt;Canvas 2D&lt;/li&gt;
&lt;li&gt;ffmpeg for the demo capture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI assistance was used while preparing the implementation and write-up. I am not entering this under the Best Google AI Usage category because I could not complete a real Google AI toolchain step during the build; the local Gemini CLI was unavailable in my environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;For a tiny jam game, the best scope was a mechanic that could be understood instantly: rotate mirrors, follow light, unlock the beacon.&lt;/p&gt;

&lt;p&gt;The solstice theme gave the visual direction. The Turing theme gave the rules: the path is not just pretty, it has to carry a complete signal.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>gamechallenge</category>
      <category>gamedev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>MCP Gives Your Agent Stripe Access. Skills Tell It What Not to Break.</title>
      <dc:creator>Alex Shev</dc:creator>
      <pubDate>Sun, 14 Jun 2026 13:10:19 +0000</pubDate>
      <link>https://dev.to/alexshev/mcp-gives-your-agent-stripe-access-skills-tell-it-what-not-to-break-1c90</link>
      <guid>https://dev.to/alexshev/mcp-gives-your-agent-stripe-access-skills-tell-it-what-not-to-break-1c90</guid>
      <description>&lt;p&gt;Stripe integrations are one of the places where AI coding agents look magical right up until they are dangerous.&lt;/p&gt;

&lt;p&gt;The agent can read docs.&lt;/p&gt;

&lt;p&gt;It can generate a checkout flow.&lt;/p&gt;

&lt;p&gt;It can wire a webhook.&lt;/p&gt;

&lt;p&gt;It can create a connected account, move money between a platform and a seller, and leave you with code that looks believable.&lt;/p&gt;

&lt;p&gt;That last part is the problem.&lt;/p&gt;

&lt;p&gt;Payments code does not fail like a todo app.&lt;/p&gt;

&lt;p&gt;If a todo app has a bad edge case, someone cannot mark a task complete.&lt;/p&gt;

&lt;p&gt;If a marketplace payment flow has a bad edge case, the wrong party collects fees, a seller cannot finish onboarding, a payout goes missing from your internal state, or a webhook retry silently creates a reconciliation mess.&lt;/p&gt;

&lt;p&gt;This is why I do not think "just connect the agent to Stripe MCP" is enough.&lt;/p&gt;

&lt;p&gt;MCP gives the agent access.&lt;/p&gt;

&lt;p&gt;A skill gives the agent a playbook.&lt;/p&gt;

&lt;h2&gt;
  
  
  The access layer: Stripe MCP
&lt;/h2&gt;

&lt;p&gt;Stripe has an MCP server for agentic workflows.&lt;/p&gt;

&lt;p&gt;That matters because an agent can work with Stripe through a structured tool surface instead of guessing from memory or copy-pasting stale snippets from the web.&lt;/p&gt;

&lt;p&gt;Stripe's own docs describe the MCP server as a set of tools agents can use to interact with the Stripe API and search Stripe's knowledge base.&lt;/p&gt;

&lt;p&gt;That is a real improvement over asking an LLM:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Build Stripe Connect for my marketplace"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and hoping it remembers the latest API shape.&lt;/p&gt;

&lt;p&gt;But access is not the same thing as judgment.&lt;/p&gt;

&lt;p&gt;If an agent has a Stripe tool, it still needs to know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which Connect charge type fits the product model&lt;/li&gt;
&lt;li&gt;whether sellers need Express, full dashboard access, or a fully embedded flow&lt;/li&gt;
&lt;li&gt;where to store the connected account id&lt;/li&gt;
&lt;li&gt;which events must update internal order state&lt;/li&gt;
&lt;li&gt;when to use direct charges vs destination charges vs separate charges and transfers&lt;/li&gt;
&lt;li&gt;how to handle refunds, disputes, onboarding requirements, and payout status&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are not just API calls.&lt;/p&gt;

&lt;p&gt;They are product decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The instruction layer: a Stripe Connect skill
&lt;/h2&gt;

&lt;p&gt;The latest Stripe-related skill I looked at on Terminal Skills is &lt;code&gt;stripe-connect&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It is built for marketplace and platform payments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;two-sided marketplaces&lt;/li&gt;
&lt;li&gt;seller/provider onboarding&lt;/li&gt;
&lt;li&gt;splitting payments between buyers and sellers&lt;/li&gt;
&lt;li&gt;platform fees&lt;/li&gt;
&lt;li&gt;payouts&lt;/li&gt;
&lt;li&gt;connected account management&lt;/li&gt;
&lt;li&gt;Connect webhooks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important detail is that the skill is not just a list of endpoints.&lt;/p&gt;

&lt;p&gt;It tells the agent how to reason through the flow.&lt;/p&gt;

&lt;p&gt;For example, the skill uses Stripe Accounts v2 for new Connect platforms. Instead of thinking in the old flat &lt;code&gt;type: "express"&lt;/code&gt; shape first, it frames a connected account around configurations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;merchant&lt;/code&gt; for accepting payments&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;recipient&lt;/code&gt; for receiving transfers and payouts&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;customer&lt;/code&gt; for being billed as a customer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the kind of detail an agent can easily miss if it is only pattern-matching from older examples.&lt;/p&gt;

&lt;p&gt;The skill also makes dashboard access explicit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;express&lt;/code&gt; for Stripe-hosted onboarding and dashboard&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;full&lt;/code&gt; for sellers who need a full Stripe dashboard or OAuth-style flow&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;none&lt;/code&gt; for embedded/custom platform control&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That distinction matters because onboarding is not just a technical step. It changes who owns UX, support, compliance surface, and seller control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this belongs in a skill, not just a prompt
&lt;/h2&gt;

&lt;p&gt;You can tell an agent:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Use Stripe best practices."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That sounds clear.&lt;/p&gt;

&lt;p&gt;It is not.&lt;/p&gt;

&lt;p&gt;Best practices for what?&lt;/p&gt;

&lt;p&gt;A simple SaaS checkout?&lt;/p&gt;

&lt;p&gt;A usage-based subscription?&lt;/p&gt;

&lt;p&gt;A marketplace with sellers?&lt;/p&gt;

&lt;p&gt;A white-label platform?&lt;/p&gt;

&lt;p&gt;A service marketplace where money should be held until work is delivered?&lt;/p&gt;

&lt;p&gt;Those are different systems.&lt;/p&gt;

&lt;p&gt;A good skill narrows the task before code starts appearing.&lt;/p&gt;

&lt;p&gt;For Stripe Connect, I want the agent to ask and encode questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the platform the merchant of record, or is the seller?&lt;/li&gt;
&lt;li&gt;Does the seller need dashboard access?&lt;/li&gt;
&lt;li&gt;Should the platform collect the fee at charge time?&lt;/li&gt;
&lt;li&gt;Is fulfillment immediate, delayed, or milestone-based?&lt;/li&gt;
&lt;li&gt;What internal state changes when onboarding completes?&lt;/li&gt;
&lt;li&gt;Which webhook events are the source of truth?&lt;/li&gt;
&lt;li&gt;What happens on refund, dispute, failed payment, and failed payout?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the work.&lt;/p&gt;

&lt;p&gt;The API call is the last mile.&lt;/p&gt;

&lt;h2&gt;
  
  
  The most useful part: choosing the charge model
&lt;/h2&gt;

&lt;p&gt;A lot of marketplace payment bugs start with choosing the wrong charge model.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;stripe-connect&lt;/code&gt; skill separates the main options:&lt;/p&gt;

&lt;h3&gt;
  
  
  Direct charges
&lt;/h3&gt;

&lt;p&gt;The charge happens on the connected account.&lt;/p&gt;

&lt;p&gt;This can make sense when the seller should own more of the payment relationship and see the charge directly in their Stripe account.&lt;/p&gt;

&lt;h3&gt;
  
  
  Destination charges
&lt;/h3&gt;

&lt;p&gt;The platform creates the charge and routes funds to the seller.&lt;/p&gt;

&lt;p&gt;This is often the clean marketplace default when the platform controls the buyer experience and collects an application fee.&lt;/p&gt;

&lt;h3&gt;
  
  
  Separate charges and transfers
&lt;/h3&gt;

&lt;p&gt;The platform charges the buyer first, then transfers funds later.&lt;/p&gt;

&lt;p&gt;This is the flexible option when delivery, risk, escrow-like timing, or multi-party routing matters.&lt;/p&gt;

&lt;p&gt;The agent needs to make this decision before it writes the PaymentIntent code.&lt;/p&gt;

&lt;p&gt;Otherwise it may produce code that works in a test card happy path but does not match the business.&lt;/p&gt;

&lt;h2&gt;
  
  
  Webhooks are where the integration becomes real
&lt;/h2&gt;

&lt;p&gt;Stripe integrations are not done when the payment succeeds in the browser.&lt;/p&gt;

&lt;p&gt;They are done when the backend state survives reality.&lt;/p&gt;

&lt;p&gt;That means webhooks.&lt;/p&gt;

&lt;p&gt;For Connect, the platform may need to listen for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;onboarding updates&lt;/li&gt;
&lt;li&gt;payment success and failure&lt;/li&gt;
&lt;li&gt;transfers&lt;/li&gt;
&lt;li&gt;payouts&lt;/li&gt;
&lt;li&gt;disputes&lt;/li&gt;
&lt;li&gt;connected-account events&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The skill calls out an easy-to-miss detail: Accounts v2 emits thin events through event destinations, and onboarding status can require listening for account requirements updates.&lt;/p&gt;

&lt;p&gt;That is exactly the kind of thing a generic prompt can skip.&lt;/p&gt;

&lt;p&gt;It may build the happy path and leave the operational path unfinished.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Stripe MCP and skills fit together
&lt;/h2&gt;

&lt;p&gt;The way I think about it:&lt;/p&gt;

&lt;p&gt;MCP is the tool socket.&lt;/p&gt;

&lt;p&gt;The skill is the operating procedure.&lt;/p&gt;

&lt;p&gt;Stripe MCP can let the agent query Stripe knowledge, inspect resources, and work through a structured API-facing interface.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;stripe-connect&lt;/code&gt; skill tells the agent how a marketplace payment system should be assembled:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;define the seller account model&lt;/li&gt;
&lt;li&gt;create the connected account&lt;/li&gt;
&lt;li&gt;generate onboarding&lt;/li&gt;
&lt;li&gt;store the account id&lt;/li&gt;
&lt;li&gt;choose the charge type&lt;/li&gt;
&lt;li&gt;collect platform fees intentionally&lt;/li&gt;
&lt;li&gt;wire webhooks&lt;/li&gt;
&lt;li&gt;handle refunds, disputes, and payouts&lt;/li&gt;
&lt;li&gt;test with Stripe CLI and test cards&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is the difference between "agent can call Stripe" and "agent can build the right Stripe flow."&lt;/p&gt;

&lt;h2&gt;
  
  
  The agent should not be trusted with vague money movement
&lt;/h2&gt;

&lt;p&gt;This is the big lesson for me.&lt;/p&gt;

&lt;p&gt;AI agents are getting better at implementation.&lt;/p&gt;

&lt;p&gt;But money movement is not just implementation.&lt;/p&gt;

&lt;p&gt;It is policy, product design, compliance boundary, risk handling, and state reconciliation.&lt;/p&gt;

&lt;p&gt;So the workflow should look more like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Human defines the marketplace model
        |
        v
Skill frames the Stripe Connect decisions
        |
        v
MCP/API tools give the agent current Stripe access
        |
        v
Agent writes the implementation
        |
        v
Tests + webhooks + review prove the money flow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the stack I trust more than a big prompt.&lt;/p&gt;

&lt;p&gt;Not "AI, build payments."&lt;/p&gt;

&lt;p&gt;"AI, follow this payment architecture, use current Stripe tools, and show me the decisions before you move money."&lt;/p&gt;

&lt;p&gt;That is where agents start becoming useful for serious backend work.&lt;/p&gt;

&lt;p&gt;Source:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Terminal Skills &lt;code&gt;stripe-connect&lt;/code&gt;: &lt;a href="https://terminalskills.io/skills/stripe-connect" rel="noopener noreferrer"&gt;https://terminalskills.io/skills/stripe-connect&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Stripe MCP docs: &lt;a href="https://docs.stripe.com/mcp" rel="noopener noreferrer"&gt;https://docs.stripe.com/mcp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Stripe AI build docs: &lt;a href="https://docs.stripe.com/building-with-ai" rel="noopener noreferrer"&gt;https://docs.stripe.com/building-with-ai&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devtools</category>
      <category>ai</category>
      <category>stripe</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Product Videos Should Be Build Artifacts, Not Manual Exports</title>
      <dc:creator>Alex Shev</dc:creator>
      <pubDate>Tue, 09 Jun 2026 19:42:24 +0000</pubDate>
      <link>https://dev.to/alexshev/product-videos-should-be-build-artifacts-not-manual-exports-d8i</link>
      <guid>https://dev.to/alexshev/product-videos-should-be-build-artifacts-not-manual-exports-d8i</guid>
      <description>&lt;p&gt;Every product launch needs the same small pile of video assets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a 16:9 demo clip for the launch page&lt;/li&gt;
&lt;li&gt;a square cut for social&lt;/li&gt;
&lt;li&gt;a GIF preview for the changelog&lt;/li&gt;
&lt;li&gt;a poster image for email&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The weird part is how often that still means opening a video editor by hand.&lt;/p&gt;

&lt;p&gt;Someone updates the product copy. Someone swaps the screen recording. Someone exports a new MP4. Someone crops another version. Then two weeks later the same release video cannot be reproduced exactly because the editor timeline, font version, plugin state, or export preset drifted.&lt;/p&gt;

&lt;p&gt;For product teams, that is the wrong abstraction.&lt;/p&gt;

&lt;p&gt;The launch video should be closer to a build artifact.&lt;/p&gt;

&lt;p&gt;Change the source. Open a PR. Let CI render the exact same video every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The useful idea: HTML as the video source
&lt;/h2&gt;

&lt;p&gt;Most product launch videos are not cinema.&lt;/p&gt;

&lt;p&gt;They are structured compositions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;headline&lt;/li&gt;
&lt;li&gt;short subcopy&lt;/li&gt;
&lt;li&gt;screen recording&lt;/li&gt;
&lt;li&gt;background audio&lt;/li&gt;
&lt;li&gt;a few transitions&lt;/li&gt;
&lt;li&gt;a logo or CTA&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That maps surprisingly well to HTML and CSS.&lt;/p&gt;

&lt;p&gt;Instead of keeping the source of truth in a visual editor, the source can live in a normal &lt;code&gt;index.html&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt;
  &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"stage"&lt;/span&gt;
  &lt;span class="na"&gt;data-composition-id=&lt;/span&gt;&lt;span class="s"&gt;"release-2-4"&lt;/span&gt;
  &lt;span class="na"&gt;data-start=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt;
  &lt;span class="na"&gt;data-width=&lt;/span&gt;&lt;span class="s"&gt;"1920"&lt;/span&gt;
  &lt;span class="na"&gt;data-height=&lt;/span&gt;&lt;span class="s"&gt;"1080"&lt;/span&gt;
&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;video&lt;/span&gt;
    &lt;span class="na"&gt;data-start=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt;
    &lt;span class="na"&gt;data-duration=&lt;/span&gt;&lt;span class="s"&gt;"8"&lt;/span&gt;
    &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"assets/screencast.mp4"&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;gt;&amp;lt;/video&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;h1&lt;/span&gt;
    &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"headline"&lt;/span&gt;
    &lt;span class="na"&gt;data-start=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt;
    &lt;span class="na"&gt;data-duration=&lt;/span&gt;&lt;span class="s"&gt;"5"&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    v2.4 - Realtime Collaboration
  &lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt;
    &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"sub"&lt;/span&gt;
    &lt;span class="na"&gt;data-start=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt;
    &lt;span class="na"&gt;data-duration=&lt;/span&gt;&lt;span class="s"&gt;"4"&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Comment, mention, resolve - live.
  &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;audio&lt;/span&gt;
    &lt;span class="na"&gt;data-start=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt;
    &lt;span class="na"&gt;data-duration=&lt;/span&gt;&lt;span class="s"&gt;"8"&lt;/span&gt;
    &lt;span class="na"&gt;data-volume=&lt;/span&gt;&lt;span class="s"&gt;"0.7"&lt;/span&gt;
    &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"assets/bed.wav"&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;gt;&amp;lt;/audio&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That one file now carries things a video editor usually hides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;canvas size&lt;/li&gt;
&lt;li&gt;timing&lt;/li&gt;
&lt;li&gt;copy&lt;/li&gt;
&lt;li&gt;media references&lt;/li&gt;
&lt;li&gt;animation hooks&lt;/li&gt;
&lt;li&gt;composition id&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And because it is text, it can be reviewed like any other product change.&lt;/p&gt;

&lt;h2&gt;
  
  
  The important part is deterministic rendering
&lt;/h2&gt;

&lt;p&gt;Rendering HTML to video is only useful if the result is reproducible.&lt;/p&gt;

&lt;p&gt;If a CI job renders a different file every time, the system is just another flaky media tool.&lt;/p&gt;

&lt;p&gt;The better workflow is frame-seeking:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Load the HTML composition in headless Chrome.&lt;/li&gt;
&lt;li&gt;Seek to each timestamp.&lt;/li&gt;
&lt;li&gt;Capture the frame.&lt;/li&gt;
&lt;li&gt;Encode the frames into MP4.&lt;/li&gt;
&lt;li&gt;Produce the same output from the same source.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is the reason HyperFrames is interesting here. It treats HTML, CSS, media, and seekable animation as a renderable video composition.&lt;/p&gt;

&lt;p&gt;Then FFmpeg handles the boring but necessary production work:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# master render&lt;/span&gt;
npx hyperframes lint
npx hyperframes render

&lt;span class="c"&gt;# 1:1 social cut&lt;/span&gt;
ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; out/release-2-4.mp4 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-vf&lt;/span&gt; &lt;span class="s2"&gt;"crop=1080:1080:420:0"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-c&lt;/span&gt;:a copy &lt;span class="se"&gt;\&lt;/span&gt;
  out/release-2-4-square.mp4

&lt;span class="c"&gt;# lightweight GIF for changelog&lt;/span&gt;
ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; out/release-2-4.mp4 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-vf&lt;/span&gt; &lt;span class="s2"&gt;"fps=12,scale=640:-1:flags=lanczos"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  out/release-2-4.gif

&lt;span class="c"&gt;# poster frame for email&lt;/span&gt;
ffmpeg &lt;span class="nt"&gt;-ss&lt;/span&gt; 2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-i&lt;/span&gt; out/release-2-4.mp4 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-frames&lt;/span&gt;:v 1 &lt;span class="se"&gt;\&lt;/span&gt;
  out/release-2-4-poster.jpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One master render becomes every format the team needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why CI is the right place for this
&lt;/h2&gt;

&lt;p&gt;For a small SaaS team, the release note is already part of the engineering workflow.&lt;/p&gt;

&lt;p&gt;The video can be too.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Render launch video&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;v*"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;render&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;22"&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install -y ffmpeg&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;working-directory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;launch-video&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;npx hyperframes lint&lt;/span&gt;
          &lt;span class="s"&gt;npx hyperframes render&lt;/span&gt;
          &lt;span class="s"&gt;ffmpeg -i out/release-2-4.mp4 -vf "crop=1080:1080:420:0" -c:a copy out/square.mp4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/upload-artifact@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;launch-video&lt;/span&gt;
          &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;launch-video/out/*.mp4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the video is attached to the release process:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;copy changes are visible in PRs&lt;/li&gt;
&lt;li&gt;timing changes are versioned&lt;/li&gt;
&lt;li&gt;release tags regenerate the same artifacts&lt;/li&gt;
&lt;li&gt;reviewers can inspect the rendered output&lt;/li&gt;
&lt;li&gt;social cuts come from the same master file&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The team is not replacing creative work with CI.&lt;/p&gt;

&lt;p&gt;It is removing the repetitive export layer around a video that is mostly structured product information.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this fits
&lt;/h2&gt;

&lt;p&gt;This works best for videos that are template-driven:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;product launch clips&lt;/li&gt;
&lt;li&gt;changelog videos&lt;/li&gt;
&lt;li&gt;feature teasers&lt;/li&gt;
&lt;li&gt;onboarding explainers&lt;/li&gt;
&lt;li&gt;social demos&lt;/li&gt;
&lt;li&gt;doc/video snippets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is probably the wrong tool for a cinematic brand film.&lt;/p&gt;

&lt;p&gt;But most weekly product videos are not cinematic. They are release communication.&lt;/p&gt;

&lt;p&gt;And release communication should be repeatable.&lt;/p&gt;

&lt;h2&gt;
  
  
  The agent angle
&lt;/h2&gt;

&lt;p&gt;The interesting part is what happens when an AI coding agent can edit the video source.&lt;/p&gt;

&lt;p&gt;An agent can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;update the release copy&lt;/li&gt;
&lt;li&gt;swap in a new screencast&lt;/li&gt;
&lt;li&gt;adjust timing&lt;/li&gt;
&lt;li&gt;add a maintained transition block&lt;/li&gt;
&lt;li&gt;run the lint step&lt;/li&gt;
&lt;li&gt;render the preview&lt;/li&gt;
&lt;li&gt;post-process the output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is much more useful than asking an AI tool to generate a random video from a prompt.&lt;/p&gt;

&lt;p&gt;The agent is working inside the same system as the product team: files, PRs, CI, artifacts, and review.&lt;/p&gt;

&lt;p&gt;That is where AI video automation starts to feel practical.&lt;/p&gt;

&lt;p&gt;I wrote up the full workflow here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://terminalskills.io/use-cases/automate-product-videos-from-html" rel="noopener noreferrer"&gt;https://terminalskills.io/use-cases/automate-product-videos-from-html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The short version:&lt;/p&gt;

&lt;p&gt;If the video changes every release, put the video source next to the release.&lt;/p&gt;

&lt;p&gt;Then let the build system render it.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>cicd</category>
      <category>webdev</category>
      <category>html</category>
    </item>
    <item>
      <title>How to Write Terminal Skills That AI Agents Can Actually Use</title>
      <dc:creator>Alex Shev</dc:creator>
      <pubDate>Mon, 08 Jun 2026 21:07:58 +0000</pubDate>
      <link>https://dev.to/alexshev/how-to-write-terminal-skills-that-ai-agents-can-actually-use-2ll7</link>
      <guid>https://dev.to/alexshev/how-to-write-terminal-skills-that-ai-agents-can-actually-use-2ll7</guid>
      <description>&lt;p&gt;Most AI agent advice still sounds like prompt advice.&lt;/p&gt;

&lt;p&gt;Add more context.&lt;br&gt;
Write clearer instructions.&lt;br&gt;
Give the model examples.&lt;br&gt;
Use a better system prompt.&lt;/p&gt;

&lt;p&gt;That helps, but it misses the part that breaks in real work.&lt;/p&gt;

&lt;p&gt;The problem is not always that the agent does not know a command. The problem is that the agent does not know your workflow.&lt;/p&gt;

&lt;p&gt;It does not know when to inspect first.&lt;br&gt;
It does not know which defaults are safe.&lt;br&gt;
It does not know what "done" means.&lt;br&gt;
It does not know when to stop instead of guessing.&lt;br&gt;
It does not know which checks matter before something leaves the local machine.&lt;/p&gt;

&lt;p&gt;That is where Terminal Skills become useful.&lt;/p&gt;

&lt;p&gt;A Terminal Skill is not just a command shortcut. It is a small reusable operating procedure for an agent.&lt;/p&gt;

&lt;p&gt;It teaches:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;when to use a workflow&lt;/li&gt;
&lt;li&gt;what inputs are acceptable&lt;/li&gt;
&lt;li&gt;which commands or scripts are preferred&lt;/li&gt;
&lt;li&gt;what output should exist&lt;/li&gt;
&lt;li&gt;how to verify the result&lt;/li&gt;
&lt;li&gt;when to stop and ask for help&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last part is the difference between a useful agent workflow and a confident mess.&lt;/p&gt;

&lt;p&gt;Here is the pattern I use when writing one.&lt;/p&gt;
&lt;h2&gt;
  
  
  Start with the task, not the tool
&lt;/h2&gt;

&lt;p&gt;The easiest mistake is to begin with a tool name.&lt;/p&gt;

&lt;p&gt;Bad starting point:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Make an FFmpeg skill.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Better starting point:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Make a skill that turns a raw video file into an X-ready MP4, then verifies the upload is likely to work.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those are different scopes.&lt;/p&gt;

&lt;p&gt;The first one is a tool wrapper.&lt;/p&gt;

&lt;p&gt;The second one is a workflow.&lt;/p&gt;

&lt;p&gt;Agents do not need every possible FFmpeg flag. They need a stable path through a common problem.&lt;/p&gt;

&lt;p&gt;The same applies to any terminal workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;not "make a git skill"&lt;/li&gt;
&lt;li&gt;but "review a dirty worktree without touching unrelated user changes"&lt;/li&gt;
&lt;li&gt;not "make a deploy skill"&lt;/li&gt;
&lt;li&gt;but "deploy a Next.js app to Vercel and verify the live URL"&lt;/li&gt;
&lt;li&gt;not "make a search skill"&lt;/li&gt;
&lt;li&gt;but "inspect a repo and find the smallest safe file set for this task"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The more specific the workflow, the more useful the skill.&lt;/p&gt;

&lt;h2&gt;
  
  
  A useful skill has a contract
&lt;/h2&gt;

&lt;p&gt;I like thinking about a Terminal Skill as a contract between the human, the agent, and the machine.&lt;/p&gt;

&lt;p&gt;The contract says:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;If this kind of task appears,
and these inputs exist,
follow this workflow,
produce this output,
run these checks,
and stop under these conditions.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That sounds simple, but it removes a lot of randomness.&lt;/p&gt;

&lt;p&gt;Without a contract, the agent improvises.&lt;/p&gt;

&lt;p&gt;With a contract, the agent has a default operating path.&lt;/p&gt;

&lt;p&gt;That does not make the agent less intelligent. It makes the work less dependent on fresh reasoning every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The basic structure
&lt;/h2&gt;

&lt;p&gt;For most Terminal Skills, I would start with a folder like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-skill/
  SKILL.md
  scripts/
    run.sh
  examples/
    input-example.txt
  README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not every skill needs a script.&lt;/p&gt;

&lt;p&gt;Some skills are mostly procedural. Some are wrappers around existing CLIs. Some are just strong instructions plus verification commands.&lt;/p&gt;

&lt;p&gt;But the &lt;code&gt;SKILL.md&lt;/code&gt; is the important part.&lt;/p&gt;

&lt;p&gt;It should tell the agent how to work, not just what the tool does.&lt;/p&gt;

&lt;p&gt;Here is a practical template.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Skill Name&lt;/span&gt;

&lt;span class="gu"&gt;## Use When&lt;/span&gt;

Use this skill when the user asks to:
&lt;span class="p"&gt;-&lt;/span&gt; ...
&lt;span class="p"&gt;-&lt;/span&gt; ...

&lt;span class="gu"&gt;## Do Not Use When&lt;/span&gt;

Do not use this skill when:
&lt;span class="p"&gt;-&lt;/span&gt; ...
&lt;span class="p"&gt;-&lt;/span&gt; ...

&lt;span class="gu"&gt;## Inputs&lt;/span&gt;

Expected inputs:
&lt;span class="p"&gt;-&lt;/span&gt; source file or directory
&lt;span class="p"&gt;-&lt;/span&gt; target format
&lt;span class="p"&gt;-&lt;/span&gt; optional config

&lt;span class="gu"&gt;## Workflow&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; Inspect the input.
&lt;span class="p"&gt;2.&lt;/span&gt; Choose the smallest safe action.
&lt;span class="p"&gt;3.&lt;/span&gt; Run the script or command.
&lt;span class="p"&gt;4.&lt;/span&gt; Verify the output.
&lt;span class="p"&gt;5.&lt;/span&gt; Report the result with file paths and any warnings.

&lt;span class="gu"&gt;## Commands&lt;/span&gt;

&lt;span class="p"&gt;```&lt;/span&gt;&lt;span class="nl"&gt;bash
&lt;/span&gt;./scripts/run.sh input-file
&lt;span class="p"&gt;```&lt;/span&gt;

&lt;span class="gu"&gt;## Verification&lt;/span&gt;

Check:
&lt;span class="p"&gt;-&lt;/span&gt; output file exists
&lt;span class="p"&gt;-&lt;/span&gt; output format is correct
&lt;span class="p"&gt;-&lt;/span&gt; command exited successfully
&lt;span class="p"&gt;-&lt;/span&gt; logs contain no obvious errors

&lt;span class="gu"&gt;## Stop Conditions&lt;/span&gt;

Stop and ask the user if:
&lt;span class="p"&gt;-&lt;/span&gt; required input is missing
&lt;span class="p"&gt;-&lt;/span&gt; output validation fails
&lt;span class="p"&gt;-&lt;/span&gt; the task would publish, delete, charge, email, or deploy something
&lt;span class="p"&gt;-&lt;/span&gt; the command could overwrite user data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is already more useful than a loose prompt.&lt;/p&gt;

&lt;p&gt;It gives the agent a map.&lt;/p&gt;

&lt;h2&gt;
  
  
  The most important section is "Stop Conditions"
&lt;/h2&gt;

&lt;p&gt;Most people underwrite this part.&lt;/p&gt;

&lt;p&gt;They document the happy path and skip the failure boundaries.&lt;/p&gt;

&lt;p&gt;But agents need stop conditions badly.&lt;/p&gt;

&lt;p&gt;A good skill should say things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;stop if the repo has unrelated user changes&lt;/li&gt;
&lt;li&gt;stop if the API token is missing&lt;/li&gt;
&lt;li&gt;stop if the public page cannot be verified&lt;/li&gt;
&lt;li&gt;stop if the output file has no video stream&lt;/li&gt;
&lt;li&gt;stop if the command would delete or overwrite source files&lt;/li&gt;
&lt;li&gt;stop if the user approved a draft but did not approve publishing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where agent workflows become safer.&lt;/p&gt;

&lt;p&gt;For example, a social publishing skill should not only say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Open the composer and publish the post.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It should say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Before posting, verify the composer contains the exact approved text.
After posting, verify the final permalink shows the full text and attached media.
If media is missing, do not report success.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is a real operating rule.&lt;/p&gt;

&lt;p&gt;It captures the part of the workflow that normally lives in someone's head.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verification should be concrete
&lt;/h2&gt;

&lt;p&gt;"Check that it worked" is not enough.&lt;/p&gt;

&lt;p&gt;A good Terminal Skill names the actual check.&lt;/p&gt;

&lt;p&gt;For a video skill:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffprobe &lt;span class="nt"&gt;-v&lt;/span&gt; error &lt;span class="nt"&gt;-show_streams&lt;/span&gt; &lt;span class="nt"&gt;-show_format&lt;/span&gt; output.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a code skill:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;test
&lt;/span&gt;git diff &lt;span class="nt"&gt;--check&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a content publishing skill:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Open the final live URL.
Confirm the title, body, tags, canonical URL, and media are visible.
Do not trust the editor preview as final verification.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a data export skill:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Check row count, headers, encoding, and sample records before sending the file.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agents are very good at saying "done" too early.&lt;/p&gt;

&lt;p&gt;Verification commands make "done" harder to fake.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep the skill narrow
&lt;/h2&gt;

&lt;p&gt;The best skills are boringly specific.&lt;/p&gt;

&lt;p&gt;Bad:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;content-automation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Better:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;devto-draft-from-markdown
x-safe-video-export
reddit-comment-visibility-check
vercel-preview-deploy-and-verify
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Narrow skills have clearer triggers and fewer hidden assumptions.&lt;/p&gt;

&lt;p&gt;They are also easier to improve.&lt;/p&gt;

&lt;p&gt;If a video export fails, fix the video skill.&lt;br&gt;
If a DEV.to draft misses a canonical URL, fix the DEV.to skill.&lt;br&gt;
If a Reddit comment is visible to the owner but not public, fix the visibility check.&lt;/p&gt;

&lt;p&gt;One giant "content automation" skill would hide all of those failures inside one vague blob.&lt;/p&gt;

&lt;p&gt;Small skills make the workflow inspectable.&lt;/p&gt;
&lt;h2&gt;
  
  
  Use scripts for mechanics, instructions for judgment
&lt;/h2&gt;

&lt;p&gt;I do not think every skill should become a huge script.&lt;/p&gt;

&lt;p&gt;Scripts are good for mechanical repeatability:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;convert this file&lt;/li&gt;
&lt;li&gt;validate this JSON&lt;/li&gt;
&lt;li&gt;resize this image&lt;/li&gt;
&lt;li&gt;call this API&lt;/li&gt;
&lt;li&gt;generate this report&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instructions are better for judgment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;when to use the script&lt;/li&gt;
&lt;li&gt;which candidates to reject&lt;/li&gt;
&lt;li&gt;how to handle approval&lt;/li&gt;
&lt;li&gt;what counts as verification&lt;/li&gt;
&lt;li&gt;when not to continue&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The skill should combine both.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SKILL.md explains the workflow.
scripts/export.sh performs the conversion.
Verification commands prove the output.
Stop conditions prevent the agent from bluffing.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the useful shape.&lt;/p&gt;

&lt;p&gt;Not "the agent has a tool."&lt;/p&gt;

&lt;p&gt;"The agent has a way of working."&lt;/p&gt;

&lt;h2&gt;
  
  
  Example: a tiny repo-inspection skill
&lt;/h2&gt;

&lt;p&gt;Here is a small example that does not need a script.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Repo Inspection&lt;/span&gt;

&lt;span class="gu"&gt;## Use When&lt;/span&gt;

Use this before editing an unfamiliar codebase.

&lt;span class="gu"&gt;## Workflow&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; Print the current directory.
&lt;span class="p"&gt;2.&lt;/span&gt; Check git status.
&lt;span class="p"&gt;3.&lt;/span&gt; List top-level files.
&lt;span class="p"&gt;4.&lt;/span&gt; Identify package/framework files.
&lt;span class="p"&gt;5.&lt;/span&gt; Search for relevant code with ripgrep.
&lt;span class="p"&gt;6.&lt;/span&gt; Read the smallest useful files before editing.

&lt;span class="gu"&gt;## Preferred Commands&lt;/span&gt;

&lt;span class="p"&gt;```&lt;/span&gt;&lt;span class="nl"&gt;bash
&lt;/span&gt;&lt;span class="nb"&gt;pwd
&lt;/span&gt;git status &lt;span class="nt"&gt;--short&lt;/span&gt;
rg &lt;span class="nt"&gt;--files&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-80&lt;/span&gt;
rg &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"keyword|component|route"&lt;/span&gt; .
&lt;span class="p"&gt;```&lt;/span&gt;

&lt;span class="gu"&gt;## Stop Conditions&lt;/span&gt;

Stop before editing if:
&lt;span class="p"&gt;-&lt;/span&gt; the user has unrelated changes in the target file
&lt;span class="p"&gt;-&lt;/span&gt; the task requires a destructive git command
&lt;span class="p"&gt;-&lt;/span&gt; the repo structure is unclear after inspection

&lt;span class="gu"&gt;## Verification&lt;/span&gt;

Before reporting done:
&lt;span class="p"&gt;-&lt;/span&gt; show changed files
&lt;span class="p"&gt;-&lt;/span&gt; run the smallest relevant test or check
&lt;span class="p"&gt;-&lt;/span&gt; explain any test that could not be run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not glamorous.&lt;/p&gt;

&lt;p&gt;But it prevents a lot of common agent mistakes.&lt;/p&gt;

&lt;p&gt;It teaches the agent the shape of careful work.&lt;/p&gt;

&lt;h2&gt;
  
  
  What makes a skill good?
&lt;/h2&gt;

&lt;p&gt;I usually judge a skill by five questions.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Does it have a clear trigger?
&lt;/h3&gt;

&lt;p&gt;The agent should know when to use it.&lt;/p&gt;

&lt;p&gt;If the trigger is vague, the skill will either be ignored or overused.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Does it reduce repeat reasoning?
&lt;/h3&gt;

&lt;p&gt;A good skill saves the agent from rediscovering the same workflow again.&lt;/p&gt;

&lt;p&gt;If the workflow is only used once, it may not need a skill yet.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Does it define done?
&lt;/h3&gt;

&lt;p&gt;The skill should say what output must exist and how to verify it.&lt;/p&gt;

&lt;p&gt;If "done" is subjective, the agent will guess.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Does it include stop conditions?
&lt;/h3&gt;

&lt;p&gt;This is the safety layer.&lt;/p&gt;

&lt;p&gt;The skill should prevent confident continuation when the workflow is missing a required input, external approval, or verification.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Is it small enough to maintain?
&lt;/h3&gt;

&lt;p&gt;If the skill becomes a giant manual for everything, it stops being useful.&lt;/p&gt;

&lt;p&gt;Small, composable skills are easier to trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bigger point
&lt;/h2&gt;

&lt;p&gt;AI agents are getting better at tool use.&lt;/p&gt;

&lt;p&gt;That does not mean every workflow should be improvised in chat.&lt;/p&gt;

&lt;p&gt;The more capable the agent becomes, the more important operating procedures become.&lt;/p&gt;

&lt;p&gt;Prompts are good for intent.&lt;br&gt;
Tools are good for capability.&lt;br&gt;
Skills are good for repeatable work.&lt;/p&gt;

&lt;p&gt;That is the layer I think more developers should build.&lt;/p&gt;

&lt;p&gt;Not because it is flashy.&lt;/p&gt;

&lt;p&gt;Because boring, reusable workflows are what turn agents from demos into something you can actually depend on.&lt;/p&gt;

&lt;p&gt;I am collecting more examples of this pattern at &lt;a href="https://terminalskills.io" rel="noopener noreferrer"&gt;Terminal Skills&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you are building your own agent workflows, start with one annoying task you repeat every week.&lt;/p&gt;

&lt;p&gt;Write down the trigger, workflow, verification, and stop conditions.&lt;/p&gt;

&lt;p&gt;That is your first skill.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>cli</category>
      <category>productivity</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Building an AI Short Video Generator: Why the Workflow Needs Skills, Not Just Prompts</title>
      <dc:creator>Alex Shev</dc:creator>
      <pubDate>Fri, 05 Jun 2026 21:20:25 +0000</pubDate>
      <link>https://dev.to/alexshev/building-an-ai-short-video-generator-why-the-workflow-needs-skills-not-just-prompts-36km</link>
      <guid>https://dev.to/alexshev/building-an-ai-short-video-generator-why-the-workflow-needs-skills-not-just-prompts-36km</guid>
      <description>&lt;p&gt;Most AI short-form video demos skip the boring part.&lt;/p&gt;

&lt;p&gt;They show a finished TikTok, Reel, or YouTube Short. Maybe they show the prompt. Maybe they show the generated script or the final render.&lt;/p&gt;

&lt;p&gt;But the hard part is not making one video.&lt;/p&gt;

&lt;p&gt;The hard part is making the fifteenth video without the whole system turning into a pile of one-off scripts, half-remembered FFmpeg commands, broken captions, inconsistent hooks, and manual upload steps.&lt;/p&gt;

&lt;p&gt;That is where I think the conversation around AI video automation gets more interesting.&lt;/p&gt;

&lt;p&gt;Not:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Can an AI generate a Short?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What workflow does an AI agent need to generate Shorts repeatedly?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I was looking at a Terminal Skills use case for building an AI short video generator, and the useful part is not the fantasy of "push one button, print infinite content."&lt;/p&gt;

&lt;p&gt;The useful part is the stack.&lt;/p&gt;




&lt;h2&gt;
  
  
  The real job is a pipeline
&lt;/h2&gt;

&lt;p&gt;A short-form video generator sounds like one tool.&lt;/p&gt;

&lt;p&gt;In practice, it is a pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;topic research
  -&amp;gt; script
  -&amp;gt; voiceover
  -&amp;gt; footage or visual generation
  -&amp;gt; subtitles
  -&amp;gt; assembly
  -&amp;gt; platform formatting
  -&amp;gt; upload
  -&amp;gt; analytics
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each step has different failure modes.&lt;/p&gt;

&lt;p&gt;Topic research can produce generic ideas.&lt;br&gt;
Scripts can be too long.&lt;br&gt;
Voice can drift from the brand.&lt;br&gt;
Footage can mismatch the narration.&lt;br&gt;
Subtitles can land under platform UI.&lt;br&gt;
FFmpeg can export a technically valid file that a platform still hates.&lt;br&gt;
Uploads can succeed in the API but fail the actual publishing workflow.&lt;/p&gt;

&lt;p&gt;If you try to solve all of that with one giant prompt, the agent has to keep too much operational knowledge in its head.&lt;/p&gt;

&lt;p&gt;That is fragile.&lt;/p&gt;

&lt;p&gt;The better pattern is to split the workflow into skills.&lt;/p&gt;


&lt;h2&gt;
  
  
  What a skill gives the agent
&lt;/h2&gt;

&lt;p&gt;A skill is not just a code snippet.&lt;/p&gt;

&lt;p&gt;For this kind of workflow, a useful skill tells the agent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;when to use this capability&lt;/li&gt;
&lt;li&gt;what inputs are expected&lt;/li&gt;
&lt;li&gt;what output should exist afterward&lt;/li&gt;
&lt;li&gt;what validation is required&lt;/li&gt;
&lt;li&gt;when to stop instead of pretending success&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point matters.&lt;/p&gt;

&lt;p&gt;For media automation, "the command ran" is not enough.&lt;/p&gt;

&lt;p&gt;The agent needs to verify things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;is the video actually 9:16?&lt;/li&gt;
&lt;li&gt;is the duration within the target range?&lt;/li&gt;
&lt;li&gt;does the file have an audio stream?&lt;/li&gt;
&lt;li&gt;are captions inside the safe area?&lt;/li&gt;
&lt;li&gt;is the codec platform-friendly?&lt;/li&gt;
&lt;li&gt;did upload verification happen from the final published page, not just the composer?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the difference between an automation demo and an operating workflow.&lt;/p&gt;


&lt;h2&gt;
  
  
  A practical skills stack for short-form video
&lt;/h2&gt;

&lt;p&gt;The Terminal Skills use case frames the AI short video generator as a stack, not a monolith.&lt;/p&gt;

&lt;p&gt;I would break it down like this.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Research skill
&lt;/h3&gt;

&lt;p&gt;This skill should not just "find trending topics."&lt;/p&gt;

&lt;p&gt;It should produce usable candidates:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;topic
why it is timely
target audience
hook angle
risk level
source links
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a YouTube Shorts pipeline, the research skill should bias toward ideas that can be explained visually in under 60 seconds.&lt;/p&gt;

&lt;p&gt;Not every good article becomes a good Short.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Script skill
&lt;/h3&gt;

&lt;p&gt;Short-form scripts need constraints.&lt;/p&gt;

&lt;p&gt;A useful script skill should enforce:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one idea per video&lt;/li&gt;
&lt;li&gt;hook in the first 1-2 seconds&lt;/li&gt;
&lt;li&gt;short sentences&lt;/li&gt;
&lt;li&gt;a clear visual beat for each section&lt;/li&gt;
&lt;li&gt;no long intro&lt;/li&gt;
&lt;li&gt;no vague CTA unless the channel actually uses CTAs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The output should be structured, not just prose:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hook"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"This one missed call can cost a local business hundreds."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"beats"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"time"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0-5s"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"line"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Most small businesses do not lose leads in ads."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"visual"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"phone ringing unanswered"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"time"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"5-15s"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"line"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"They lose them after the click."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"visual"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"call log with missed calls"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cta"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Follow for more local business automation ideas."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the renderer has something it can work with.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Voice skill
&lt;/h3&gt;

&lt;p&gt;Text-to-speech is easy to call.&lt;/p&gt;

&lt;p&gt;Brand-consistent voice is harder.&lt;/p&gt;

&lt;p&gt;A voice skill should know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;preferred provider&lt;/li&gt;
&lt;li&gt;voice ID or style&lt;/li&gt;
&lt;li&gt;pacing&lt;/li&gt;
&lt;li&gt;loudness target&lt;/li&gt;
&lt;li&gt;whether to use pauses&lt;/li&gt;
&lt;li&gt;file naming conventions&lt;/li&gt;
&lt;li&gt;retry rules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It should also validate that the audio duration roughly matches the script timing before video assembly starts.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Caption skill
&lt;/h3&gt;

&lt;p&gt;Captions are not decoration for Shorts.&lt;/p&gt;

&lt;p&gt;They are part of the format.&lt;/p&gt;

&lt;p&gt;A caption skill should own:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;line length&lt;/li&gt;
&lt;li&gt;word grouping&lt;/li&gt;
&lt;li&gt;font size&lt;/li&gt;
&lt;li&gt;contrast&lt;/li&gt;
&lt;li&gt;bottom safe zone&lt;/li&gt;
&lt;li&gt;whether to use word-level highlighting&lt;/li&gt;
&lt;li&gt;SRT or burned-in output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where a lot of AI video pipelines become visibly cheap.&lt;/p&gt;

&lt;p&gt;The content might be fine, but the captions are too low, too wide, too fast, or hidden under the TikTok/Shorts interface.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. FFmpeg or assembly skill
&lt;/h3&gt;

&lt;p&gt;This is the mechanical layer.&lt;/p&gt;

&lt;p&gt;It should assemble the finished asset into predictable platform-ready output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1080x1920
H.264
AAC
yuv420p
faststart metadata
30-60 seconds
safe captions
consistent naming
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important part is not memorizing the FFmpeg flags.&lt;/p&gt;

&lt;p&gt;The important part is that the agent knows the output contract.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffprobe &lt;span class="nt"&gt;-v&lt;/span&gt; error &lt;span class="nt"&gt;-show_streams&lt;/span&gt; &lt;span class="nt"&gt;-show_format&lt;/span&gt; &lt;span class="nt"&gt;-of&lt;/span&gt; json output/short.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That check should happen after render, not after a human complains that the upload failed.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Upload skill
&lt;/h3&gt;

&lt;p&gt;Upload automation is where I would be most conservative.&lt;/p&gt;

&lt;p&gt;It is one thing to render a local MP4.&lt;br&gt;
It is another thing to publish externally.&lt;/p&gt;

&lt;p&gt;The upload skill should separate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;prepare upload
verify metadata
draft/schedule
publish
confirm public URL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those should not all be one invisible step.&lt;/p&gt;

&lt;p&gt;If a human approval gate is required, the skill should say so plainly.&lt;/p&gt;




&lt;h2&gt;
  
  
  The useful mental model
&lt;/h2&gt;

&lt;p&gt;The mistake is thinking of this as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;prompt -&amp;gt; video
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The better model is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brief -&amp;gt; structured assets -&amp;gt; render -&amp;gt; verify -&amp;gt; publish decision
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That model is slower to explain, but much more reliable in production.&lt;/p&gt;

&lt;p&gt;It also gives the agent smaller jobs.&lt;/p&gt;

&lt;p&gt;The research skill does not need to understand FFmpeg.&lt;br&gt;
The caption skill does not need to know the YouTube Data API.&lt;br&gt;
The upload skill does not need to invent the script.&lt;/p&gt;

&lt;p&gt;Each skill owns a boundary.&lt;/p&gt;

&lt;p&gt;That boundary is what makes the workflow debuggable.&lt;/p&gt;


&lt;h2&gt;
  
  
  What I would automate first
&lt;/h2&gt;

&lt;p&gt;If I were building this from scratch, I would not start with full auto-publishing.&lt;/p&gt;

&lt;p&gt;I would start with a local generator that produces a review folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;shorts/
  001/
    script.json
    voiceover.wav
    captions.srt
    final.mp4
    checks.json
    publish-notes.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then the agent reports:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Generated 12 Shorts.
10 passed validation.
2 need review:
- #04 captions exceed safe zone
- #09 audio duration is longer than target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is already valuable.&lt;/p&gt;

&lt;p&gt;It removes the repetitive production work while keeping a human in control of the final publishing decision.&lt;/p&gt;

&lt;p&gt;Only after that is reliable would I add scheduling or upload automation.&lt;/p&gt;




&lt;h2&gt;
  
  
  The bigger point
&lt;/h2&gt;

&lt;p&gt;AI video automation is not just a model problem.&lt;/p&gt;

&lt;p&gt;It is a workflow problem.&lt;/p&gt;

&lt;p&gt;The teams that win here will not be the ones with the longest prompt.&lt;/p&gt;

&lt;p&gt;They will be the ones that turn each fragile part of the process into a small, documented, reusable skill:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;research&lt;/li&gt;
&lt;li&gt;scripting&lt;/li&gt;
&lt;li&gt;voice&lt;/li&gt;
&lt;li&gt;captions&lt;/li&gt;
&lt;li&gt;rendering&lt;/li&gt;
&lt;li&gt;validation&lt;/li&gt;
&lt;li&gt;upload&lt;/li&gt;
&lt;li&gt;analytics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is how you move from "I made one cool video" to "I can produce a repeatable content pipeline without babysitting every export."&lt;/p&gt;

&lt;p&gt;And that is the part I care about most.&lt;/p&gt;

&lt;p&gt;The demo is the video.&lt;/p&gt;

&lt;p&gt;The product is the workflow.&lt;/p&gt;

&lt;p&gt;Source use case: &lt;a href="https://terminalskills.io/use-cases/build-ai-short-video-generator" rel="noopener noreferrer"&gt;Build an AI Short Video Generator&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>devtools</category>
      <category>productivity</category>
    </item>
    <item>
      <title>AI Answering Service Pricing: The Small Business Cost Model That Actually Matters</title>
      <dc:creator>Alex Shev</dc:creator>
      <pubDate>Fri, 05 Jun 2026 17:23:52 +0000</pubDate>
      <link>https://dev.to/alexshev/ai-answering-service-pricing-the-small-business-cost-model-that-actually-matters-15na</link>
      <guid>https://dev.to/alexshev/ai-answering-service-pricing-the-small-business-cost-model-that-actually-matters-15na</guid>
      <description>&lt;p&gt;Most small businesses compare answering services the wrong way.&lt;/p&gt;

&lt;p&gt;They ask:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What is the cheapest way to get the phone answered?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That sounds reasonable, but it misses the point.&lt;/p&gt;

&lt;p&gt;For a phone-driven business, the real question is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What does it cost to stop losing ready-to-buy callers?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An AI answering service is not valuable because it sounds futuristic. It is valuable when it handles the first few minutes of a lead better than the current workflow: voicemail, missed calls, front-desk overload, slow callbacks, or an answering service that only takes a message.&lt;/p&gt;

&lt;p&gt;This is the practical pricing lens I would use before buying or building one.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Monthly Price Is Only One Line Item
&lt;/h2&gt;

&lt;p&gt;Two vendors can both say "AI answering service" and mean completely different things.&lt;/p&gt;

&lt;p&gt;One may only answer the call, follow a simple script, and create a message log.&lt;/p&gt;

&lt;p&gt;Another may:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;answer calls when staff are busy&lt;/li&gt;
&lt;li&gt;qualify the caller&lt;/li&gt;
&lt;li&gt;identify urgency&lt;/li&gt;
&lt;li&gt;collect service area and contact details&lt;/li&gt;
&lt;li&gt;book appointments&lt;/li&gt;
&lt;li&gt;send missed-call text-back&lt;/li&gt;
&lt;li&gt;update the CRM&lt;/li&gt;
&lt;li&gt;route urgent work to a human&lt;/li&gt;
&lt;li&gt;trigger follow-up if the caller does not book&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are not the same product.&lt;/p&gt;

&lt;p&gt;One is call coverage. The other is a revenue workflow.&lt;/p&gt;

&lt;p&gt;That difference matters more than whether the invoice is a few hundred dollars higher or lower.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Four Options Businesses Are Really Comparing
&lt;/h2&gt;

&lt;p&gt;Most owners are not choosing between AI and nothing. They are choosing between imperfect options they already understand.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Hiring a full-time receptionist
&lt;/h3&gt;

&lt;p&gt;This gives the most control during business hours, but the cost is not just salary.&lt;/p&gt;

&lt;p&gt;You also have payroll taxes, training, turnover, management time, sick days, lunch breaks, vacations, and the fact that one person cannot cover every spike in call volume.&lt;/p&gt;

&lt;p&gt;It may still be the right choice for complex, relationship-heavy calls. It is not automatically the best option for overflow, after-hours, or repetitive intake.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Using a virtual receptionist
&lt;/h3&gt;

&lt;p&gt;A virtual receptionist can be a good middle ground when the business needs a human voice but does not want another full-time hire.&lt;/p&gt;

&lt;p&gt;The tradeoff is usually pricing complexity:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;minutes&lt;/li&gt;
&lt;li&gt;call volume&lt;/li&gt;
&lt;li&gt;scripts&lt;/li&gt;
&lt;li&gt;after-hours rules&lt;/li&gt;
&lt;li&gt;handoff rules&lt;/li&gt;
&lt;li&gt;add-on services&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the service only takes messages, the business still has to do the expensive part later: call back, qualify, schedule, and log everything.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Using a live answering service
&lt;/h3&gt;

&lt;p&gt;Live answering services are useful for basic overflow and after-hours coverage.&lt;/p&gt;

&lt;p&gt;They are often better than voicemail.&lt;/p&gt;

&lt;p&gt;But answering the phone is not the same as moving the lead forward.&lt;/p&gt;

&lt;p&gt;If the service cannot connect to your calendar, qualify the job, log CRM details, handle SMS follow-up, or route urgent work correctly, the business can still lose the lead after the call is "handled."&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Using an AI answering service
&lt;/h3&gt;

&lt;p&gt;AI answering works best when the workflow is repeatable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;intake&lt;/li&gt;
&lt;li&gt;FAQs&lt;/li&gt;
&lt;li&gt;booking&lt;/li&gt;
&lt;li&gt;missed-call recovery&lt;/li&gt;
&lt;li&gt;service-area checks&lt;/li&gt;
&lt;li&gt;urgency triage&lt;/li&gt;
&lt;li&gt;callback requests&lt;/li&gt;
&lt;li&gt;follow-up&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is not the right tool for every sensitive edge case. Humans are still better at unusual judgment calls and emotionally complex conversations.&lt;/p&gt;

&lt;p&gt;But for many local businesses, the first response is the part that breaks most often. AI can make that layer faster, more consistent, and available outside staffed hours.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Actually Drives AI Answering Service Pricing?
&lt;/h2&gt;

&lt;p&gt;The cost usually depends on workflow scope, not just "AI."&lt;/p&gt;

&lt;p&gt;The main pricing drivers are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;call volume and expected minutes&lt;/li&gt;
&lt;li&gt;business-hours coverage vs 24/7 coverage&lt;/li&gt;
&lt;li&gt;voice quality and conversation depth&lt;/li&gt;
&lt;li&gt;custom scripts, FAQs, services, and escalation rules&lt;/li&gt;
&lt;li&gt;calendar, CRM, phone system, and SMS integrations&lt;/li&gt;
&lt;li&gt;missed-call text-back&lt;/li&gt;
&lt;li&gt;appointment booking&lt;/li&gt;
&lt;li&gt;quote request handling&lt;/li&gt;
&lt;li&gt;human escalation&lt;/li&gt;
&lt;li&gt;multi-location routing&lt;/li&gt;
&lt;li&gt;reporting on recovered leads and booked appointments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is why a cheap plan can still be expensive.&lt;/p&gt;

&lt;p&gt;If it answers calls but cannot take action, staff may spend time cleaning up incomplete notes, chasing callers, and manually updating systems.&lt;/p&gt;

&lt;p&gt;The better pricing question is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What will this system do after the caller says what they need?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Watch For Hidden Costs
&lt;/h2&gt;

&lt;p&gt;When comparing vendors, I would look beyond the headline monthly price.&lt;/p&gt;

&lt;p&gt;Common hidden costs include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;setup fees&lt;/li&gt;
&lt;li&gt;per-minute overages&lt;/li&gt;
&lt;li&gt;per-call charges&lt;/li&gt;
&lt;li&gt;SMS fees&lt;/li&gt;
&lt;li&gt;call recording charges&lt;/li&gt;
&lt;li&gt;phone number fees&lt;/li&gt;
&lt;li&gt;extra location or department fees&lt;/li&gt;
&lt;li&gt;calendar or CRM integration fees&lt;/li&gt;
&lt;li&gt;after-hours limits&lt;/li&gt;
&lt;li&gt;human escalation costs&lt;/li&gt;
&lt;li&gt;internal staff time needed to fix messy call notes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The cleanest pricing model is the one you can connect to business outcomes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;calls answered&lt;/li&gt;
&lt;li&gt;missed calls recovered&lt;/li&gt;
&lt;li&gt;leads qualified&lt;/li&gt;
&lt;li&gt;appointments booked&lt;/li&gt;
&lt;li&gt;response time improved&lt;/li&gt;
&lt;li&gt;staff time saved&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the vendor cannot explain how pricing connects to those outcomes, they are probably selling an answering layer rather than an operating workflow.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Simple ROI Model
&lt;/h2&gt;

&lt;p&gt;You do not need a perfect industry benchmark to decide whether AI answering service pricing makes sense.&lt;/p&gt;

&lt;p&gt;Start with the business's own numbers.&lt;/p&gt;

&lt;p&gt;Ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How many calls are missed each month?&lt;/li&gt;
&lt;li&gt;How many after-hours calls go to voicemail?&lt;/li&gt;
&lt;li&gt;How many callers ask the same questions every day?&lt;/li&gt;
&lt;li&gt;What percentage of phone leads become appointments, estimates, consultations, or jobs?&lt;/li&gt;
&lt;li&gt;What is one booked customer worth?&lt;/li&gt;
&lt;li&gt;How much staff time goes into intake, callbacks, reminders, and CRM updates?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For some businesses, one recovered customer can cover the monthly cost.&lt;/p&gt;

&lt;p&gt;That is especially true in categories where a single booked job has meaningful value:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;home services&lt;/li&gt;
&lt;li&gt;dental offices&lt;/li&gt;
&lt;li&gt;med spas&lt;/li&gt;
&lt;li&gt;legal intake&lt;/li&gt;
&lt;li&gt;auto repair&lt;/li&gt;
&lt;li&gt;appointment-based local services&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The ROI case should not be built on "AI saves labor" only.&lt;/p&gt;

&lt;p&gt;The stronger case is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI protects leads that were already paid for or already trying to buy.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Where AI Answering Usually Pays Off First
&lt;/h2&gt;

&lt;p&gt;The first version should not try to automate every call.&lt;/p&gt;

&lt;p&gt;It should start where revenue is already leaking.&lt;/p&gt;

&lt;p&gt;Good first targets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;missed calls during busy hours&lt;/li&gt;
&lt;li&gt;after-hours calls from urgent buyers&lt;/li&gt;
&lt;li&gt;Google Business Profile and Google Maps calls&lt;/li&gt;
&lt;li&gt;paid ad calls&lt;/li&gt;
&lt;li&gt;quote requests&lt;/li&gt;
&lt;li&gt;appointment requests&lt;/li&gt;
&lt;li&gt;repeated intake questions&lt;/li&gt;
&lt;li&gt;service-area and urgency qualification&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If missed calls are the obvious leak, start with missed-call text-back and quick qualification.&lt;/p&gt;

&lt;p&gt;If calls are coming in but staff cannot cover them consistently, AI answering becomes the stronger front layer.&lt;/p&gt;

&lt;p&gt;The first five minutes of the lead are often where the sale is won or lost.&lt;/p&gt;




&lt;h2&gt;
  
  
  AI vs Human Is The Wrong Framing
&lt;/h2&gt;

&lt;p&gt;The useful comparison is not "AI or human?"&lt;/p&gt;

&lt;p&gt;It is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Which parts of the call workflow need speed and structure,
and which parts need judgment?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;AI is stronger for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;instant response&lt;/li&gt;
&lt;li&gt;24/7 availability&lt;/li&gt;
&lt;li&gt;structured intake&lt;/li&gt;
&lt;li&gt;repeat questions&lt;/li&gt;
&lt;li&gt;CRM logging&lt;/li&gt;
&lt;li&gt;booking flows&lt;/li&gt;
&lt;li&gt;follow-up triggers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Humans are stronger for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sensitive complaints&lt;/li&gt;
&lt;li&gt;unusual exceptions&lt;/li&gt;
&lt;li&gt;relationship-heavy sales&lt;/li&gt;
&lt;li&gt;emotional judgment&lt;/li&gt;
&lt;li&gt;high-value handoffs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The best setup may use AI for the first response and humans for the moments that actually need a human.&lt;/p&gt;

&lt;p&gt;That is how the pricing starts to make sense. You are not replacing the whole front desk. You are protecting the part of the workflow where speed, consistency, and routing matter most.&lt;/p&gt;




&lt;h2&gt;
  
  
  What To Know Before Asking For A Quote
&lt;/h2&gt;

&lt;p&gt;Before talking to vendors, prepare the inputs that actually affect price.&lt;/p&gt;

&lt;p&gt;Bring:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;monthly call volume&lt;/li&gt;
&lt;li&gt;missed-call volume&lt;/li&gt;
&lt;li&gt;business hours&lt;/li&gt;
&lt;li&gt;after-hours needs&lt;/li&gt;
&lt;li&gt;main call sources&lt;/li&gt;
&lt;li&gt;service areas&lt;/li&gt;
&lt;li&gt;locations&lt;/li&gt;
&lt;li&gt;urgent-call rules&lt;/li&gt;
&lt;li&gt;current CRM&lt;/li&gt;
&lt;li&gt;calendar or booking tools&lt;/li&gt;
&lt;li&gt;phone system&lt;/li&gt;
&lt;li&gt;who handles escalations&lt;/li&gt;
&lt;li&gt;what counts as a qualified lead&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the vendor does not ask about those things, be careful.&lt;/p&gt;

&lt;p&gt;They may be pricing a generic voice layer, not the workflow your business actually needs.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;The best AI answering service is not the one with the lowest monthly number.&lt;/p&gt;

&lt;p&gt;It is the one where the price makes sense after you count:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;missed calls&lt;/li&gt;
&lt;li&gt;after-hours leads&lt;/li&gt;
&lt;li&gt;front-desk time&lt;/li&gt;
&lt;li&gt;booking gaps&lt;/li&gt;
&lt;li&gt;manual follow-up&lt;/li&gt;
&lt;li&gt;lost paid traffic&lt;/li&gt;
&lt;li&gt;the value of a recovered customer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a business only needs basic message-taking, a simple answering service may be enough.&lt;/p&gt;

&lt;p&gt;If the business needs intake, booking, CRM updates, missed-call recovery, and follow-up, AI answering starts to look less like a phone expense and more like revenue infrastructure.&lt;/p&gt;

&lt;p&gt;Originally published on AIEmployees:&lt;br&gt;
&lt;a href="https://aiemployees.us/blog/ai-answering-service-pricing" rel="noopener noreferrer"&gt;https://aiemployees.us/blog/ai-answering-service-pricing&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>startup</category>
    </item>
    <item>
      <title>HVAC Missed-Call Automation: The AI Workflow That Actually Protects Revenue</title>
      <dc:creator>Alex Shev</dc:creator>
      <pubDate>Thu, 04 Jun 2026 17:48:20 +0000</pubDate>
      <link>https://dev.to/alexshev/hvac-missed-call-automation-the-ai-workflow-that-actually-protects-revenue-1eo</link>
      <guid>https://dev.to/alexshev/hvac-missed-call-automation-the-ai-workflow-that-actually-protects-revenue-1eo</guid>
      <description>&lt;p&gt;Most HVAC companies do not lose good jobs because the customer was impossible to convince.&lt;/p&gt;

&lt;p&gt;They lose them because the customer had a hot house, a cold office, or a broken system, and the first helpful company answered faster.&lt;/p&gt;

&lt;p&gt;That is why the strongest AI automation case for HVAC is usually not a generic website chatbot. It is a missed-call and emergency-intake workflow that responds in seconds, asks the right questions, routes the lead, and gives the team clean context.&lt;/p&gt;

&lt;p&gt;The promise is not "replace your office staff with AI."&lt;/p&gt;

&lt;p&gt;The promise is simpler:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;No urgent HVAC lead should wait until tomorrow
just because everyone was busy today.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a practical breakdown of what that workflow should look like.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Leak Is Speed
&lt;/h2&gt;

&lt;p&gt;HVAC demand is urgent, seasonal, and local.&lt;/p&gt;

&lt;p&gt;When air conditioning fails during a heat wave or a furnace stops working before a cold night, the buyer is not casually researching vendors. They are trying to get help.&lt;/p&gt;

&lt;p&gt;That creates a simple operational problem.&lt;/p&gt;

&lt;p&gt;Calls spike when the team is already under pressure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the office coordinator is dispatching technicians&lt;/li&gt;
&lt;li&gt;the owner is moving between estimates and crews&lt;/li&gt;
&lt;li&gt;technicians are on jobs&lt;/li&gt;
&lt;li&gt;after-hours calls go to voicemail or an answering service&lt;/li&gt;
&lt;li&gt;emergency and routine requests get mixed together&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the caller reaches voicemail, they usually do not wait patiently. They call the next company.&lt;/p&gt;

&lt;p&gt;The missed call is not just a phone event. It is a revenue event.&lt;/p&gt;




&lt;h2&gt;
  
  
  What The Workflow Needs To Do
&lt;/h2&gt;

&lt;p&gt;A useful HVAC missed-call workflow has five parts.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Detect The Missed Call
&lt;/h3&gt;

&lt;p&gt;The system should know when a call was missed and respond quickly.&lt;/p&gt;

&lt;p&gt;The first text should be short and useful:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sorry we missed you. Is this for no cooling, no heat,
maintenance, or a quote? Reply with your address and
what is happening, and we will help route it.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal is not to sound clever. The goal is to restart the conversation before the customer books someone else.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Separate Emergency From Routine
&lt;/h3&gt;

&lt;p&gt;The AI should not treat every request the same.&lt;/p&gt;

&lt;p&gt;It needs to ask a few questions that decide urgency and routing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is this no cooling, no heat, water around the unit, unusual smell, noise, thermostat issue, or maintenance?&lt;/li&gt;
&lt;li&gt;Is anyone in the home vulnerable to heat or cold?&lt;/li&gt;
&lt;li&gt;Is this residential, commercial, landlord, or property manager work?&lt;/li&gt;
&lt;li&gt;What is the service address and ZIP code?&lt;/li&gt;
&lt;li&gt;Is the caller new, returning, or on a maintenance plan?&lt;/li&gt;
&lt;li&gt;Does the issue need same-day dispatch, next available booking, or an estimate?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those answers turn a messy missed call into a usable intake record.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Hand Off Cleanly
&lt;/h3&gt;

&lt;p&gt;For routine work, the workflow can collect preferred appointment windows.&lt;/p&gt;

&lt;p&gt;For urgent work, it can alert dispatch or the on-call person with a summary.&lt;/p&gt;

&lt;p&gt;A good handoff includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;caller name&lt;/li&gt;
&lt;li&gt;phone number&lt;/li&gt;
&lt;li&gt;service address&lt;/li&gt;
&lt;li&gt;issue type&lt;/li&gt;
&lt;li&gt;urgency&lt;/li&gt;
&lt;li&gt;equipment notes if available&lt;/li&gt;
&lt;li&gt;source of the lead&lt;/li&gt;
&lt;li&gt;preferred timing&lt;/li&gt;
&lt;li&gt;transcript or short summary&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This matters because the dispatcher should not have to call back just to ask the same first questions.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Log The Lead
&lt;/h3&gt;

&lt;p&gt;If the workflow only sends a text, it is useful but limited.&lt;/p&gt;

&lt;p&gt;The better version updates the CRM or lead tracker:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;lead source&lt;/li&gt;
&lt;li&gt;service type&lt;/li&gt;
&lt;li&gt;urgency&lt;/li&gt;
&lt;li&gt;booked status&lt;/li&gt;
&lt;li&gt;assigned owner&lt;/li&gt;
&lt;li&gt;follow-up outcome&lt;/li&gt;
&lt;li&gt;lost lead reason if known&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This turns the workflow into an operating report.&lt;/p&gt;

&lt;p&gt;Now the company can answer questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How many missed calls became booked jobs?&lt;/li&gt;
&lt;li&gt;Which ad sources produce urgent calls?&lt;/li&gt;
&lt;li&gt;Which service types go cold most often?&lt;/li&gt;
&lt;li&gt;How many after-hours leads are worth staffing or automating?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is where AI stops being a novelty and becomes management infrastructure.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Follow Up Without Spamming
&lt;/h3&gt;

&lt;p&gt;Some HVAC leads are ready to book immediately. Others need a little context before they say yes.&lt;/p&gt;

&lt;p&gt;Follow-up should match the situation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no reply after missed-call text: send one short check-in&lt;/li&gt;
&lt;li&gt;quote request: explain the next step and ask for photos if useful&lt;/li&gt;
&lt;li&gt;replacement lead: route to owner or comfort advisor&lt;/li&gt;
&lt;li&gt;maintenance customer: offer plan renewal or seasonal tune-up&lt;/li&gt;
&lt;li&gt;completed job: trigger review request and future maintenance reminder&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key is that follow-up should be tied to the customer's actual intent. Generic drip messages are how automation starts to feel cheap.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why "AI Receptionist" Is Too Vague
&lt;/h2&gt;

&lt;p&gt;Many companies sell this as an AI receptionist.&lt;/p&gt;

&lt;p&gt;That phrase is not wrong, but it is too broad.&lt;/p&gt;

&lt;p&gt;An HVAC owner does not wake up thinking, "I need an AI receptionist." They think:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We missed three calls during dispatch.&lt;/li&gt;
&lt;li&gt;The after-hours service did not qualify the lead.&lt;/li&gt;
&lt;li&gt;The coordinator forgot to follow up on a replacement quote.&lt;/li&gt;
&lt;li&gt;We do not know which Google Ads calls actually became jobs.&lt;/li&gt;
&lt;li&gt;We are paying for leads that disappear before anyone responds.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the offer should be framed around the leak:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Recover missed HVAC calls before competitors answer.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is much more concrete than "AI chatbot" or "AI receptionist."&lt;/p&gt;




&lt;h2&gt;
  
  
  A Simple ROI Model
&lt;/h2&gt;

&lt;p&gt;The cleanest sales conversation is not a giant industry claim.&lt;/p&gt;

&lt;p&gt;It is a worksheet based on the company's own numbers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How many calls do you miss per week?&lt;/li&gt;
&lt;li&gt;How many after-hours calls go unanswered?&lt;/li&gt;
&lt;li&gt;What percentage of emergency calls usually become jobs?&lt;/li&gt;
&lt;li&gt;What is the average repair ticket?&lt;/li&gt;
&lt;li&gt;What is the average replacement estimate value?&lt;/li&gt;
&lt;li&gt;How many quote follow-ups go cold each month?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the company recovers even a few extra jobs per month, the workflow can pay for itself.&lt;/p&gt;

&lt;p&gt;But the math should come from call logs and job history, not a generic promise.&lt;/p&gt;

&lt;p&gt;That is also useful for implementation. The first version should focus on the highest-value leak, not every possible automation.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Practical Four-Week Rollout
&lt;/h2&gt;

&lt;p&gt;The first version does not need to automate the whole business.&lt;/p&gt;

&lt;p&gt;It needs to catch the leads that currently leak.&lt;/p&gt;

&lt;h3&gt;
  
  
  Week 1: Map The Intake
&lt;/h3&gt;

&lt;p&gt;Document call sources, service area, emergency criteria, escalation contacts, booking rules, and the questions dispatch already asks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Week 2: Launch Missed-Call Text-Back
&lt;/h3&gt;

&lt;p&gt;Start with instant missed-call response, basic qualification, and internal alerts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Week 3: Add Booking And CRM Logging
&lt;/h3&gt;

&lt;p&gt;Connect appointment collection, CRM updates, source tracking, and follow-up status.&lt;/p&gt;

&lt;h3&gt;
  
  
  Week 4: Review Outcomes
&lt;/h3&gt;

&lt;p&gt;Look at response rate, booked jobs, dead leads, emergency routing accuracy, and the questions customers keep asking.&lt;/p&gt;

&lt;p&gt;Then tune the workflow.&lt;/p&gt;

&lt;p&gt;Do not start by automating everything. Start by protecting the moment where money is currently escaping.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where Video Can Help
&lt;/h2&gt;

&lt;p&gt;HVAC buyers often hesitate because they do not know what happens next.&lt;/p&gt;

&lt;p&gt;They may wonder:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is there a service fee?&lt;/li&gt;
&lt;li&gt;How fast can someone arrive?&lt;/li&gt;
&lt;li&gt;Is this repair or replacement?&lt;/li&gt;
&lt;li&gt;Will I get pressured into a new system?&lt;/li&gt;
&lt;li&gt;Can I trust this company in an emergency?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Short video assets can help here.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what happens after an emergency service request&lt;/li&gt;
&lt;li&gt;how repair vs replacement is diagnosed&lt;/li&gt;
&lt;li&gt;what to check before the technician arrives&lt;/li&gt;
&lt;li&gt;why maintenance plans prevent emergency calls&lt;/li&gt;
&lt;li&gt;a short owner introduction for high-value replacement leads&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The AI workflow can send the right video at the right moment. The video builds trust. The automation keeps the lead moving.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;For HVAC companies, AI works best when it is attached to a real business moment.&lt;/p&gt;

&lt;p&gt;A homeowner needs help. The phone is busy. The next useful response decides who gets the job.&lt;/p&gt;

&lt;p&gt;That is the moment worth automating.&lt;/p&gt;

&lt;p&gt;The workflow should reply instantly, qualify urgency, prepare dispatch, log the lead, follow up, and support the sale with useful proof.&lt;/p&gt;

&lt;p&gt;That is a stronger story than a generic AI chatbot because it is tied to a specific revenue leak.&lt;/p&gt;

&lt;p&gt;Originally published on AIEmployees:&lt;br&gt;
&lt;a href="https://aiemployees.us/blog/hvac-missed-call-ai-workflow" rel="noopener noreferrer"&gt;https://aiemployees.us/blog/hvac-missed-call-ai-workflow&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>crm</category>
    </item>
    <item>
      <title>Stop Teaching Terminal Commands. Teach Terminal Workflows.</title>
      <dc:creator>Alex Shev</dc:creator>
      <pubDate>Mon, 01 Jun 2026 15:35:38 +0000</pubDate>
      <link>https://dev.to/alexshev/stop-teaching-terminal-commands-teach-terminal-workflows-n4p</link>
      <guid>https://dev.to/alexshev/stop-teaching-terminal-commands-teach-terminal-workflows-n4p</guid>
      <description>&lt;p&gt;Most terminal education teaches commands.&lt;/p&gt;

&lt;p&gt;That makes sense at the beginning.&lt;/p&gt;

&lt;p&gt;You need to know what &lt;code&gt;grep&lt;/code&gt; does. You need to know how &lt;code&gt;find&lt;/code&gt; works. You need to understand pipes, redirects, exit codes, environment variables, and shell scripts.&lt;/p&gt;

&lt;p&gt;But after a while, the command is not the hard part.&lt;/p&gt;

&lt;p&gt;The hard part is the workflow.&lt;/p&gt;

&lt;p&gt;Not:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; &lt;span class="s2"&gt;"TODO"&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Inspect the repo.
Find the risky files.
Decide what needs changing.
Run the smallest useful command.
Verify the result.
Recover cleanly if the command was wrong.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the part most people are not taught.&lt;/p&gt;

&lt;p&gt;And it is also the part AI agents need most.&lt;/p&gt;




&lt;h2&gt;
  
  
  Commands are vocabulary
&lt;/h2&gt;

&lt;p&gt;Knowing terminal commands is useful.&lt;/p&gt;

&lt;p&gt;But commands are vocabulary.&lt;/p&gt;

&lt;p&gt;Workflows are how you actually get work done.&lt;/p&gt;

&lt;p&gt;A beginner asks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What command lists files?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A more experienced developer asks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What am I trying to learn from the filesystem, and what is the safest way to inspect it?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those are different questions.&lt;/p&gt;

&lt;p&gt;For example, this command is easy to memorize:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But the real workflow might be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;pwd
ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt;
find &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-maxdepth&lt;/span&gt; 2 &lt;span class="nt"&gt;-type&lt;/span&gt; f | &lt;span class="nb"&gt;head
&lt;/span&gt;git status &lt;span class="nt"&gt;--short&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That sequence tells you where you are, what is around you, what kind of project you are in, and whether the workspace is already dirty.&lt;/p&gt;

&lt;p&gt;The command is small.&lt;/p&gt;

&lt;p&gt;The judgment around the command is the skill.&lt;/p&gt;




&lt;h2&gt;
  
  
  A terminal workflow has stages
&lt;/h2&gt;

&lt;p&gt;I like this simple model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;inspect -&amp;gt; decide -&amp;gt; run -&amp;gt; verify -&amp;gt; recover
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That pattern shows up everywhere.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Inspect
&lt;/h3&gt;

&lt;p&gt;Before you change anything, learn the shape of the problem.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;pwd
&lt;/span&gt;git status &lt;span class="nt"&gt;--short&lt;/span&gt;
find &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-maxdepth&lt;/span&gt; 2 &lt;span class="nt"&gt;-type&lt;/span&gt; f | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-50&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not busywork.&lt;/p&gt;

&lt;p&gt;It prevents the most common terminal mistake: running the right command in the wrong place.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Decide
&lt;/h3&gt;

&lt;p&gt;Once you inspect, choose the smallest useful action.&lt;/p&gt;

&lt;p&gt;Do not start with the most powerful command.&lt;/p&gt;

&lt;p&gt;Start with the command that gives you more information or makes a reversible change.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git diff &lt;span class="nt"&gt;--&lt;/span&gt; path/to/file
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;before:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffprobe input.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;before:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; input.mp4 output.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Run
&lt;/h3&gt;

&lt;p&gt;Run the command with a clear expectation.&lt;/p&gt;

&lt;p&gt;You should know what success looks like before you press Enter.&lt;/p&gt;

&lt;p&gt;Bad:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Let's try this and see what happens.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Better:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;This should produce one MP4 in the output folder, keep the source file unchanged, and exit non-zero if the input is invalid.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Verify
&lt;/h3&gt;

&lt;p&gt;The command finishing is not the same as the workflow being done.&lt;/p&gt;

&lt;p&gt;If you converted a video, inspect the output.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffprobe output.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you changed code, run a relevant test.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you edited content, check the final rendered page, not just the local markdown.&lt;/p&gt;

&lt;p&gt;Verification is where a terminal habit becomes a production workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Recover
&lt;/h3&gt;

&lt;p&gt;Every useful workflow needs a recovery path.&lt;/p&gt;

&lt;p&gt;What happens if the command fails?&lt;/p&gt;

&lt;p&gt;What happens if it succeeds but produces the wrong output?&lt;/p&gt;

&lt;p&gt;What happens if the workspace already had unrelated changes?&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git diff
git restore &lt;span class="nt"&gt;--staged&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; output_failed
&lt;span class="nb"&gt;mv &lt;/span&gt;broken-output.mp4 output_failed/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Recovery should not be improvised after something breaks.&lt;/p&gt;

&lt;p&gt;It should be part of the workflow.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this matters more with AI agents
&lt;/h2&gt;

&lt;p&gt;AI agents are very good at discovering commands.&lt;/p&gt;

&lt;p&gt;They can usually find the right shell syntax faster than a human can.&lt;/p&gt;

&lt;p&gt;But they can still fail in familiar ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;running commands before inspecting the project&lt;/li&gt;
&lt;li&gt;using broad commands when a narrow one would do&lt;/li&gt;
&lt;li&gt;trusting success output too early&lt;/li&gt;
&lt;li&gt;overwriting files without a recovery plan&lt;/li&gt;
&lt;li&gt;skipping platform-specific verification&lt;/li&gt;
&lt;li&gt;treating a tool capability as a finished workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is why "give the agent terminal access" is not enough.&lt;/p&gt;

&lt;p&gt;Tool access gives the agent hands.&lt;/p&gt;

&lt;p&gt;The workflow tells the agent what careful work looks like.&lt;/p&gt;




&lt;h2&gt;
  
  
  Example: teaching &lt;code&gt;grep&lt;/code&gt; vs teaching search
&lt;/h2&gt;

&lt;p&gt;You can teach someone this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; &lt;span class="s2"&gt;"stripe"&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is a command.&lt;/p&gt;

&lt;p&gt;But a real search workflow might be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git status &lt;span class="nt"&gt;--short&lt;/span&gt;
find &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-maxdepth&lt;/span&gt; 3 &lt;span class="nt"&gt;-type&lt;/span&gt; f | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-100&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; &lt;span class="nt"&gt;--exclude-dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;node_modules &lt;span class="nt"&gt;--exclude-dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;.git &lt;span class="s2"&gt;"stripe"&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; &lt;span class="nt"&gt;--include&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"*.ts"&lt;/span&gt; &lt;span class="nt"&gt;--include&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"*.tsx"&lt;/span&gt; &lt;span class="s2"&gt;"createCheckout"&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The difference is not just syntax.&lt;/p&gt;

&lt;p&gt;The workflow says:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;check the workspace first&lt;/li&gt;
&lt;li&gt;avoid dependency folders&lt;/li&gt;
&lt;li&gt;search broadly, then narrow by file type&lt;/li&gt;
&lt;li&gt;search both product terms and implementation terms&lt;/li&gt;
&lt;li&gt;do not edit until you know where the real boundary is&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is what developers actually do.&lt;/p&gt;

&lt;p&gt;The command is only one piece.&lt;/p&gt;




&lt;h2&gt;
  
  
  Example: teaching &lt;code&gt;ffmpeg&lt;/code&gt; vs teaching media prep
&lt;/h2&gt;

&lt;p&gt;You can teach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; input.mov output.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is fine for a demo.&lt;/p&gt;

&lt;p&gt;But if the file needs to be uploaded to a platform, the workflow matters more:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Inspect input.
Check duration, codec, pixel format, audio, and dimensions.
Convert to a safe default.
Inspect output.
Check file size.
Upload.
Verify the real platform preview.
Publish.
Verify the final post.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important lesson is not "use FFmpeg."&lt;/p&gt;

&lt;p&gt;The important lesson is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Never trust a media conversion until the destination platform accepts it.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is workflow knowledge.&lt;/p&gt;




&lt;h2&gt;
  
  
  This is where Terminal Skills fits
&lt;/h2&gt;

&lt;p&gt;Terminal Skills is useful because it gives agents a way to package workflows, not just commands.&lt;/p&gt;

&lt;p&gt;A good skill does not only say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Run this command.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It says:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use this when the task looks like this.
Inspect these inputs.
Run these steps.
Stop in these cases.
Verify these outputs.
Report the result in this format.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the missing layer between raw tool access and reliable automation.&lt;/p&gt;

&lt;p&gt;For example, a media skill can teach an agent how to prepare upload-safe video.&lt;/p&gt;

&lt;p&gt;A Git skill can teach an agent how to inspect a dirty worktree without destroying user changes.&lt;/p&gt;

&lt;p&gt;A deployment skill can teach an agent how to build, test, deploy, and verify a live URL.&lt;/p&gt;

&lt;p&gt;The point is not that the terminal becomes easier.&lt;/p&gt;

&lt;p&gt;The point is that the workflow becomes repeatable.&lt;/p&gt;




&lt;h2&gt;
  
  
  A useful skill has a definition of done
&lt;/h2&gt;

&lt;p&gt;This is the part I care about most.&lt;/p&gt;

&lt;p&gt;A command can finish successfully and still not solve the problem.&lt;/p&gt;

&lt;p&gt;A skill should define done.&lt;/p&gt;

&lt;p&gt;For a code change:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Done means the targeted files were changed, tests passed, no unrelated files were touched, and the result was summarized with exact file paths.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a video conversion:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Done means the output file is readable, uses the expected codec and pixel format, is under the target size, and has been accepted by the upload composer.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a content workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Done means the draft exists, the links work, the target platform format is respected, and publishing approval was recorded.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That last line matters.&lt;/p&gt;

&lt;p&gt;In real work, verification and approval are part of the system.&lt;/p&gt;

&lt;p&gt;They are not optional admin details.&lt;/p&gt;




&lt;h2&gt;
  
  
  The better way to teach terminal work
&lt;/h2&gt;

&lt;p&gt;I still think people should learn commands.&lt;/p&gt;

&lt;p&gt;But I would not stop there.&lt;/p&gt;

&lt;p&gt;Teach commands inside workflows.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Here are 20 useful Linux commands.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Teach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Here is how to inspect an unfamiliar repo.
Here is how to safely search a codebase.
Here is how to prepare a video for upload.
Here is how to debug a broken script.
Here is how to verify a deployment.
Here is how to recover after a bad command.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is closer to how developers actually work.&lt;/p&gt;

&lt;p&gt;It is also closer to what AI agents need.&lt;/p&gt;

&lt;p&gt;Because the future of terminal automation is not agents memorizing more commands.&lt;/p&gt;

&lt;p&gt;It is agents following better workflows.&lt;/p&gt;




&lt;p&gt;If you are building with AI agents, ask this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What terminal task do I keep explaining from scratch?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is probably not a prompt problem.&lt;/p&gt;

&lt;p&gt;It is probably a workflow that should become a skill.&lt;/p&gt;

&lt;p&gt;Disclosure: I used AI assistance to draft and edit this article, then reviewed the examples, commands, and claims before publishing.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>cli</category>
      <category>devtools</category>
      <category>ai</category>
    </item>
    <item>
      <title>How I Made AI Video Uploads Boring with a Terminal Skill</title>
      <dc:creator>Alex Shev</dc:creator>
      <pubDate>Sat, 30 May 2026 23:18:20 +0000</pubDate>
      <link>https://dev.to/alexshev/how-i-made-ai-video-uploads-boring-with-a-terminal-skill-54pe</link>
      <guid>https://dev.to/alexshev/how-i-made-ai-video-uploads-boring-with-a-terminal-skill-54pe</guid>
      <description>&lt;p&gt;AI video demos are getting easier to generate.&lt;/p&gt;

&lt;p&gt;Publishing them is still weirdly fragile.&lt;/p&gt;

&lt;p&gt;Last week I had a simple task: take an AI-generated demo video, attach it to a post, and publish it without the platform silently dropping the media.&lt;/p&gt;

&lt;p&gt;The video looked fine locally.&lt;/p&gt;

&lt;p&gt;The upload did not.&lt;/p&gt;

&lt;p&gt;Wrong codec. Too large. Slow processing. Missing preview. No clear error. The browser said the upload was okay, but the composer did not actually register the file.&lt;/p&gt;

&lt;p&gt;That is the kind of problem I do not want to solve from memory at 11 PM.&lt;/p&gt;

&lt;p&gt;So I turned it into a Terminal Skill.&lt;/p&gt;

&lt;p&gt;Not a giant automation platform. Not a magic agent prompt. Just a small repeatable workflow that takes a messy video file and produces an X-safe default MP4 with checks before and after the conversion.&lt;/p&gt;

&lt;p&gt;Here is the use case.&lt;/p&gt;




&lt;h2&gt;
  
  
  The actual problem
&lt;/h2&gt;

&lt;p&gt;AI video tools often export files that are technically valid but awkward for social platforms.&lt;/p&gt;

&lt;p&gt;Common issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;file is too large&lt;/li&gt;
&lt;li&gt;codec is accepted by QuickTime but not by the platform&lt;/li&gt;
&lt;li&gt;pixel format is not &lt;code&gt;yuv420p&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;metadata is not optimized for web playback&lt;/li&gt;
&lt;li&gt;resolution is higher than needed&lt;/li&gt;
&lt;li&gt;audio track is missing or weird&lt;/li&gt;
&lt;li&gt;duration is fine visually but platform processing hangs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can fix most of this with FFmpeg.&lt;/p&gt;

&lt;p&gt;But the problem is not knowing that FFmpeg exists.&lt;/p&gt;

&lt;p&gt;The problem is remembering the exact flags, running them consistently, checking the output, and not trusting the browser upload until the platform shows a real preview.&lt;/p&gt;

&lt;p&gt;That is where a Terminal Skill helps.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I mean by a Terminal Skill
&lt;/h2&gt;

&lt;p&gt;For this workflow, a Terminal Skill is a small folder with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one script that does the conversion&lt;/li&gt;
&lt;li&gt;one validation step before conversion&lt;/li&gt;
&lt;li&gt;one validation step after conversion&lt;/li&gt;
&lt;li&gt;a short &lt;code&gt;SKILL.md&lt;/code&gt; explaining when to use it&lt;/li&gt;
&lt;li&gt;predictable input and output paths&lt;/li&gt;
&lt;li&gt;logs that make it obvious what happened&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important part is not the script itself.&lt;/p&gt;

&lt;p&gt;The important part is that the workflow becomes reusable by a human or an agent without rediscovering the rules every time.&lt;/p&gt;

&lt;p&gt;The skill answers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;When should I use this?
What input does it expect?
What output should it produce?
How do I know it worked?
When should I stop instead of publishing?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That last question matters a lot.&lt;/p&gt;

&lt;p&gt;For external platforms, "the command succeeded" is not the same as "the post is safe to publish."&lt;/p&gt;




&lt;h2&gt;
  
  
  The folder structure
&lt;/h2&gt;

&lt;p&gt;I kept the structure boring:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;x-safe-video/
  SKILL.md
  make-x-safe.sh
  examples/
  output/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The script does the mechanical work.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;SKILL.md&lt;/code&gt; documents the operating rules:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# X-Safe Video&lt;/span&gt;

Use this when preparing generated video for X/Twitter upload.

Input:
&lt;span class="p"&gt;-&lt;/span&gt; MP4, MOV, or WebM
&lt;span class="p"&gt;-&lt;/span&gt; preferably under 2 minutes

Output:
&lt;span class="p"&gt;-&lt;/span&gt; MP4
&lt;span class="p"&gt;-&lt;/span&gt; H.264 video
&lt;span class="p"&gt;-&lt;/span&gt; AAC audio if audio exists
&lt;span class="p"&gt;-&lt;/span&gt; yuv420p pixel format
&lt;span class="p"&gt;-&lt;/span&gt; faststart metadata
&lt;span class="p"&gt;-&lt;/span&gt; scaled down if needed

Stop if:
&lt;span class="p"&gt;-&lt;/span&gt; ffprobe cannot read the file
&lt;span class="p"&gt;-&lt;/span&gt; output has no video stream
&lt;span class="p"&gt;-&lt;/span&gt; output is larger than the target platform limit
&lt;span class="p"&gt;-&lt;/span&gt; upload composer does not show a real video preview
&lt;span class="p"&gt;-&lt;/span&gt; platform does not show Uploaded 100%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the difference between a script and a skill.&lt;/p&gt;

&lt;p&gt;A script says:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Run this command.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A skill says:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Here is the workflow, the boundary, and the definition of done.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The conversion script
&lt;/h2&gt;

&lt;p&gt;Here is the simplified version.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-euo&lt;/span&gt; pipefail

&lt;span class="nv"&gt;INPUT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;:?Usage:&lt;span class="p"&gt; ./make-x-safe.sh input-video&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;OUTDIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;OUTDIR&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="p"&gt;./output&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$OUTDIR&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$INPUT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Input file not found: &lt;/span&gt;&lt;span class="nv"&gt;$INPUT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2
  &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi

&lt;/span&gt;&lt;span class="nv"&gt;BASENAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;basename&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$INPUT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BASENAME&lt;/span&gt;&lt;span class="p"&gt;%.*&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;OUTPUT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$OUTDIR&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;_x_safe.mp4"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Inspecting input..."&lt;/span&gt;
ffprobe &lt;span class="nt"&gt;-v&lt;/span&gt; error &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-select_streams&lt;/span&gt; v:0 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-show_entries&lt;/span&gt; &lt;span class="nv"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;codec_name,width,height,pix_fmt,duration &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-of&lt;/span&gt; &lt;span class="nv"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;noprint_wrappers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$INPUT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Converting to X-safe MP4..."&lt;/span&gt;
ffmpeg &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$INPUT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-vf&lt;/span&gt; &lt;span class="s2"&gt;"scale='min(1280,iw)':-2"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-c&lt;/span&gt;:v libx264 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-profile&lt;/span&gt;:v high &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-pix_fmt&lt;/span&gt; yuv420p &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-preset&lt;/span&gt; medium &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-crf&lt;/span&gt; 23 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-movflags&lt;/span&gt; +faststart &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-c&lt;/span&gt;:a aac &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-b&lt;/span&gt;:a 128k &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$OUTPUT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Inspecting output..."&lt;/span&gt;
ffprobe &lt;span class="nt"&gt;-v&lt;/span&gt; error &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-select_streams&lt;/span&gt; v:0 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-show_entries&lt;/span&gt; &lt;span class="nv"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;codec_name,width,height,pix_fmt,duration &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-of&lt;/span&gt; &lt;span class="nv"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;noprint_wrappers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$OUTPUT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nv"&gt;BYTES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; &amp;lt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$OUTPUT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;MB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;BYTES &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="m"&gt;1024&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="m"&gt;1024&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Output: &lt;/span&gt;&lt;span class="nv"&gt;$OUTPUT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Size: &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MB&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;MB"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not the most advanced FFmpeg command in the world.&lt;/p&gt;

&lt;p&gt;That is the point.&lt;/p&gt;

&lt;p&gt;The goal is not to make the cleverest media pipeline. The goal is to make a reliable default that works under pressure.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why these flags matter
&lt;/h2&gt;

&lt;p&gt;The important pieces:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;-c&lt;/span&gt;:v libx264
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;H.264 is still the safest default for social uploads.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;-pix_fmt&lt;/span&gt; yuv420p
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This avoids the classic "works locally, fails elsewhere" problem with pixel formats.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;-movflags&lt;/span&gt; +faststart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This moves metadata to the beginning of the file so web playback can start faster.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;-vf&lt;/span&gt; &lt;span class="s2"&gt;"scale='min(1280,iw)':-2"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps smaller videos unchanged and scales oversized ones down to a practical width.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;-crf&lt;/span&gt; 23
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Good enough quality without creating a monster file.&lt;/p&gt;

&lt;p&gt;Could I tune this per video? Yes.&lt;/p&gt;

&lt;p&gt;Do I want to think about that every time I need to publish a 20-second AI demo? No.&lt;/p&gt;




&lt;h2&gt;
  
  
  The verification step is the real skill
&lt;/h2&gt;

&lt;p&gt;The conversion is only half the workflow.&lt;/p&gt;

&lt;p&gt;The platform check matters more.&lt;/p&gt;

&lt;p&gt;My rule now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Do not trust "upload succeeded."
Trust only the composer state.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For an AI video post, I want to see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;video preview visible&lt;/li&gt;
&lt;li&gt;upload progress completed&lt;/li&gt;
&lt;li&gt;platform disclosure selected if needed&lt;/li&gt;
&lt;li&gt;post button enabled&lt;/li&gt;
&lt;li&gt;final published post shows the video&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the browser automation says the file was uploaded but the composer does not show the video, the workflow stops.&lt;/p&gt;

&lt;p&gt;That sounds obvious, but this is where a lot of automation breaks.&lt;/p&gt;

&lt;p&gt;It checks the API call or file input state, not the actual user-facing publishing state.&lt;/p&gt;

&lt;p&gt;The skill's job is to keep that distinction explicit.&lt;/p&gt;




&lt;h2&gt;
  
  
  Making it agent-friendly
&lt;/h2&gt;

&lt;p&gt;The next step is making the workflow easy for an AI agent to use.&lt;/p&gt;

&lt;p&gt;That means the skill needs plain instructions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Agent Instructions&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; Run &lt;span class="sb"&gt;`./make-x-safe.sh &amp;lt;video&amp;gt;`&lt;/span&gt;.
&lt;span class="p"&gt;2.&lt;/span&gt; Read the output path from stdout.
&lt;span class="p"&gt;3.&lt;/span&gt; Confirm &lt;span class="sb"&gt;`ffprobe`&lt;/span&gt; shows:
&lt;span class="p"&gt;   -&lt;/span&gt; codec_name=h264
&lt;span class="p"&gt;   -&lt;/span&gt; pix_fmt=yuv420p
&lt;span class="p"&gt;4.&lt;/span&gt; Check file size.
&lt;span class="p"&gt;5.&lt;/span&gt; Upload through the real platform composer.
&lt;span class="p"&gt;6.&lt;/span&gt; Verify visual preview before posting.
&lt;span class="p"&gt;7.&lt;/span&gt; After posting, open the final URL and verify the video is embedded.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice what is missing:&lt;/p&gt;

&lt;p&gt;No vague "make it work."&lt;/p&gt;

&lt;p&gt;No "post when ready."&lt;/p&gt;

&lt;p&gt;No giant prompt with 40 edge cases.&lt;/p&gt;

&lt;p&gt;The skill gives the agent a small operating procedure with a clear stop condition.&lt;/p&gt;

&lt;p&gt;That is much easier to trust.&lt;/p&gt;




&lt;h2&gt;
  
  
  What changed
&lt;/h2&gt;

&lt;p&gt;Before the skill:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Generate video.
Try upload.
Watch it fail.
Search old commands.
Re-encode.
Try again.
Hope the preview appears.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After the skill:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Generate video.
Run one command.
Check output.
Upload.
Verify preview.
Publish.
Verify final post.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The workflow is not glamorous.&lt;/p&gt;

&lt;p&gt;It is better than glamorous: it is boring.&lt;/p&gt;

&lt;p&gt;And boring is what I want from production media prep.&lt;/p&gt;




&lt;h2&gt;
  
  
  The bigger lesson
&lt;/h2&gt;

&lt;p&gt;This is why I keep coming back to Terminal Skills.&lt;/p&gt;

&lt;p&gt;A useful AI workflow is usually not one huge autonomous agent.&lt;/p&gt;

&lt;p&gt;It is a set of small, documented, reusable capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;prepare a video for upload&lt;/li&gt;
&lt;li&gt;inspect a repo&lt;/li&gt;
&lt;li&gt;generate thumbnails&lt;/li&gt;
&lt;li&gt;validate a draft&lt;/li&gt;
&lt;li&gt;resize images&lt;/li&gt;
&lt;li&gt;check links&lt;/li&gt;
&lt;li&gt;publish only after approval&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each skill removes one fragile piece of manual memory.&lt;/p&gt;

&lt;p&gt;Each skill gives the agent a narrower job.&lt;/p&gt;

&lt;p&gt;Each skill creates a cleaner definition of done.&lt;/p&gt;

&lt;p&gt;That is the part I think a lot of AI tooling conversations miss.&lt;/p&gt;

&lt;p&gt;The future is not just "agents can use tools."&lt;/p&gt;

&lt;p&gt;The useful version is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agents can use well-defined skills with clear boundaries.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is how the work becomes repeatable.&lt;/p&gt;

&lt;p&gt;And for AI video uploads, repeatable beats clever every time.&lt;/p&gt;




&lt;p&gt;If you build with AI agents, what is the workflow you keep fixing manually?&lt;/p&gt;

&lt;p&gt;That is probably your next Terminal Skill.&lt;/p&gt;

&lt;p&gt;Disclosure: I used AI assistance to draft and edit this article, then reviewed the workflow, commands, and claims before publishing.&lt;/p&gt;

</description>
      <category>ffmpeg</category>
      <category>ai</category>
      <category>cli</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Approval Gates for AI Agents: Draft Approval Is Not Publish Approval</title>
      <dc:creator>Alex Shev</dc:creator>
      <pubDate>Wed, 27 May 2026 16:52:45 +0000</pubDate>
      <link>https://dev.to/alexshev/approval-gates-for-ai-agents-draft-approval-is-not-publish-approval-2ap5</link>
      <guid>https://dev.to/alexshev/approval-gates-for-ai-agents-draft-approval-is-not-publish-approval-2ap5</guid>
      <description>&lt;p&gt;One of the easiest ways to make an AI agent dangerous is to give it a vague approval.&lt;/p&gt;

&lt;p&gt;Not because the agent is malicious.&lt;/p&gt;

&lt;p&gt;Because humans use words like "ok", "approved", and "ship it" casually.&lt;/p&gt;

&lt;p&gt;In a normal conversation, that is fine. In an automated workflow, it can become a bug.&lt;/p&gt;

&lt;p&gt;If an agent is drafting an article, writing a tweet, preparing a pull request, generating social posts, or touching an external platform, the question is not just:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Did the human approve this?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The better question is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What exactly did the human approve?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That distinction matters more than most agent tooling discussions admit.&lt;/p&gt;




&lt;h2&gt;
  
  
  The small approval bug that becomes a big workflow problem
&lt;/h2&gt;

&lt;p&gt;Imagine this simple flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;An agent prepares 10 social posts.&lt;/li&gt;
&lt;li&gt;The human says "looks good".&lt;/li&gt;
&lt;li&gt;The agent publishes all 10 immediately.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Maybe that was correct.&lt;/p&gt;

&lt;p&gt;Maybe it was not.&lt;/p&gt;

&lt;p&gt;The human might have meant:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The copy looks good.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent interpreted it as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Publish everything now.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is not a model intelligence problem. It is a workflow design problem.&lt;/p&gt;

&lt;p&gt;When an action leaves the local workspace, ambiguity gets expensive.&lt;/p&gt;

&lt;p&gt;Publishing, emailing, commenting, deploying, charging a card, posting to social media, and modifying production systems should not depend on a loose interpretation of "ok."&lt;/p&gt;

&lt;p&gt;They need explicit gates.&lt;/p&gt;




&lt;h2&gt;
  
  
  The approval types I separate now
&lt;/h2&gt;

&lt;p&gt;For agent workflows, I like separating approval into at least four different meanings.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Approval to draft
&lt;/h3&gt;

&lt;p&gt;This means:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Yes, prepare the thing.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent can research, outline, write, generate assets, create local files, and prepare a proposal.&lt;/p&gt;

&lt;p&gt;But it cannot publish.&lt;/p&gt;

&lt;p&gt;This is the safest default for content work.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Prepare a DEV.to draft about approval gates.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That should create a local markdown draft or an unpublished draft, depending on the workflow.&lt;/p&gt;

&lt;p&gt;It should not post the article publicly.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Approval of the draft
&lt;/h3&gt;

&lt;p&gt;This means:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The content direction is acceptable.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The human may be approving the argument, the structure, the tone, or the asset selection.&lt;/p&gt;

&lt;p&gt;But that still does not automatically mean:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Publish it right now.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is where many agent systems get sloppy.&lt;/p&gt;

&lt;p&gt;Draft approval is not publish approval.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Approval to publish
&lt;/h3&gt;

&lt;p&gt;This needs to be explicit.&lt;/p&gt;

&lt;p&gt;The agent should know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what platform&lt;/li&gt;
&lt;li&gt;what asset or draft&lt;/li&gt;
&lt;li&gt;whether to publish now or schedule&lt;/li&gt;
&lt;li&gt;whether comments/replies/source attribution are included&lt;/li&gt;
&lt;li&gt;whether the approval applies to one post or a batch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Publish this DEV.to article now.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Post only the first X drafts, with the source as the first reply.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is much safer than letting the agent infer a public action from a vague "ok."&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Approval for automation reminders
&lt;/h3&gt;

&lt;p&gt;This one is subtle.&lt;/p&gt;

&lt;p&gt;A reminder or cron job should often prepare work, not perform external actions.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Every morning, find 3 candidate topics and ask me which one to use.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is different from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Every morning, publish a post.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first one keeps the human in the loop.&lt;/p&gt;

&lt;p&gt;The second one creates a recurring external action, which is much riskier.&lt;/p&gt;

&lt;p&gt;Most teams should start with reminder-based automation before action-based automation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this matters for CLI and agent workflows
&lt;/h2&gt;

&lt;p&gt;CLI workflows make this even more important because agents can act fast.&lt;/p&gt;

&lt;p&gt;A coding agent can edit files, run scripts, create branches, call APIs, deploy apps, write comments, and open browser sessions.&lt;/p&gt;

&lt;p&gt;That speed is useful only if the boundaries are clear.&lt;/p&gt;

&lt;p&gt;The workflow should define what the agent may do locally without asking and what requires a human gate.&lt;/p&gt;

&lt;p&gt;For example, I am comfortable letting an agent do this freely:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;inspect a repo&lt;/li&gt;
&lt;li&gt;write a local draft&lt;/li&gt;
&lt;li&gt;run tests&lt;/li&gt;
&lt;li&gt;generate local assets&lt;/li&gt;
&lt;li&gt;prepare a post&lt;/li&gt;
&lt;li&gt;create a report&lt;/li&gt;
&lt;li&gt;summarize findings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I want a stronger gate before this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;publish to DEV.to&lt;/li&gt;
&lt;li&gt;post on X&lt;/li&gt;
&lt;li&gt;send email&lt;/li&gt;
&lt;li&gt;comment on Reddit&lt;/li&gt;
&lt;li&gt;deploy to production&lt;/li&gt;
&lt;li&gt;spend money&lt;/li&gt;
&lt;li&gt;modify customer data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The difference is not whether the agent is capable.&lt;/p&gt;

&lt;p&gt;The difference is whether the action is reversible, private, and low-risk.&lt;/p&gt;

&lt;p&gt;Local work is cheap to revise.&lt;/p&gt;

&lt;p&gt;External work creates a public or operational footprint.&lt;/p&gt;




&lt;h2&gt;
  
  
  A simple pattern: declare the gate in the task
&lt;/h2&gt;

&lt;p&gt;One practical fix is to write the gate directly into the task.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Write an article about approval gates.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Prepare a local draft only. Do not publish. Return the file path and wait for explicit publish approval.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Make comments for Reddit.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Prepare comment drafts only. Do not post. Recommend the safest first set and wait for approval.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Deploy this.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create a preview deployment first. Do not promote to production until I explicitly approve production.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This sounds boring, but boring is good here.&lt;/p&gt;

&lt;p&gt;Good agent workflows are often just normal operational discipline written down clearly enough that the agent cannot guess wrong.&lt;/p&gt;

&lt;p&gt;If the workflow supports metadata, make the gate machine-readable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;gate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;draft_only&lt;/span&gt;
&lt;span class="na"&gt;external_actions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="na"&gt;next_approval_required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;publish_to_devto&lt;/span&gt;
&lt;span class="na"&gt;scope&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;single_article&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That tiny block is not bureaucracy. It gives the agent a state it can report, verify, and refuse to exceed.&lt;/p&gt;




&lt;h2&gt;
  
  
  The agent should report its current gate
&lt;/h2&gt;

&lt;p&gt;The agent should also say what state the work is in.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Status: local draft only.
No external publication happened.
Next gate: human approval to publish.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Status: posted.
Verified final URL.
No additional replies published.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes the workflow auditable.&lt;/p&gt;

&lt;p&gt;It also prevents the human from having to infer what happened.&lt;/p&gt;

&lt;p&gt;When agents are doing real work, "done" is not enough.&lt;/p&gt;

&lt;p&gt;The agent should report:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what changed&lt;/li&gt;
&lt;li&gt;where the artifact is&lt;/li&gt;
&lt;li&gt;what was verified&lt;/li&gt;
&lt;li&gt;what did not happen&lt;/li&gt;
&lt;li&gt;what approval is needed next&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last part is important.&lt;/p&gt;

&lt;p&gt;Good agents should not only complete tasks. They should make the boundary of the next task clear.&lt;/p&gt;




&lt;h2&gt;
  
  
  Batch work needs an even stronger gate
&lt;/h2&gt;

&lt;p&gt;Batch publishing is where approval ambiguity gets especially risky.&lt;/p&gt;

&lt;p&gt;If an agent prepares 25 comments, does approval mean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;publish all 25 now?&lt;/li&gt;
&lt;li&gt;publish the safest 5?&lt;/li&gt;
&lt;li&gt;publish one per day?&lt;/li&gt;
&lt;li&gt;publish only after checking each target again?&lt;/li&gt;
&lt;li&gt;publish drafts after human edits?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are very different actions.&lt;/p&gt;

&lt;p&gt;For batch workflows, I like adding two fields:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Approval scope:
Cadence decision:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Approval scope: first 5 comments only
Cadence decision: publish today, one by one, stop on warning
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Approval scope: all 10 posts approved as drafts
Cadence decision: schedule one per day at 10 AM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That tiny bit of structure prevents a lot of mistakes.&lt;/p&gt;

&lt;p&gt;It also gives the agent a concrete stop condition.&lt;/p&gt;




&lt;h2&gt;
  
  
  This belongs inside skills
&lt;/h2&gt;

&lt;p&gt;This is one reason I care about reusable agent skills.&lt;/p&gt;

&lt;p&gt;A skill should not only say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Here is how to perform the task.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It should also say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Here is what requires approval.
Here is what can be done locally.
Here is how to verify the result.
Here is when to stop.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the difference between a tool and a workflow.&lt;/p&gt;

&lt;p&gt;A tool gives the agent power.&lt;/p&gt;

&lt;p&gt;A skill gives the agent operating rules.&lt;/p&gt;

&lt;p&gt;It can encode approval gates as reusable policy, not just task steps.&lt;/p&gt;

&lt;p&gt;For example, a publishing skill should define:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;draft-only mode&lt;/li&gt;
&lt;li&gt;review mode&lt;/li&gt;
&lt;li&gt;publish mode&lt;/li&gt;
&lt;li&gt;source/comment behavior&lt;/li&gt;
&lt;li&gt;verification steps&lt;/li&gt;
&lt;li&gt;rollback or correction process&lt;/li&gt;
&lt;li&gt;rate-limit and spam-warning stop conditions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without that, the agent has to infer the process from the conversation.&lt;/p&gt;

&lt;p&gt;That is exactly where mistakes happen.&lt;/p&gt;




&lt;h2&gt;
  
  
  The rule I use
&lt;/h2&gt;

&lt;p&gt;My current rule is simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If the action is external, public, paid, destructive, or hard to undo, the approval must name the action.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;"Looks good" is enough for a draft.&lt;/p&gt;

&lt;p&gt;It is not enough for publication.&lt;/p&gt;

&lt;p&gt;"Ok" is enough to continue local work.&lt;/p&gt;

&lt;p&gt;It is not enough to spend money, post publicly, email someone, or modify production.&lt;/p&gt;

&lt;p&gt;For those actions, the approval should be explicit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Publish this now.
Send this email.
Deploy to production.
Post these 5 comments.
Charge this card.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal is not to slow the agent down.&lt;/p&gt;

&lt;p&gt;The goal is to make speed safe.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;The fix is not complicated: write the gates down.&lt;/p&gt;

&lt;p&gt;Make the agent report which gate it is at.&lt;/p&gt;

&lt;p&gt;And never let draft approval silently become publish approval.&lt;/p&gt;




&lt;p&gt;I am collecting and building practical examples of this kind of agent workflow discipline at &lt;a href="https://terminalskills.io/" rel="noopener noreferrer"&gt;Terminal Skills&lt;/a&gt;: reusable skills that teach agents not only which tools to use, but how to work safely and repeatably.&lt;/p&gt;

&lt;p&gt;Disclosure: I used AI assistance while drafting this article, then reviewed and edited it manually.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>ai</category>
      <category>automation</category>
      <category>devtools</category>
    </item>
    <item>
      <title>MCP Gave AI Agents Tools. A2A Gives Them Coworkers.</title>
      <dc:creator>Alex Shev</dc:creator>
      <pubDate>Mon, 25 May 2026 15:30:15 +0000</pubDate>
      <link>https://dev.to/alexshev/mcp-gave-ai-agents-tools-a2a-gives-them-coworkers-dp0</link>
      <guid>https://dev.to/alexshev/mcp-gave-ai-agents-tools-a2a-gives-them-coworkers-dp0</guid>
      <description>&lt;p&gt;Most AI agent conversations eventually run into the same question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What happens when one agent is not enough?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A single agent can write code, search docs, run tests, call APIs, summarize files, and generate reports.&lt;/p&gt;

&lt;p&gt;That already feels useful.&lt;/p&gt;

&lt;p&gt;But real work rarely fits into one neat box.&lt;/p&gt;

&lt;p&gt;A software project might need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one agent to research requirements&lt;/li&gt;
&lt;li&gt;one agent to write code&lt;/li&gt;
&lt;li&gt;one agent to generate tests&lt;/li&gt;
&lt;li&gt;one agent to review the result&lt;/li&gt;
&lt;li&gt;one agent to deploy or monitor the system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A customer support workflow might need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a billing agent&lt;/li&gt;
&lt;li&gt;a technical support agent&lt;/li&gt;
&lt;li&gt;a sales agent&lt;/li&gt;
&lt;li&gt;a human handoff agent&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A content workflow might need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a research agent&lt;/li&gt;
&lt;li&gt;a writing agent&lt;/li&gt;
&lt;li&gt;an SEO agent&lt;/li&gt;
&lt;li&gt;an editor&lt;/li&gt;
&lt;li&gt;a publishing assistant&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At that point, the interesting problem is no longer just:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can an agent use a tool?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It becomes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can agents work with each other?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is where the &lt;strong&gt;A2A protocol&lt;/strong&gt; becomes interesting.&lt;/p&gt;

&lt;p&gt;And that is why the &lt;code&gt;a2a-protocol&lt;/code&gt; skill on Terminal Skills is worth looking at.&lt;/p&gt;




&lt;h2&gt;
  
  
  MCP vs A2A in one sentence
&lt;/h2&gt;

&lt;p&gt;MCP gave agents tools.&lt;/p&gt;

&lt;p&gt;A2A gives agents coworkers.&lt;/p&gt;

&lt;p&gt;That is the simplest way I think about it.&lt;/p&gt;

&lt;p&gt;MCP, or Model Context Protocol, is mostly about connecting an agent to tools, APIs, files, databases, search systems, and external data sources.&lt;/p&gt;

&lt;p&gt;A2A, or Agent2Agent, is about connecting one agent to another agent.&lt;/p&gt;

&lt;p&gt;The difference matters.&lt;/p&gt;

&lt;p&gt;If an agent needs to query a database, call a calendar API, or inspect a repo, MCP is a good fit.&lt;/p&gt;

&lt;p&gt;If an agent needs to delegate work to another autonomous agent with its own capabilities, state, task lifecycle, and output format, A2A is the better mental model.&lt;/p&gt;

&lt;p&gt;A tool usually does one specific thing.&lt;/p&gt;

&lt;p&gt;An agent can own a whole domain of work.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why agents need a collaboration layer
&lt;/h2&gt;

&lt;p&gt;Right now, many agent workflows are still stitched together with prompts.&lt;/p&gt;

&lt;p&gt;Something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;First research the topic.
Then write a draft.
Then review it.
Then create a final version.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That can work for small tasks.&lt;/p&gt;

&lt;p&gt;But it gets messy as soon as the workflow becomes more serious.&lt;/p&gt;

&lt;p&gt;What happens when research takes five minutes?&lt;br&gt;
What happens when the writing agent needs structured data, not a paragraph?&lt;br&gt;
What happens when the reviewer rejects the output?&lt;br&gt;
What happens when the task needs human input?&lt;br&gt;
What happens when the work should continue asynchronously?&lt;/p&gt;

&lt;p&gt;At that point, a prompt chain is not enough.&lt;/p&gt;

&lt;p&gt;You need something closer to a protocol.&lt;/p&gt;

&lt;p&gt;The A2A model introduces concepts like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an &lt;strong&gt;Agent Card&lt;/strong&gt; for discovery&lt;/li&gt;
&lt;li&gt;declared skills and capabilities&lt;/li&gt;
&lt;li&gt;task lifecycle states&lt;/li&gt;
&lt;li&gt;messages between agents&lt;/li&gt;
&lt;li&gt;artifacts as outputs&lt;/li&gt;
&lt;li&gt;streaming updates&lt;/li&gt;
&lt;li&gt;push notifications&lt;/li&gt;
&lt;li&gt;cancellation&lt;/li&gt;
&lt;li&gt;structured data exchange&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That sounds boring in the best possible way.&lt;/p&gt;

&lt;p&gt;Boring protocols are what turn demos into infrastructure.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Agent Card is the underrated part
&lt;/h2&gt;

&lt;p&gt;One of the most useful ideas in A2A is the &lt;strong&gt;Agent Card&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;An Agent Card is basically a description of what an agent is, where it lives, and what it can do.&lt;/p&gt;

&lt;p&gt;It describes identity, capabilities, skills, endpoints, and auth without exposing the agent's internal tools, memory, or private state.&lt;/p&gt;

&lt;p&gt;It can include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the agent name&lt;/li&gt;
&lt;li&gt;description&lt;/li&gt;
&lt;li&gt;endpoint URL&lt;/li&gt;
&lt;li&gt;version&lt;/li&gt;
&lt;li&gt;capabilities&lt;/li&gt;
&lt;li&gt;skills&lt;/li&gt;
&lt;li&gt;input modes&lt;/li&gt;
&lt;li&gt;output modes&lt;/li&gt;
&lt;li&gt;authentication requirements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A standard discovery endpoint like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/.well-known/agent-card.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;may not sound exciting.&lt;/p&gt;

&lt;p&gt;But it solves a real problem.&lt;/p&gt;

&lt;p&gt;If agents are going to collaborate, they need to know who they are talking to.&lt;/p&gt;

&lt;p&gt;A coding agent should be able to discover a code review agent.&lt;br&gt;
A support router should be able to discover a billing agent.&lt;br&gt;
A research agent should be able to discover a writer agent.&lt;/p&gt;

&lt;p&gt;Without a discovery layer, every multi-agent workflow becomes custom glue.&lt;/p&gt;

&lt;p&gt;With one, agents can start to behave more like services.&lt;/p&gt;


&lt;h2&gt;
  
  
  Example: a code pipeline made of agents
&lt;/h2&gt;

&lt;p&gt;Imagine a simple software pipeline.&lt;/p&gt;

&lt;p&gt;You do not want one giant agent doing everything.&lt;/p&gt;

&lt;p&gt;Instead, you split the workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Code writer&lt;/strong&gt; generates the implementation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test writer&lt;/strong&gt; creates tests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code reviewer&lt;/strong&gt; checks both.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orchestrator&lt;/strong&gt; coordinates the flow.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each agent can have a narrow responsibility.&lt;/p&gt;

&lt;p&gt;The code writer does not need to know everything about test strategy.&lt;br&gt;
The test writer does not need to own product requirements.&lt;br&gt;
The reviewer does not need to write the initial implementation.&lt;/p&gt;

&lt;p&gt;This makes the workflow easier to inspect.&lt;/p&gt;

&lt;p&gt;If the tests are weak, improve the test agent.&lt;br&gt;
If the review is shallow, improve the review agent.&lt;br&gt;
If the handoff fails, improve the orchestrator.&lt;/p&gt;

&lt;p&gt;That is much cleaner than debugging one giant prompt with five hidden roles inside it.&lt;/p&gt;


&lt;h2&gt;
  
  
  Example: a customer support router
&lt;/h2&gt;

&lt;p&gt;A2A also makes sense for support.&lt;/p&gt;

&lt;p&gt;A support router agent receives a customer message:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I was charged twice and my account still says inactive.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The router should not try to solve everything itself.&lt;/p&gt;

&lt;p&gt;It can delegate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;billing question -&amp;gt; billing agent&lt;/li&gt;
&lt;li&gt;account activation -&amp;gt; technical agent&lt;/li&gt;
&lt;li&gt;refund eligibility -&amp;gt; policy agent&lt;/li&gt;
&lt;li&gt;unclear or sensitive issue -&amp;gt; human handoff&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The router's job is classification, coordination, and response assembly.&lt;/p&gt;

&lt;p&gt;The specialized agents own their own domains.&lt;/p&gt;

&lt;p&gt;This is how real teams work.&lt;/p&gt;

&lt;p&gt;Not everyone does everything.&lt;/p&gt;

&lt;p&gt;The interesting part is making agents follow that same pattern.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where Terminal Skills fits
&lt;/h2&gt;

&lt;p&gt;This is where Terminal Skills becomes useful.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;a2a-protocol&lt;/code&gt; skill is not just a link to a spec.&lt;/p&gt;

&lt;p&gt;It gives an AI coding agent a practical operating guide for building A2A systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;when to use A2A&lt;/li&gt;
&lt;li&gt;how to define an Agent Card&lt;/li&gt;
&lt;li&gt;how to build a server&lt;/li&gt;
&lt;li&gt;how to build a client&lt;/li&gt;
&lt;li&gt;how to handle task states&lt;/li&gt;
&lt;li&gt;when to use streaming&lt;/li&gt;
&lt;li&gt;how to orchestrate multiple agents&lt;/li&gt;
&lt;li&gt;how A2A differs from MCP&lt;/li&gt;
&lt;li&gt;what implementation guidelines to follow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That matters because agents often fail not from lack of intelligence, but from lack of workflow structure.&lt;/p&gt;

&lt;p&gt;A model may understand A2A in general.&lt;/p&gt;

&lt;p&gt;But a skill gives it a repeatable path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terminal-skills &lt;span class="nb"&gt;install &lt;/span&gt;a2a-protocol
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After that, the agent has a focused reference for the task instead of relying on vague memory or generic web knowledge.&lt;/p&gt;

&lt;p&gt;This is the bigger idea behind Terminal Skills:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Agents do not just need more context. They need reusable operational instructions.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  A2A is not a replacement for MCP
&lt;/h2&gt;

&lt;p&gt;It is tempting to turn every new protocol into a winner-takes-all comparison.&lt;/p&gt;

&lt;p&gt;I do not think that is the right framing here.&lt;/p&gt;

&lt;p&gt;A2A and MCP solve different problems.&lt;/p&gt;

&lt;p&gt;A practical way to separate them:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Need&lt;/th&gt;
&lt;th&gt;Better fit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Call a tool or API&lt;/td&gt;
&lt;td&gt;MCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Read from a data source&lt;/td&gt;
&lt;td&gt;MCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Give an agent access to external systems&lt;/td&gt;
&lt;td&gt;MCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delegate a task to another agent&lt;/td&gt;
&lt;td&gt;A2A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Discover agent capabilities&lt;/td&gt;
&lt;td&gt;A2A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coordinate long-running agent work&lt;/td&gt;
&lt;td&gt;A2A&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;MCP is agent-to-tool.&lt;/p&gt;

&lt;p&gt;A2A is agent-to-agent.&lt;/p&gt;

&lt;p&gt;In real systems, you probably want both.&lt;/p&gt;

&lt;p&gt;An agent might use MCP internally to access tools, while exposing an A2A interface so other agents can delegate work to it.&lt;/p&gt;

&lt;p&gt;That combination is where things get interesting.&lt;/p&gt;




&lt;h2&gt;
  
  
  What makes this useful for developers
&lt;/h2&gt;

&lt;p&gt;For developers, the value is not the protocol acronym.&lt;/p&gt;

&lt;p&gt;The value is fewer fragile workflows.&lt;/p&gt;

&lt;p&gt;Instead of hardcoding every handoff, you can start thinking in terms of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;discoverable agents&lt;/li&gt;
&lt;li&gt;declared capabilities&lt;/li&gt;
&lt;li&gt;explicit task states&lt;/li&gt;
&lt;li&gt;structured messages&lt;/li&gt;
&lt;li&gt;cancellable work&lt;/li&gt;
&lt;li&gt;streaming progress&lt;/li&gt;
&lt;li&gt;artifacts as outputs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is closer to software engineering than prompt engineering.&lt;/p&gt;

&lt;p&gt;And honestly, that is the point.&lt;/p&gt;

&lt;p&gt;The next generation of agent systems will not be built from one giant prompt.&lt;/p&gt;

&lt;p&gt;They will look more like networks of specialized workers with clear contracts between them.&lt;/p&gt;

&lt;p&gt;Some of those workers will call tools.&lt;/p&gt;

&lt;p&gt;Some will call other agents.&lt;/p&gt;

&lt;p&gt;The quality of the system will depend less on one model being magical and more on whether the handoffs are well designed.&lt;/p&gt;




&lt;h2&gt;
  
  
  The small shift that matters
&lt;/h2&gt;

&lt;p&gt;The first wave of AI agents was about giving models tools.&lt;/p&gt;

&lt;p&gt;That was a huge step.&lt;/p&gt;

&lt;p&gt;But tools are not the whole story.&lt;/p&gt;

&lt;p&gt;If agents are going to handle real work, they need coordination.&lt;br&gt;
They need delegation.&lt;br&gt;
They need discovery.&lt;br&gt;
They need contracts.&lt;br&gt;
They need ways to say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I can do this task.
Here is how to call me.
Here is what I return.
Here is how I report progress.
Here is how I fail.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is why A2A is worth watching.&lt;/p&gt;

&lt;p&gt;Not because every project needs a multi-agent architecture today.&lt;/p&gt;

&lt;p&gt;Most do not.&lt;/p&gt;

&lt;p&gt;But because the direction is clear:&lt;/p&gt;

&lt;p&gt;Agents are moving from isolated assistants to interoperable workers.&lt;/p&gt;

&lt;p&gt;MCP gave agents tools.&lt;/p&gt;

&lt;p&gt;A2A gives them coworkers.&lt;/p&gt;

&lt;p&gt;And skills like &lt;code&gt;a2a-protocol&lt;/code&gt; help agents learn how to build that future without starting from a blank prompt.&lt;/p&gt;




&lt;p&gt;If you want to try it, the skill is here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://terminalskills.io/skills/a2a-protocol" rel="noopener noreferrer"&gt;https://terminalskills.io/skills/a2a-protocol&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terminal-skills &lt;span class="nb"&gt;install &lt;/span&gt;a2a-protocol
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then ask your coding agent to build one tiny A2A loop: Agent Card -&amp;gt; server -&amp;gt; client -&amp;gt; delegated task.&lt;/p&gt;

&lt;p&gt;Start small.&lt;/p&gt;

&lt;p&gt;One focused agent.&lt;br&gt;
One clear capability.&lt;br&gt;
One verifiable handoff.&lt;/p&gt;

&lt;p&gt;That is usually where the real workflow begins.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>aiagents</category>
      <category>mcp</category>
      <category>devtools</category>
    </item>
  </channel>
</rss>
