<?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: Yassine</title>
    <description>The latest articles on DEV Community by Yassine (@ybouane).</description>
    <link>https://dev.to/ybouane</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%2F2984415%2F94f9f3d2-dfd6-4d55-a1b2-899c3346e087.jpeg</url>
      <title>DEV Community: Yassine</title>
      <link>https://dev.to/ybouane</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ybouane"/>
    <language>en</language>
    <item>
      <title>I Tested Shopify 3D Product Media Before Touching My Theme</title>
      <dc:creator>Yassine</dc:creator>
      <pubDate>Fri, 07 Aug 2026 17:32:46 +0000</pubDate>
      <link>https://dev.to/ybouane/i-tested-shopify-3d-product-media-before-touching-my-theme-3jce</link>
      <guid>https://dev.to/ybouane/i-tested-shopify-3d-product-media-before-touching-my-theme-3jce</guid>
      <description>&lt;p&gt;I was about to add a new product-media block to a Shopify theme when I stopped myself. The thing I actually needed to prove first was much smaller: could a shopper rotate the product, understand its shape, and get a useful result on a real product page?\n\nThat distinction saved me from turning a 3D experiment into a theme project. I used &lt;a href="https://supra-3d-capture.sktch.io/" rel="noopener noreferrer"&gt;Supra 3D Capture&lt;/a&gt; to turn a guided set of phone photos into a web-ready GLB, then treated Shopify-native publishing as the last step—not the first. Here is the workflow I now use before I touch Liquid, a theme setting, or an app block.\n\n&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%2F4ciyyq6vs9om0jw4j7zw.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%2F4ciyyq6vs9om0jw4j7zw.png" alt="Supra 3D Capture model validation banner" width="800" height="533"&gt;&lt;/a&gt;\n\n## The test I wanted to pass\n\nI was not looking for a cinematic asset. I wanted a model that made an ordinary product page easier to inspect. For the first test, I choose a compact SKU with clear edges and visible depth: the kind of product where front-and-back photos still leave questions about thickness, curves, or proportions.\n\nThat filter matters. If you are deciding where to start, the product-selection ideas in &lt;a href="https://the-lean-ecommerce.gitlab.io/2026/07/25/which-shopify-products-should-you-turn-into-3d-models-first/" rel="noopener noreferrer"&gt;Which Shopify Products Should You Turn Into 3D Models First?&lt;/a&gt; are a useful sanity check. I avoid reflective, translucent, or fuzzy items for a first capture because they introduce scanning variables before I have learned the publishing path.\n\nMy definition of done was deliberately plain:\n\n- The model rotates smoothly on a phone and desktop.\n- Its silhouette still makes sense at a small size.\n- The texture does not hide important product details.\n- I can attach it to Shopify product media without building a custom viewer.\n\nIf it fails one of those, I go back to capture. I do not try to code around a weak asset.\n\n## Step 1: Make the photo orbit boring\n\nThe capture part is the least glamorous piece, and it has the biggest downstream effect. I put the product in even light, keep the background simple, and slowly move around it while keeping roughly the same distance. Supra 3D Capture guides the session as I collect 10 or more phone photos, then sends the set through its photogrammetry pipeline.\n\nThe useful mental model is not ‘take pretty product photos.’ It is ‘give reconstruction enough overlapping views to understand every surface.’ If a side is underexposed or never appears in the orbit, the model cannot invent the missing geometry reliably.\n\n&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%2Fmhpbqwqg60kpp9ax562j.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%2Fmhpbqwqg60kpp9ax562j.png" alt="Guided smartphone photo orbit for a Shopify product" width="800" height="1200"&gt;&lt;/a&gt;\n\nI now make a quick capture checklist before uploading:\n\n1. Clean the product and remove loose packaging that can shift between frames.\n2. Use diffuse light, so shadows do not masquerade as edges.\n3. Include the top, sides, and the details a customer would inspect before buying.\n4. Keep the product still; move the phone, not the SKU.\n\nThat is enough process for a first run. Specialist gear and 3D software are not the constraint here; repeatable photos are.\n\n## Step 2: Inspect the GLB like an integration artifact\n\nWhen the model comes back, I do not jump straight to the storefront. I rotate it and look for failure modes a normal gallery can hide: melted-looking seams, a missing underside, noisy texture, or a model that is technically complete but visually ambiguous.\n\nThis is where I treat the GLB like any other generated build artifact. A successful output is not automatically ready to ship. I check the angles that matter to a buyer, whether the scale feels plausible, and whether the model remains clear against the product page background. If the model is weak, recapturing is cheaper than debugging shopper confusion later.\n\n&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%2Fduxr9ty1on3arf9wpdg0.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%2Fduxr9ty1on3arf9wpdg0.png" alt="GLB model inspection before Shopify publishing" width="800" height="1200"&gt;&lt;/a&gt;\n\nFor larger catalogs, I would make that review explicit. A simple scorecard—product shape, surface difficulty, margin, return risk, and image coverage—keeps the team from spending time on impressive but low-impact scans. The companion guide on &lt;a href="https://how-to-blog.gitlab.io/2026/07/30/how-to-build-a-shopify-3d-capture-priority-scorecard/" rel="noopener noreferrer"&gt;building a Shopify 3D capture priority scorecard&lt;/a&gt; is a good framework for that decision.\n\n## Step 3: Publish natively before customizing\n\nOnce the GLB passes inspection, I attach it to the Shopify product as media. That is the first implementation path I test because Shopify’s native 3D viewer already gives shoppers the direct manipulation behavior I care about: drag, rotate, inspect. Supra 3D Capture also supports a dedicated Online Store 2.0 theme app block when I need placement beyond the default gallery.\n\nThere is a small but important trade-off here. Native product media is the lowest-friction validation route; a theme app block gives more layout control. I start native because it answers the product question first. Only after I see that the model helps explain the item do I spend time deciding where it belongs in the page hierarchy.\n\n&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%2Fhp0akwkon8eorx20nxpd.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%2Fhp0akwkon8eorx20nxpd.png" alt="Interactive 3D product inspection on a Shopify page" width="800" height="1200"&gt;&lt;/a&gt;\n\nI test three things on the storefront:\n\n- Does the model load and rotate where the customer expects it?\n- Does it complement the existing photos instead of replacing useful detail shots?\n- Does the mobile experience make the object easier to understand, not just more novel?\n\nThat last one keeps me honest. A 3D model should close an expectation gap—shape, scale, texture, or construction—not become decoration that competes with the buy button.\n\n## What I would do next\n\nMy next move would be to repeat this on three high-question SKUs, then compare support questions, return reasons, and how often shoppers engage with the media. I would not promise a conversion lift from one test, but I would look for evidence that customers can make a more confident choice.\n\n*&lt;em&gt;TL;DR:&lt;/em&gt;* I learned to validate the capture and the native Shopify experience before I customize a theme. Start with an easy-to-scan product, make a complete phone-photo orbit, inspect the GLB as a real release artifact, then publish with Shopify-native media or an app block. You can start the same small experiment from the &lt;a href="https://apps.shopify.com/supra-3d-capture" rel="noopener noreferrer"&gt;Supra 3D Capture Shopify App Store listing&lt;/a&gt;.\n\nHave you found a product category where interactive 3D explains something photos consistently miss?&lt;/p&gt;

</description>
      <category>shopify</category>
      <category>webdev</category>
      <category>ecommerce</category>
      <category>3d</category>
    </item>
    <item>
      <title>How I Export Webflow Sites to Static HTML Without Losing CMS Content</title>
      <dc:creator>Yassine</dc:creator>
      <pubDate>Fri, 31 Jul 2026 19:34:07 +0000</pubDate>
      <link>https://dev.to/ybouane/how-i-export-webflow-sites-to-static-html-without-losing-cms-content-1pp7</link>
      <guid>https://dev.to/ybouane/how-i-export-webflow-sites-to-static-html-without-losing-cms-content-1pp7</guid>
      <description>&lt;p&gt;I kept running into the same problem: a Webflow build would look finished in the designer, then turn into a project with awkward handoff rules the moment I needed to host it somewhere else.&lt;/p&gt;

&lt;p&gt;That is why I started paying attention to &lt;a href="https://exflow.site" rel="noopener noreferrer"&gt;ExFlow.site&lt;/a&gt;. It is a Webflow exporter that lets me download a site by URL, pull down pages, CSS, JS, images, media, and CMS content, and then decide whether I want to host it myself or sync it to Git, S3, or FTP.&lt;/p&gt;

&lt;p&gt;Webflow itself is still good at what it does. Its &lt;a href="https://webflow.com/updates/export-clean-html5-and-css3" rel="noopener noreferrer"&gt;Export clean HTML5 and CSS3&lt;/a&gt; describes a clean HTML/CSS/JS export, and its &lt;a href="https://webflow.com/pricing" rel="noopener noreferrer"&gt;pricing page&lt;/a&gt; makes the limitation plain: exported code cannot be reimported. That matters if you are trying to treat Webflow like a portable source of truth instead of a one-way publishing layer.&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2Fikf7gysysivaxx28kxnm.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.amazonaws.com%2Fuploads%2Farticles%2Fikf7gysysivaxx28kxnm.png" alt="ExFlow export configuration screenshot" width="800" height="1224"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first thing I wanted was not a fancy new design tool. I wanted a predictable export path. In practice, that means knowing whether the site is mostly static pages, whether the asset library is tidy, and whether the content model can survive outside Webflow.&lt;/p&gt;

&lt;p&gt;ExFlow is useful because it stays focused on the part Webflow users actually need when the site has to leave the platform. I can export the URL, choose whether CSS, JS, images, and all pages come along, remove the "Made with Webflow" badge when needed, add custom script.js and style.css files, and push the result to Git, S3, FTP, or ExFlow hosting.&lt;/p&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%2F9sk3pb8rtuwnzr2bf5jf.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%2F9sk3pb8rtuwnzr2bf5jf.png" alt="Neon illustration of a Webflow export pipeline" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That is the point where the workflow stops being theoretical. I am no longer debating whether a site is “exportable” in some abstract sense. I am checking whether I can ship the files, keep the layout intact, and hand the result to whichever deployment target makes sense for the project.&lt;/p&gt;

&lt;p&gt;Here is the checklist I use before I export a real site:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I separate pages that are purely static from pages that depend on changing content.&lt;/li&gt;
&lt;li&gt;I confirm which CMS content needs a separate handoff plan.&lt;/li&gt;
&lt;li&gt;I export with the asset types I actually need instead of assuming every file belongs in the bundle.&lt;/li&gt;
&lt;li&gt;I open the result locally and check that the page structure, media, and links still make sense.&lt;/li&gt;
&lt;li&gt;I decide where the site should live: Git, S3, FTP, or ExFlow hosting.&lt;/li&gt;
&lt;/ol&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%2Fpc44as1wntw2kt9pyke7.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%2Fpc44as1wntw2kt9pyke7.png" alt="ExFlow exported files list screenshot" width="800" height="473"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That exported-files view is the real sanity check for me. If the file tree looks clean, I know I am closer to a portable site. If it looks messy, I usually stop and fix the source structure before I export again.&lt;/p&gt;

&lt;p&gt;A lot of the value here is not just “download the site.” It is the ability to think in terms of deployment targets. A Git sync makes sense when I want reviewable changes. S3 makes sense when I want cheap static hosting. FTP still matters for some client servers. ExFlow hosting is there when I want the simplest path from export to public site.&lt;/p&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%2Fgya0yavcbaenaxauj4mn.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%2Fgya0yavcbaenaxauj4mn.png" alt="Neon illustration of Webflow export destinations" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My rule of thumb is pretty simple. If the project is mostly marketing pages, a landing experience, or a content site that can be flattened without losing its job, exporting Webflow is often the cleaner move. If the project depends on live CMS workflows, ecommerce behavior, or other dynamic platform features, I treat export as one piece of the puzzle instead of the whole answer.&lt;/p&gt;

&lt;p&gt;That is also why I have started thinking of Webflow less like a permanent hosting destination and more like a design system with an exit ramp. Once you think that way, the trade-off becomes clearer: keep the parts that need to stay in Webflow, and export the parts that should be portable.&lt;/p&gt;

&lt;p&gt;If you want the deployment side of this workflow, I wrote a separate walkthrough on &lt;a href="https://the-lean-ecommerce.gitlab.io/2026/07/29/how-to-export-a-webflow-site-to-git-s3-or-ftp-without-rebuilding-it/" rel="noopener noreferrer"&gt;how I exported a Webflow site to Git, S3, or FTP without rebuilding it&lt;/a&gt;. And if your content structure is still changing, my notes on &lt;a href="https://the-lean-ecommerce.github.io/2026/07/26/how-i-build-a-reviewable-notion-to-webflow-publishing-pipeline/" rel="noopener noreferrer"&gt;how I map Notion fields to Webflow CMS without breaking formatting&lt;/a&gt; are the part I wish I had earlier.&lt;/p&gt;

&lt;p&gt;TL;DR: Webflow is great for building, but export is what makes it portable. ExFlow gives me a practical way to download the site, keep the useful assets, and choose the hosting path that fits the project instead of forcing every build to stay locked in one place.&lt;/p&gt;

&lt;p&gt;If you have ever had a Webflow project get awkward the minute someone asked for self-hosting, what was the part that broke first?&lt;/p&gt;

</description>
      <category>webflow</category>
      <category>cms</category>
      <category>hosting</category>
      <category>static</category>
    </item>
    <item>
      <title>How I Built a Review-First Shopify Blog Automation Pipeline</title>
      <dc:creator>Yassine</dc:creator>
      <pubDate>Sat, 25 Jul 2026 03:34:41 +0000</pubDate>
      <link>https://dev.to/ybouane/how-i-built-a-review-first-shopify-blog-automation-pipeline-47m5</link>
      <guid>https://dev.to/ybouane/how-i-built-a-review-first-shopify-blog-automation-pipeline-47m5</guid>
      <description>&lt;h1&gt;
  
  
  How I Built a Review-First Shopify Blog Automation Pipeline
&lt;/h1&gt;

&lt;p&gt;I was trying to keep a Shopify blog active without turning it into a pile of generic AI posts. I did not want another tool that spit out a draft, published it, and let me discover the problems later. I wanted a workflow that could take real product context, build an SEO-friendly draft, generate matching visuals, and then stop long enough for me to review the result.&lt;/p&gt;

&lt;p&gt;That is the part that Supra Blog Automation actually solves for me. It can generate a single post or a recurring automation, use product context, add internal links, create visuals, and either publish immediately or save the post as a draft. For a Shopify store, that is the difference between "content machine" and "content I can stand behind."&lt;/p&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%2F110b77blsq24az8c774b.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%2F110b77blsq24az8c774b.png" alt="Shopify blog automation workflow" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The workflow I actually want
&lt;/h2&gt;

&lt;p&gt;My default setup is simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start from a product, collection, launch, seasonal theme, or support question.&lt;/li&gt;
&lt;li&gt;Give the post a tone and a goal.&lt;/li&gt;
&lt;li&gt;Let the tool build the structure, internal links, and visuals.&lt;/li&gt;
&lt;li&gt;Review the draft before anything goes live.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last step matters. I am fine with automation doing the boring work. I am not fine with it deciding that a shaky claim or a weak CTA is good enough. The review gate is what keeps the output useful. I talked about that exact approach in &lt;a href="https://the-lean-ecommerce.gitlab.io/2026/07/19/how-to-keep-shopify-blog-drafts-product-aware-and-reviewable/" rel="noopener noreferrer"&gt;How I Keep Shopify Blog Drafts Product-Aware and Reviewable&lt;/a&gt;, and I still think that is the right default for ecommerce content.&lt;/p&gt;

&lt;p&gt;The other thing I like is that the tool does not force a single publishing mode. Sometimes I want an article scheduled because the topic is evergreen. Sometimes I want a draft because the post needs a human check on product details, brand voice, or a promotional claim. That split is important if you do not want automation to become a liability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the SEO layer is not optional
&lt;/h2&gt;

&lt;p&gt;Most generic AI blog tools fail in the same way: they can write paragraphs, but they do not help the post fit the store. For me, the useful part is the structure around the copy.&lt;/p&gt;

&lt;p&gt;I want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A clear topic tied to a real customer problem.&lt;/li&gt;
&lt;li&gt;Product or collection mentions that feel natural.&lt;/li&gt;
&lt;li&gt;Internal links that help shoppers move deeper into the store.&lt;/li&gt;
&lt;li&gt;Headings that make the post easy to scan.&lt;/li&gt;
&lt;li&gt;A draft that can be published now or saved for later.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is also why I keep the review checklist close. In &lt;a href="https://how-to.the-lean-ecommerce.com/2026/07/16/how-to-automate-a-shopify-blog-with-product-review-and-seo-checks/" rel="noopener noreferrer"&gt;How to Automate a Shopify Blog With Product Review and SEO Checks&lt;/a&gt;, I pulled the same idea into a more explicit validation flow: draft first, verify the claims, and only then push it live. I do not need perfection from the generator. I need a predictable way to catch mistakes before customers see them.&lt;/p&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%2Fcyhcg5ss2jq95nd423in.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%2Fcyhcg5ss2jq95nd423in.png" alt="Shopify blog publishing pipeline" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I handle images
&lt;/h2&gt;

&lt;p&gt;I used to treat article images as an afterthought. That usually meant a random stock image, a weak screenshot, or no visual at all. For ecommerce, that is a mistake. The images should support the article the same way the headings do.&lt;/p&gt;

&lt;p&gt;With Supra Blog Automation, I can generate AI visuals that match the post instead of forcing a generic stock look. For this article, I wanted the visuals to feel like a developer workflow with strong contrast, neon accents, and clear process cues. That fits DEV style well, and it fits the subject better than a bland office photo ever would.&lt;/p&gt;

&lt;p&gt;My rule is simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The banner should work as a thumbnail.&lt;/li&gt;
&lt;li&gt;Inline images should explain the workflow.&lt;/li&gt;
&lt;li&gt;The visuals should make the article easier to scan, not harder.&lt;/li&gt;
&lt;/ul&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%2Ftkk4a2v84utq5jywculr.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%2Ftkk4a2v84utq5jywculr.png" alt="Shopify blog AI image generation workflow" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That matters even more when the post is trying to promote a product without sounding pushy. Product-aware blogging works best when the images and the copy point in the same direction: here is the problem, here is the workflow, here is the thing that helps.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I still do manually
&lt;/h2&gt;

&lt;p&gt;Automation is useful only if it leaves room for judgment. I still review:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Product names and feature claims.&lt;/li&gt;
&lt;li&gt;Any pricing or plan reference.&lt;/li&gt;
&lt;li&gt;Links that point to the store or to a supporting article.&lt;/li&gt;
&lt;li&gt;Tone, especially if the post is meant to be informative instead of salesy.&lt;/li&gt;
&lt;li&gt;The final CTA.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also decide when a post should not auto-publish. If the article is tied to a launch, a policy change, or a detail I have not verified yet, I keep it as a draft. That is not a failure of automation. That is the point.&lt;/p&gt;

&lt;p&gt;The upside is that once the system is set up, I can keep the blog active without having to invent a new process each time. The app is good at the repetitive parts: topics, structure, visuals, SEO scaffolding, and publishing control. I am still responsible for judgment, which is exactly how I want it.&lt;/p&gt;

&lt;p&gt;If you want to try the same setup, the &lt;a href="https://supra-blog-automation.sktch.io/" rel="noopener noreferrer"&gt;Supra Blog Automation landing page&lt;/a&gt; has the product overview, and the &lt;a href="https://apps.shopify.com/supra-blog-automation" rel="noopener noreferrer"&gt;Shopify App Store listing&lt;/a&gt; is the fastest way to install it. The free plan is enough to test the workflow with a real draft before you commit to a larger content calendar.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;I wanted Shopify blog automation that made me faster without making me careless. The setup that works for me is: generate a draft from real product context, add SEO and visuals, then review before publishing. That gives me the speed of automation and the safety of a human check.&lt;/p&gt;

&lt;p&gt;If you have built your own content workflow, what part do you still refuse to auto-publish?&lt;/p&gt;

</description>
      <category>shopify</category>
      <category>automation</category>
      <category>seo</category>
      <category>blogging</category>
    </item>
    <item>
      <title>How I Turn a Plain Product Shot Into Shopify Ads and Try-Ons</title>
      <dc:creator>Yassine</dc:creator>
      <pubDate>Mon, 06 Jul 2026 11:37:44 +0000</pubDate>
      <link>https://dev.to/ybouane/how-i-turn-a-plain-product-shot-into-shopify-ads-and-try-ons-4c54</link>
      <guid>https://dev.to/ybouane/how-i-turn-a-plain-product-shot-into-shopify-ads-and-try-ons-4c54</guid>
      <description>&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%2Fq9jzqncvg1hufyvltnhz.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%2Fq9jzqncvg1hufyvltnhz.png" alt="AI visual kit banner with product photo transformations" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I was trying to turn one flat product shot into something I could use three ways: on a Shopify product page, in an ad, and in a lifestyle post. Instead of exporting one file and hoping it looked good everywhere, I wanted a repeatable visual system.&lt;/p&gt;

&lt;p&gt;Supra AI Photo Studio is the app I used for that. It sits inside Shopify and handles the parts I usually lose time to manually: background removal, upscaling, auto enhancement, object placement, model try-ons, and short AI videos. The useful part is not that it makes pretty images. It’s that it gives me a way to keep the same product recognizable while changing the scene around it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I needed from one product photo
&lt;/h2&gt;

&lt;p&gt;I started with one rule: the source photo had to survive being reused. If the original image is soft, awkwardly lit, or cut off, every downstream version inherits the problem.&lt;/p&gt;

&lt;p&gt;So my checklist was simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clean the base image first.&lt;/li&gt;
&lt;li&gt;Keep the product shape accurate.&lt;/li&gt;
&lt;li&gt;Generate outputs for specific channels, not generic “nice images.”&lt;/li&gt;
&lt;li&gt;Make the final set feel like one brand, not four random experiments.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That sounds obvious, but it’s where most AI image workflows go sideways. People jump straight to the final scene and skip the foundation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Fix the source before I create anything else
&lt;/h2&gt;

&lt;p&gt;The first pass was background removal and enhancement. I wanted the product isolated, sharp, and ready to reuse.&lt;/p&gt;

&lt;p&gt;That matters because every later tool depends on the original being readable. If I’m placing a product on a model, in a boutique, or on a desk, I don’t want the AI guessing at the edges or inventing details I need to trust. I want the bottle, bag, or headphones to stay the same while the lighting, backdrop, and context change.&lt;/p&gt;

&lt;p&gt;In practice, the order I used was:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Remove the background.&lt;/li&gt;
&lt;li&gt;Upscale the image.&lt;/li&gt;
&lt;li&gt;Fix color and lighting.&lt;/li&gt;
&lt;li&gt;Only then generate the new scene.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That sequence feels slower than “generate first, refine later,” but it saves me from unusable outputs.&lt;/p&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%2Frkvst3cp98gr88ryesrv.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%2Frkvst3cp98gr88ryesrv.png" alt="Product photo enhancement workflow illustration" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The editor view is what made the workflow click for me. I could see the source image, the controls, and the downstream result without leaving the app, which made it much easier to treat the edits as one system instead of a chain of disconnected tools.&lt;/p&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%2Fcazfdd4c4yhvr1d2l26a.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%2Fcazfdd4c4yhvr1d2l26a.png" alt="Workflow dashboard showing one photo branching into multiple outputs" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Match the image to the channel
&lt;/h2&gt;

&lt;p&gt;Once the source looked clean, I stopped asking for one “perfect” image and started asking for the right image for the job.&lt;/p&gt;

&lt;p&gt;A product page wants clarity. A paid ad wants attention. A social post wants motion and atmosphere. Those are different outputs, so the prompts should be different too.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;On a product page, I want a clean studio version that makes the item easy to inspect.&lt;/li&gt;
&lt;li&gt;For an ad, I want something that feels like it already belongs in someone’s life.&lt;/li&gt;
&lt;li&gt;For a fashion item, I want try-on output that shows fit and context.&lt;/li&gt;
&lt;li&gt;For content marketing, I want a b-roll or UGC-style frame that feels native to social.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s the part I like about Supra AI Photo Studio. It doesn’t force me into one workflow. It gives me the tools to make separate assets from the same starting point.&lt;/p&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%2Fgvo9hgx7hlxc195z7zek.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%2Fgvo9hgx7hlxc195z7zek.png" alt="Lifestyle scene placement workflow illustration" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Keep the variations consistent
&lt;/h2&gt;

&lt;p&gt;The trap with AI-generated product visuals is ending up with a pile of images that all look good individually and fail as a set.&lt;/p&gt;

&lt;p&gt;I’ve done that before. One scene looks premium. Another looks too warm. A third changes the product shape just enough that it feels off. The result is more content, but less trust.&lt;/p&gt;

&lt;p&gt;What I’m trying to preserve now is consistency:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Same product proportions.&lt;/li&gt;
&lt;li&gt;Same color story.&lt;/li&gt;
&lt;li&gt;Same level of polish.&lt;/li&gt;
&lt;li&gt;Same visual language across product page, ad, and social.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s why I think of this as a visual system, not a one-off image generator. When the outputs stay coherent, the store looks more deliberate, even if the assets came from a quick AI workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Use the app for more than still images
&lt;/h2&gt;

&lt;p&gt;The feature set matters here because stills are only part of the job.&lt;/p&gt;

&lt;p&gt;Supra AI Photo Studio also handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI model try-ons for apparel, jewelry, and accessories&lt;/li&gt;
&lt;li&gt;Object placement in environments like studios, luxury boutiques, or outdoors&lt;/li&gt;
&lt;li&gt;UGC-style videos for marketing&lt;/li&gt;
&lt;li&gt;B-roll videos for ads&lt;/li&gt;
&lt;li&gt;Mockup embedding for products and packaging&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That means I can start with a simple product photo and end with a small content pack instead of one isolated asset. For a Shopify store, that’s usually the real win: fewer scattered tools, less manual editing, and a more coherent catalog.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I stopped doing
&lt;/h2&gt;

&lt;p&gt;The biggest improvement wasn’t visual. It was operational.&lt;/p&gt;

&lt;p&gt;I stopped:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Treating the original product photo as disposable.&lt;/li&gt;
&lt;li&gt;Making the scene before cleaning the source.&lt;/li&gt;
&lt;li&gt;Using one style for every channel.&lt;/li&gt;
&lt;li&gt;Shipping images that looked nice but didn’t feel like the same brand.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s also why I now prefer to keep a written workflow alongside the image generation. If you want the narrower version of this process, I wrote about &lt;a href="https://how-to-blog.gitlab.io/2026/07/04/how-to-turn-plain-shopify-product-photos-into-lifestyle-shots/" rel="noopener noreferrer"&gt;turning plain Shopify product photos into lifestyle shots&lt;/a&gt;. If you want the bigger picture, the broader &lt;a href="https://the-lean-ecommerce.com/blog/how-i-turn-one-shopify-product-photo-into-listings-lifestyle-shots-and-clips-ONm7+daKgd6UUs5HETj2Fw" rel="noopener noreferrer"&gt;one-photo visual kit walkthrough&lt;/a&gt; shows how I extend the same idea into listings, lifestyle images, and clips.&lt;/p&gt;

&lt;h2&gt;
  
  
  When I’d use this workflow
&lt;/h2&gt;

&lt;p&gt;I’d reach for this whenever I have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A decent product photo that needs more context.&lt;/li&gt;
&lt;li&gt;A launch that needs more than one asset.&lt;/li&gt;
&lt;li&gt;A catalog that feels visually uneven.&lt;/li&gt;
&lt;li&gt;A product that needs both trust and attention.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s especially useful if you don’t have design time for every variation. The point is not to replace judgment. The point is to get to usable creative faster, with fewer dead ends.&lt;/p&gt;

&lt;p&gt;If you want to try it, the app is here: &lt;a href="https://apps.shopify.com/supra-ai-photo-studio" rel="noopener noreferrer"&gt;Supra AI Photo Studio&lt;/a&gt;. The landing page also has the demo and feature overview at &lt;a href="https://supra-ai-photo-studio.sktch.io/" rel="noopener noreferrer"&gt;supra-ai-photo-studio.sktch.io&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Start with a clean source image.&lt;/li&gt;
&lt;li&gt;Generate outputs for specific channels, not generic scenes.&lt;/li&gt;
&lt;li&gt;Keep the product visually consistent across every variation.&lt;/li&gt;
&lt;li&gt;Use the same workflow to produce stills, try-ons, and short videos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’m curious: if you had one good product photo today, would you use it first for a product page, an ad, or social?&lt;/p&gt;

</description>
      <category>shopify</category>
      <category>ecommerce</category>
      <category>ai</category>
      <category>productphotography</category>
    </item>
    <item>
      <title>How I Keep Video Preview, Editing, and Export in Sync With VideoJSON</title>
      <dc:creator>Yassine</dc:creator>
      <pubDate>Sat, 20 Jun 2026 14:34:45 +0000</pubDate>
      <link>https://dev.to/ybouane/how-i-keep-video-preview-editing-and-export-in-sync-with-videojson-54ge</link>
      <guid>https://dev.to/ybouane/how-i-keep-video-preview-editing-and-export-in-sync-with-videojson-54ge</guid>
      <description>&lt;p&gt;I kept running into the same bug in video projects: the preview looked right, the editor looked right, and the export was slightly off. By the time I had a browser renderer, a server renderer, and an editing UI, I was maintaining three versions of the same logic.&lt;/p&gt;

&lt;p&gt;The fix was to stop treating preview, editing, and rendering as separate artifacts. I moved to one &lt;code&gt;VideoJSON&lt;/code&gt; source of truth and let different renderers consume it. That is the workflow I now reach for when I want structured, repeatable video output instead of a one-off timeline I have to babysit.&lt;/p&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%2Fzfmcs6iafh5kmfeoutda.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%2Fzfmcs6iafh5kmfeoutda.png" alt="JSON-first video workflow with browser preview, server render, and editor" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Video Workflows Drift
&lt;/h2&gt;

&lt;p&gt;Video drift usually shows up in one of three places:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The preview uses a different scene definition than the export.&lt;/li&gt;
&lt;li&gt;The editor stores state in a format that does not map cleanly to rendering.&lt;/li&gt;
&lt;li&gt;The server render has its own assumptions about sizing, fonts, or timing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once those paths split, small changes become expensive. A title changes in the editor, but the preview still shows an old layout. A thumbnail looks fine in the browser, but the server output crops it differently. The longer the project lives, the more you end up comparing versions instead of shipping new video.&lt;/p&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%2Fvhv6c0et4widhogwy25k.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%2Fvhv6c0et4widhogwy25k.png" alt="Single JSON source of truth with duplicated timelines fading into the background" width="800" height="1200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Pattern That Fixed It
&lt;/h2&gt;

&lt;p&gt;VideoFlow's core idea is simple: describe the video in TypeScript, compile it into portable VideoJSON, and reuse that same structure across environments. The package docs call out browser rendering, server rendering, and a live DOM preview, which is exactly the separation I wanted. One model, multiple outputs.&lt;/p&gt;

&lt;p&gt;Here is the smallest version of that workflow from the docs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;VideoFlow&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@videoflow/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;VideoFlow&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Launch teaser&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1920&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1080&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;fps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello, VideoFlow!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;fontWeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;800&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;transitionIn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;overshootPop&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;500ms&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;videoJSON&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That &lt;code&gt;videoJSON&lt;/code&gt; object is the important part. Once I have it, I can render it in the browser, hand it to a server renderer, or mount it in a live editor without rewriting the scene logic. The renderer becomes an implementation detail, not the place where the creative decisions live.&lt;/p&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%2Fjjr01jy2kev04raxsdqs.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%2Fjjr01jy2kev04raxsdqs.png" alt="TypeScript authoring flowing into VideoJSON, browser preview, React editor, and server MP4 render" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Split The Workflow
&lt;/h2&gt;

&lt;p&gt;For me, the cleanest split looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Author the scene in TypeScript so the structure is explicit and reviewable.&lt;/li&gt;
&lt;li&gt;Compile to VideoJSON so the scene is data, not a one-off render artifact.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;@videoflow/renderer-browser&lt;/code&gt; for low-friction preview and browser-side export.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;@videoflow/renderer-server&lt;/code&gt; when I need batch jobs, queues, or API-driven renders.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;@videoflow/react-video-editor&lt;/code&gt; when the product needs an actual editing UI.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That approach also makes it easier to hand work between systems without translating the scene every time. If you want the browser/server handoff angle specifically, I went deeper on that in &lt;a href="https://productivity-tech-business.sktch.io/home/how-i-built-a-browser-to-server-video-workflow-with-videoflow-N9m7+daKgdWzkNNnncZnFw" rel="noopener noreferrer"&gt;How I Built a Browser-to-Server Video Workflow With VideoFlow&lt;/a&gt;.&lt;/p&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%2F1z5apkene9q0brnpqcpm.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%2F1z5apkene9q0brnpqcpm.png" alt="VideoJSON driving browser preview, editor, and MP4 output" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why The JSON Layer Helps Maintenance
&lt;/h2&gt;

&lt;p&gt;The biggest win is not just portability. It is maintenance.&lt;/p&gt;

&lt;p&gt;When the scene is JSON-shaped, I can diff it, store it, generate it, and review it without opening a timeline app. That matters when content is produced by code, when an agent generates the initial structure, or when multiple team members need to reason about the same video without stepping on each other.&lt;/p&gt;

&lt;p&gt;It is also the reason I like the template angle so much. Once the format becomes the product boundary, the workflow becomes easier to automate. I wrote more about that in &lt;a href="https://the-lean-ecommerce.blogspot.com/2026/06/how-to-build-video-template-system.html" rel="noopener noreferrer"&gt;How to Build a Video Template System Around a Single JSON Source of Truth&lt;/a&gt;, because the maintenance story is really the whole point.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where This Pattern Is A Better Fit
&lt;/h2&gt;

&lt;p&gt;I would use this approach when the work is structured and repeatable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;product demos&lt;/li&gt;
&lt;li&gt;social clips&lt;/li&gt;
&lt;li&gt;onboarding videos&lt;/li&gt;
&lt;li&gt;reports and dashboards&lt;/li&gt;
&lt;li&gt;template-driven marketing assets&lt;/li&gt;
&lt;li&gt;app-embedded editing workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I would be more cautious when the job is highly bespoke motion design, because a traditional timeline editor is still better for exploratory creative work. VideoFlow is strongest when you want repeatable composition, not when you want to manually nudge every frame.&lt;/p&gt;

&lt;h2&gt;
  
  
  If You Want To Try It
&lt;/h2&gt;

&lt;p&gt;VideoFlow is open source, and the docs are the fastest place to test the idea in practice: &lt;a href="https://videoflow.dev/docs" rel="noopener noreferrer"&gt;https://videoflow.dev/docs&lt;/a&gt; and &lt;a href="https://videoflow.dev/playground" rel="noopener noreferrer"&gt;https://videoflow.dev/playground&lt;/a&gt;. If you are building a video tool, I would start with one scene in TypeScript, compile it to VideoJSON, and see how far you can push that single model before introducing any duplication.&lt;/p&gt;

&lt;p&gt;The short version: keep one source of truth, and let the renderers adapt to it instead of the other way around.&lt;/p&gt;

&lt;p&gt;TL;DR: one VideoJSON document, multiple renderers, fewer mismatches.&lt;/p&gt;

&lt;p&gt;What are you using as the source of truth for video today?&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>video</category>
      <category>react</category>
    </item>
    <item>
      <title>I Built a Shopify AI Assistant for Inventory and Support Alerts</title>
      <dc:creator>Yassine</dc:creator>
      <pubDate>Fri, 19 Jun 2026 06:37:28 +0000</pubDate>
      <link>https://dev.to/ybouane/i-built-a-shopify-ai-assistant-for-inventory-and-support-alerts-4j68</link>
      <guid>https://dev.to/ybouane/i-built-a-shopify-ai-assistant-for-inventory-and-support-alerts-4j68</guid>
      <description>&lt;p&gt;I got tired of opening Shopify every morning just to answer the same questions: did anything oversell, what needs restocking, and what support issue is waiting to turn into a customer email.&lt;/p&gt;

&lt;p&gt;I had already explored the broader pattern in &lt;a href="https://the-lean-ecommerce.github.io/2026/06/18/how-i-built-a-guardrailed-shopify-ai-agent-for-daily-ops/" rel="noopener noreferrer"&gt;How I Built a Guardrailed Shopify AI Agent for Daily Ops&lt;/a&gt;. This post is the narrower version: one assistant, fewer permissions, and a very specific job. I wanted something closer to an OpenClaw for Shopify than a general-purpose chatbot, so I used &lt;a href="https://clawly.sktch.io/" rel="noopener noreferrer"&gt;Clawly&lt;/a&gt; to build a Shopify AI assistant that could watch inventory, draft support replies, and surface the stuff I actually need to review.&lt;/p&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%2F5uyz3pvkzep5pxuyfaax.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%2F5uyz3pvkzep5pxuyfaax.png" alt="Shopify AI agent monitoring products, inventory, support, and reports" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I let it do
&lt;/h2&gt;

&lt;p&gt;The biggest mistake I made early on was treating "AI assistant" as if it should just do everything. That is the fast way to get a store automation that is either useless or dangerous.&lt;/p&gt;

&lt;p&gt;What I trust it with is much narrower:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read product and inventory data&lt;/li&gt;
&lt;li&gt;Pull together a daily summary&lt;/li&gt;
&lt;li&gt;Flag low-stock items&lt;/li&gt;
&lt;li&gt;Draft support replies&lt;/li&gt;
&lt;li&gt;Send alerts when something looks off&lt;/li&gt;
&lt;li&gt;Move data between Shopify and tools like Sheets, Slack, or email&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What I do &lt;strong&gt;not&lt;/strong&gt; let it do by default is open-ended edits. If an action can change pricing, product data, or customer-facing messages in a way I would regret at 8 a.m., it stays behind a guardrail until I explicitly allow it.&lt;/p&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%2Ft8b9jk5c76owt69qz5k8.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%2Ft8b9jk5c76owt69qz5k8.png" alt="Permission matrix for allowed and blocked Shopify AI actions" width="800" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That permission layer is the whole point for me. Clawly is useful because I can scope the assistant to the store tasks I want automated without giving it blanket access to everything in Shopify admin.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup that actually works
&lt;/h2&gt;

&lt;p&gt;The best automation I built was not a giant "run my store" agent. It was a small chain of actions that starts with the store and ends with a notification I can trust.&lt;/p&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%2F15od8qx3748r98rlmmdv.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%2F15od8qx3748r98rlmmdv.png" alt="Connected automation map for Shopify, Sheets, Slack, email, and support tools" width="799" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In practice, the flow looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Watch products, orders, or support signals.&lt;/li&gt;
&lt;li&gt;Summarize what changed since the last check.&lt;/li&gt;
&lt;li&gt;Write the useful part into a report or sheet.&lt;/li&gt;
&lt;li&gt;Notify me only when something crosses a threshold.&lt;/li&gt;
&lt;li&gt;Keep a human in the loop for anything customer-facing or irreversible.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is also why I like this as an OpenClaw for Shopify style setup. It behaves more like a work assistant with scoped tools than a chatbot that talks confidently about your business.&lt;/p&gt;

&lt;h2&gt;
  
  
  The report I want every morning
&lt;/h2&gt;

&lt;p&gt;I use one assistant to answer three questions before I start the day:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did inventory dip below a level I care about?&lt;/li&gt;
&lt;li&gt;Did orders spike or look unusual?&lt;/li&gt;
&lt;li&gt;Did support need attention overnight?&lt;/li&gt;
&lt;/ul&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%2F7jl2uj4st7zhg4l5jyx1.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%2F7jl2uj4st7zhg4l5jyx1.png" alt="Morning Shopify ops report with sales, inventory, and support alerts" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The report does not need to be fancy. It just needs to be short, predictable, and good at escalation.&lt;/p&gt;

&lt;p&gt;For me, that means the assistant should:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Highlight low-stock items before they become a problem&lt;/li&gt;
&lt;li&gt;Call out sales spikes or strange order patterns&lt;/li&gt;
&lt;li&gt;Draft a support summary instead of trying to "solve" support automatically&lt;/li&gt;
&lt;li&gt;Make it obvious when I should step in&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That combination is useful because it saves attention, not just time. A lot of automation tools can send more notifications. The real win is sending fewer, better ones.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I still keep manual
&lt;/h2&gt;

&lt;p&gt;I still keep a few things human-only:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pricing changes&lt;/li&gt;
&lt;li&gt;Discount logic&lt;/li&gt;
&lt;li&gt;Customer-facing replies that sound sensitive or nuanced&lt;/li&gt;
&lt;li&gt;Any store action I would want to audit later&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the trade-off I actually want. I am not trying to replace the merchant. I am trying to remove the repetitive checking that keeps interrupting the merchant.&lt;/p&gt;

&lt;p&gt;If you want the reporting-first version of this setup, I also wrote about the narrower daily-report flow in &lt;a href="https://how-to.the-lean-ecommerce.com/2026/06/18/how-to-set-up-a-guardrailed-shopify-ai-assistant-for-daily-reports-and/" rel="noopener noreferrer"&gt;How to Set Up a Guardrailed Shopify AI Assistant for Daily Reports and Alerts&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I think this matters
&lt;/h2&gt;

&lt;p&gt;Most teams do not need a more powerful chatbot. They need a safer assistant that knows which Shopify actions it can take, which ones it can only draft, and which ones it should never touch.&lt;/p&gt;

&lt;p&gt;That is the value I get from Clawly. It lets me build a Shopify AI assistant around real store work: inventory checks, product cleanup, support drafts, and lightweight automation, without handing over the keys.&lt;/p&gt;

&lt;p&gt;If you want to try the same pattern, start with one narrow assistant and one narrow job. The best first version is usually daily reports or low-inventory alerts, not full autonomy.&lt;/p&gt;

&lt;p&gt;You can try it on the &lt;a href="https://clawly.sktch.io/" rel="noopener noreferrer"&gt;Clawly landing page&lt;/a&gt; or the &lt;a href="https://apps.shopify.com/clawly" rel="noopener noreferrer"&gt;Shopify App Store listing&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;TL;DR: start with reads, drafts, and alerts, then add writes only where you can tolerate mistakes. What would you let a Shopify AI assistant handle first?&lt;/p&gt;

</description>
      <category>shopify</category>
      <category>ai</category>
      <category>automation</category>
      <category>ecommerce</category>
    </item>
    <item>
      <title>How I Built Native-Looking Shopify Swatches Without Theme Code</title>
      <dc:creator>Yassine</dc:creator>
      <pubDate>Thu, 18 Jun 2026 06:33:30 +0000</pubDate>
      <link>https://dev.to/ybouane/how-i-built-native-looking-shopify-swatches-without-theme-code-l2m</link>
      <guid>https://dev.to/ybouane/how-i-built-native-looking-shopify-swatches-without-theme-code-l2m</guid>
      <description>&lt;p&gt;I was trying to make a Shopify swatch experience feel like part of the store, not a bolt-on.&lt;/p&gt;

&lt;p&gt;That sounds simple until you try to cover variant colors, linked products, collection pages, multilingual stores, and brand styling at the same time. The first version I hacked together looked acceptable on one product page, then got awkward everywhere else.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apps.shopify.com/swatch-colors-ultimator" rel="noopener noreferrer"&gt;Supra Swatch Colors&lt;/a&gt; is the first setup I found that let me keep the store clean without touching theme code. It handles color and image swatches, works on product and collection pages, supports linked products and variants, and loads instantly across all Shopify themes.&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2F2zetik0kz33309to8dmt.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.amazonaws.com%2Fuploads%2Farticles%2F2zetik0kz33309to8dmt.png" alt="Variant swatches mapped to Shopify product options" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Problem I Was Solving
&lt;/h3&gt;

&lt;p&gt;I did not want a swatch system that only looked good in the demo. I wanted something I could actually leave in production without becoming the person who has to babysit CSS every time merchandising changes.&lt;/p&gt;

&lt;p&gt;That gave me a short list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Swatches for built-in variants when the product already has color choices.&lt;/li&gt;
&lt;li&gt;Swatches that link separate product pages when the catalog is split across listings.&lt;/li&gt;
&lt;li&gt;Swatches on collection pages so discovery does not stop at the product page.&lt;/li&gt;
&lt;li&gt;A setup that works with the theme I already have.&lt;/li&gt;
&lt;li&gt;Enough styling control that the swatches do not look generic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last part is where most solutions fall apart. If the control surface is weak, you end up with a feature that technically works but still feels off-brand.&lt;/p&gt;

&lt;p&gt;I had already written about why I wanted a swatch app that feels native in &lt;a href="https://the-lean-ecommerce.blogspot.com/2026/06/how-i-choose-shopify-swatch-app-that.html" rel="noopener noreferrer"&gt;How I Choose a Shopify Swatch App That Feels Native&lt;/a&gt;. This post is the implementation version: what I actually wanted once I started using one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Variant Swatches vs Linked Products
&lt;/h3&gt;

&lt;p&gt;This is the first decision I would make again.&lt;/p&gt;

&lt;p&gt;If the different colors are just variants of one product, I would use the built-in variant swatches. That keeps the catalog tidy and avoids creating duplicate pages that do not need to exist.&lt;/p&gt;

&lt;p&gt;If the colorways are truly separate product pages, I would link them with swatches instead. That is a better fit when each page has its own description, imagery, or merchandising setup.&lt;/p&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%2Femllogiwm08k95atn3qu.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%2Femllogiwm08k95atn3qu.png" alt="Swatch setup on a laptop with linked products" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That distinction matters because it changes how the store behaves for both customers and the team editing it. If you force everything into one model, you end up fighting the content structure instead of making it clearer.&lt;/p&gt;

&lt;p&gt;Supra Swatch Colors supports both patterns, so I did not have to pick one workflow and then patch around the edge cases later.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Collection Pages Matter
&lt;/h3&gt;

&lt;p&gt;The best swatch system is not just a product-page detail. Collection pages are where people compare, scan, and narrow down options quickly.&lt;/p&gt;

&lt;p&gt;If the swatches only show up after a click-through, you are making shoppers do extra work for something they should understand at a glance.&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2Fn6efjls285yf9co4ijo1.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.amazonaws.com%2Fuploads%2Farticles%2Fn6efjls285yf9co4ijo1.png" alt="Swatches visible on collection pages" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once I saw swatches on collection cards, the store felt more coherent. The same color language followed the shopper through browse, compare, and decide.&lt;/p&gt;

&lt;p&gt;That is also where the app’s instant-loading behavior matters. Slow swatches are worse than no swatches, because they make the page feel broken right when the customer is trying to choose.&lt;/p&gt;

&lt;h3&gt;
  
  
  Styling It So It Feels Native
&lt;/h3&gt;

&lt;p&gt;I am picky about this part because it is easy to ship a feature that works and still looks out of place.&lt;/p&gt;

&lt;p&gt;Supra Swatch Colors gives you more than a binary on/off switch. You can tune the swatch size, shape, tooltip, label, font, and overall style, and there are 20+ styles to work from. You can also auto-detect colors in the store or use product images to speed up setup.&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2F0fycxtjopbycosp7yr42.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.amazonaws.com%2Fuploads%2Farticles%2F0fycxtjopbycosp7yr42.png" alt="Customization controls and swatch styles" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That is the difference between "added swatches" and "the store has a visual system." When the controls are broad enough, you can make the component disappear into the design instead of shouting over it.&lt;/p&gt;

&lt;p&gt;I leaned on the same no-code instinct I talked about in &lt;a href="https://productivity-tech-business.sktch.io/home/how-i-added-shopify-color-swatches-without-touching-theme-code-N+m7+daKgYeTLs9sEQdglw" rel="noopener noreferrer"&gt;How I Added Shopify Color Swatches Without Touching Theme Code&lt;/a&gt;. If I can avoid theme edits and still get a cleaner storefront, that is usually the right trade.&lt;/p&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%2Fgsj2s0kj0b5jhg1xusro.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%2Fgsj2s0kj0b5jhg1xusro.png" alt="Native-feeling swatch cards in a dark developer scene" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Setup I Would Recommend
&lt;/h3&gt;

&lt;p&gt;If I were setting this up again, I would do it in this order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Decide which products should use variants and which should use linked-product swatches.&lt;/li&gt;
&lt;li&gt;Turn on swatches for the product page first so the core flow is correct.&lt;/li&gt;
&lt;li&gt;Add collection-page swatches once the product-page behavior feels right.&lt;/li&gt;
&lt;li&gt;Pick a visual style that matches the rest of the theme instead of starting from the loudest preset.&lt;/li&gt;
&lt;li&gt;Test the setup on a real product family, not a perfect demo product.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That last step is where the rough edges show up. Real catalogs have odd naming, inconsistent imagery, and exceptions that never appear in a clean sandbox.&lt;/p&gt;

&lt;p&gt;If you want the exact walkthrough, the getting started video is here: &lt;a href="https://www.youtube.com/watch?v=K_2l9G1ibIo" rel="noopener noreferrer"&gt;Supra Swatch Colors — Getting Started — Tutorial&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I Liked Most
&lt;/h3&gt;

&lt;p&gt;The thing I care about most is that the swatches do not feel like a separate feature layer.&lt;/p&gt;

&lt;p&gt;The app works on all themes, supports multilingual shops, handles product and collection pages, and gives me a way to manage a lot of swatches without turning setup into a maintenance project. That is the difference between a nice screenshot and something I can leave alone after launch.&lt;/p&gt;

&lt;p&gt;If you want to test it, the cleanest place to start is the Shopify App Store listing for &lt;a href="https://apps.shopify.com/swatch-colors-ultimator" rel="noopener noreferrer"&gt;Supra Swatch Colors&lt;/a&gt;. The product site is also useful if you want to see the positioning and examples first: &lt;a href="https://supra-swatch-colors.sktch.io/" rel="noopener noreferrer"&gt;supra-swatch-colors.sktch.io&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  TL;DR
&lt;/h3&gt;

&lt;p&gt;If your swatches still depend on theme code or feel bolted on, I would try a swatch app that supports both variants and linked products, works on collection pages, and gives you real styling control.&lt;/p&gt;

&lt;p&gt;That is the setup that finally made my Shopify swatches feel native instead of patched together.&lt;/p&gt;

&lt;p&gt;If you have built swatches another way, I want to know what broke first: variant mapping, collection pages, or the styling layer?&lt;/p&gt;

</description>
      <category>shopify</category>
      <category>ecommerce</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How I Turned Plain Shopify Product Photos Into a Full Launch Kit</title>
      <dc:creator>Yassine</dc:creator>
      <pubDate>Wed, 03 Jun 2026 06:37:59 +0000</pubDate>
      <link>https://dev.to/ybouane/how-i-turned-plain-shopify-product-photos-into-a-full-launch-kit-1eji</link>
      <guid>https://dev.to/ybouane/how-i-turned-plain-shopify-product-photos-into-a-full-launch-kit-1eji</guid>
      <description>&lt;p&gt;I used to treat product photography like a single deliverable: get one decent hero shot, ship it, move on. That works until you need the rest of the launch kit. Then you still need a lifestyle image, an on-model image, a version that looks good in a collection grid, and something that can actually stand up in paid social.&lt;/p&gt;

&lt;p&gt;That is the problem I was trying to solve with &lt;a href="https://apps.shopify.com/supra-ai-photo-studio" rel="noopener noreferrer"&gt;Supra AI Photo Studio&lt;/a&gt;: take one plain product photo and turn it into a set of visuals I can reuse across the product page, ads, email, and social without opening a separate design queue for each one.&lt;/p&gt;

&lt;p&gt;I am not trying to make every image look like a fake ad. I am trying to keep the product real, keep the brand consistent, and keep the workflow short enough that I will actually use it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I wanted out of the workflow
&lt;/h2&gt;

&lt;p&gt;Before I touched the app, I wrote down the outputs I actually needed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one cleaned-up catalog image&lt;/li&gt;
&lt;li&gt;one lifestyle scene that adds context&lt;/li&gt;
&lt;li&gt;one on-model version when the product needs a body&lt;/li&gt;
&lt;li&gt;one short motion asset for ads or reels&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the workflow cannot produce those four things from the same source image, it is probably too much process for a small shop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start With The Clean Source
&lt;/h2&gt;

&lt;p&gt;The biggest mistake I kept making was jumping straight to the fun scene. If the source image is muddy, the final output usually looks muddy too.&lt;/p&gt;

&lt;p&gt;So I start by cleaning the image first: background removal, upscaling, and basic enhancement before I ask the app to place the product into a new environment.&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2Fek53knwnrbhr6r74r1og.webp" 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.amazonaws.com%2Fuploads%2Farticles%2Fek53knwnrbhr6r74r1og.webp" alt="Supra AI Photo Studio editor overview" width="800" height="682"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The editor matters because it keeps the work in one place. I can move from the source image to the edit tools, review the canvas, and jump between variants without exporting and re-importing the same file over and over.&lt;/p&gt;

&lt;p&gt;If you want the bigger operational picture behind this, I also wrote about &lt;a href="https://the-lean-ecommerce.gitlab.io/2026/05/28/how-to-turn-one-product-photo-into-listings-lifestyle-shots-and-ads/" rel="noopener noreferrer"&gt;how I turn one product photo into listings, lifestyle shots, and ads&lt;/a&gt; and &lt;a href="https://the-lean-ecommerce.blogspot.com/2026/05/how-to-keep-shopify-product-photos.html" rel="noopener noreferrer"&gt;how I keep Shopify product photos consistent across my catalog&lt;/a&gt;. Those two posts are basically the guardrails around this one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build The Scene, Not Just The Photo
&lt;/h2&gt;

&lt;p&gt;Once the base image is clean, I use object placement to build a scene that answers a buyer question.&lt;/p&gt;

&lt;p&gt;If the product is headphones, I want to know what it looks like on a desk, in a room, or in a premium gift context. If it is skincare, I want to know whether it reads as clinical, luxury, or everyday. The point is not decoration. The point is helping the shopper imagine the product in use.&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2F23kt0pe1nunpxchtrnic.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.amazonaws.com%2Fuploads%2Farticles%2F23kt0pe1nunpxchtrnic.png" alt="AI object placement turning a plain photo into a lit studio scene" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the output I keep coming back to for PDPs and collections. It is polished enough to feel deliberate, but it still looks like the same product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Try-On Only When The Category Needs A Body
&lt;/h2&gt;

&lt;p&gt;For fashion, accessories, and some beauty-adjacent products, the product image alone is not enough. The shopper wants fit, shape, and proportion.&lt;/p&gt;

&lt;p&gt;That is where try-on starts to earn its place. I do not use it to invent a new product story. I use it to answer the question the flat image cannot answer.&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2Fj0kzoo850zfpp1u2dnhr.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.amazonaws.com%2Fuploads%2Farticles%2Fj0kzoo850zfpp1u2dnhr.png" alt="AI try-on preview with a fashion model and jacket" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The value here is consistency. Instead of staging a new shoot every time I need a different pose or model setup, I can keep the same product and change the context around it. That makes it much easier to test what actually converts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make Motion Assets Too
&lt;/h2&gt;

&lt;p&gt;Still images are useful, but a launch kit feels incomplete without motion.&lt;/p&gt;

&lt;p&gt;Short product b-roll gives me a way to make a paid social ad, a social teaser, or a product announcement without turning the whole thing into a video production project.&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2Fkcf4i02usdd2wg9yaceh.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.amazonaws.com%2Fuploads%2Farticles%2Fkcf4i02usdd2wg9yaceh.png" alt="Cinematic product b-roll with splash and motion effects" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the kind of asset I want when I need movement, detail, and a little more attention on a feed. It is also the easiest place to overdo it, so I keep the effect restrained and make sure the product stays readable.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Would Keep, And What I Would Skip
&lt;/h2&gt;

&lt;p&gt;If I were setting this up for a real store, I would keep the workflow tight:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;start with the cleanest source image you have&lt;/li&gt;
&lt;li&gt;generate one catalog-safe version first&lt;/li&gt;
&lt;li&gt;create one lifestyle scene that matches the brand&lt;/li&gt;
&lt;li&gt;add one on-model or context-heavy version only if it helps the buyer&lt;/li&gt;
&lt;li&gt;generate one motion asset if you need ads or social content&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And I would skip anything that makes the product feel less trustworthy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;scenes that are too stylized for the price point&lt;/li&gt;
&lt;li&gt;lighting that changes the product color&lt;/li&gt;
&lt;li&gt;models or settings that drift away from the brand&lt;/li&gt;
&lt;li&gt;too many variants before you know which one is the winner&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point matters. More images are not automatically better. Better images are better.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Kept This In My Stack
&lt;/h2&gt;

&lt;p&gt;The reason I kept testing Supra AI Photo Studio is simple: it reduces the number of tools I need to finish one launch.&lt;/p&gt;

&lt;p&gt;The app listing is here if you want the short version: &lt;a href="https://apps.shopify.com/supra-ai-photo-studio" rel="noopener noreferrer"&gt;Supra AI Photo Studio on Shopify&lt;/a&gt;. The landing page has the longer feature breakdown and examples: &lt;a href="https://supra-ai-photo-studio.sktch.io/" rel="noopener noreferrer"&gt;supra-ai-photo-studio.sktch.io&lt;/a&gt;. If you want to see the product in motion first, the &lt;a href="https://www.youtube.com/watch?v=M2ISy20la78" rel="noopener noreferrer"&gt;demo trailer&lt;/a&gt; is the fastest way to get the shape of it.&lt;/p&gt;

&lt;p&gt;There is a free plan, which makes it easier to test the workflow on one SKU before you commit to a larger batch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Take
&lt;/h2&gt;

&lt;p&gt;I would not use AI photo tools to replace a good source image. I would use them to make that source image earn more places in the launch.&lt;/p&gt;

&lt;p&gt;If you are sitting on a folder of plain product shots, pick one SKU and build four outputs from it: one clean catalog image, one lifestyle scene, one contextual or on-model image, and one motion asset. If that set is good enough to ship, the workflow is doing its job.&lt;/p&gt;

</description>
      <category>shopify</category>
      <category>ai</category>
      <category>ecommerce</category>
      <category>marketing</category>
    </item>
    <item>
      <title>How I Built a Shopify UGC Video Variation Pipeline</title>
      <dc:creator>Yassine</dc:creator>
      <pubDate>Sat, 30 May 2026 14:37:03 +0000</pubDate>
      <link>https://dev.to/ybouane/how-i-built-a-shopify-ugc-video-variation-pipeline-5cg</link>
      <guid>https://dev.to/ybouane/how-i-built-a-shopify-ugc-video-variation-pipeline-5cg</guid>
      <description>&lt;p&gt;I was trying to get more UGC-style creative out the door without turning every variation into a new shoot. The problem was not ideas. It was throughput.&lt;/p&gt;

&lt;p&gt;Supra UGC Maker gave me a way to treat video like a repeatable workflow instead of a one-off deliverable. I can pick an avatar or generate a custom AI model, set a scene, add the Shopify product, write the script, choose the voice and tone, then generate segments I can reuse later.&lt;/p&gt;

&lt;p&gt;That matters because the fastest way to waste time on ecommerce video is to build from scratch every time. I wanted a system where the variables were explicit, so I could test hooks, scenes, and calls to action without rebuilding the whole asset.&lt;/p&gt;

&lt;p&gt;I also borrowed the brief-first approach I used in &lt;a href="https://how-to-blog.gitlab.io/2026/05/27/how-to-turn-a-shopify-product-page-into-a-ugc-video-brief/" rel="noopener noreferrer"&gt;How to Turn a Shopify Product Page Into a UGC Video Brief&lt;/a&gt; and extended it into the variation stage. The goal was not “make a video.” The goal was “make a video system.”&lt;/p&gt;

&lt;h2&gt;
  
  
  The workflow I actually wanted
&lt;/h2&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.amazonaws.com%2Fuploads%2Farticles%2Ft7bu6gnwh35vunxj8suf.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.amazonaws.com%2Fuploads%2Farticles%2Ft7bu6gnwh35vunxj8suf.png" alt="Developer building a Shopify UGC video workflow with a neon editing pipeline" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If I strip the process down, the useful inputs are simple:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "avatar": "preset or custom AI model",
  "scene": "studio, outdoor, boutique, or brand-specific",
  "product": "Shopify product",
  "script": "what the avatar says",
  "voice": "tone and delivery",
  "output": "short-form UGC-style segments"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The value is in the separation. Avatar, scene, product, and script are independent knobs. When one of them changes, I can tell whether the change affected the result.&lt;/p&gt;

&lt;p&gt;That is why I care about previewing scenes before generating, and why I like that I can reorder, trim, update, and regenerate clips inside one project. If a hook is weak, I can replace the hook without throwing away the rest of the setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  The matrix is the product
&lt;/h2&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.amazonaws.com%2Fuploads%2Farticles%2F64o2j8qs41yxsrndq4d2.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.amazonaws.com%2Fuploads%2Farticles%2F64o2j8qs41yxsrndq4d2.png" alt="Creative testing matrix for UGC video variations" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The biggest mistake I made early was treating one video as if it represented the whole idea. It does not.&lt;/p&gt;

&lt;p&gt;What I need is a matrix:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One product.&lt;/li&gt;
&lt;li&gt;Several hooks.&lt;/li&gt;
&lt;li&gt;A few avatar choices.&lt;/li&gt;
&lt;li&gt;A few scenes.&lt;/li&gt;
&lt;li&gt;Different tones.&lt;/li&gt;
&lt;li&gt;Different calls to action.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I used the same thinking I wrote about in &lt;a href="https://how-to.the-lean-ecommerce.com/2026/05/27/how-to-create-shopify-ugc-video-ad-variations-from-one-brief/" rel="noopener noreferrer"&gt;How to Create Shopify UGC Video Ad Variations From One Brief&lt;/a&gt; and pushed it one step further. Instead of asking, “What is the best video?”, I ask, “What is the smallest set of changes that gives me signal?”&lt;/p&gt;

&lt;p&gt;That keeps the process honest. If the only thing I change is the hook, I can compare hooks. If I also change the avatar, the scene, and the script, I have no idea what actually worked.&lt;/p&gt;

&lt;p&gt;For a Shopify store, that matters because the same creative usually has to do more than one job. It might need to sell in a paid social ad, explain the product on a product page, and keep working in email later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reusable projects beat one-off assets
&lt;/h2&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.amazonaws.com%2Fuploads%2Farticles%2Fzee6osd4wvpcyolxj2dg.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.amazonaws.com%2Fuploads%2Farticles%2Fzee6osd4wvpcyolxj2dg.png" alt="One product transformed into multiple UGC video variations" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The feature I would miss most if I switched tools is the ability to save reusable scenes and projects. That sounds minor until you start running the same product through multiple campaign angles.&lt;/p&gt;

&lt;p&gt;Reusable projects let me keep:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a consistent brand look,&lt;/li&gt;
&lt;li&gt;a known-good avatar,&lt;/li&gt;
&lt;li&gt;a working scene setup,&lt;/li&gt;
&lt;li&gt;a script style that already performs,&lt;/li&gt;
&lt;li&gt;and a library of variations I can come back to.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the real workflow win. I am not trying to generate one perfect ad. I am trying to build a library of usable assets that do not need a full production cycle every time I want a new angle.&lt;/p&gt;

&lt;p&gt;I also like that the output is not trapped in one channel. Once the segment exists, I can use it in ads, product pages, launch pages, email campaigns, seasonal promos, or post-purchase education. The same asset can do different work depending on where I place it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I would ship the clips first
&lt;/h2&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.amazonaws.com%2Fuploads%2Farticles%2F0i61w6qxi2svexgrfcsm.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.amazonaws.com%2Fuploads%2Farticles%2F0i61w6qxi2svexgrfcsm.png" alt="UGC video variations flowing through the Shopify funnel" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My first pass would be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a short ad version for paid social,&lt;/li&gt;
&lt;li&gt;a product page version that explains the item,&lt;/li&gt;
&lt;li&gt;a teaser for email,&lt;/li&gt;
&lt;li&gt;and one follow-up version for post-purchase education.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That mix gives me a better read on what the creative is actually doing. If the ad version pulls attention but the product page version does not clarify the offer, I know the script needs work, not the whole concept.&lt;/p&gt;

&lt;p&gt;It also helps that Supra UGC Maker is positioned around Shopify merchants who need more short-form product video content without hiring influencers, videographers, or editors for every variation. That is the core constraint I was solving.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would tell another developer
&lt;/h2&gt;

&lt;p&gt;If you are building your own ecommerce creative workflow, do not start with the final polished video. Start with the variables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;avatar&lt;/li&gt;
&lt;li&gt;scene&lt;/li&gt;
&lt;li&gt;product&lt;/li&gt;
&lt;li&gt;script&lt;/li&gt;
&lt;li&gt;voice&lt;/li&gt;
&lt;li&gt;CTA&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then make it easy to regenerate just one part of the asset at a time.&lt;/p&gt;

&lt;p&gt;That is the difference between a tool that helps you make one video and a tool that helps you test creative systematically.&lt;/p&gt;

&lt;p&gt;If you want to try the same workflow, the product is on the &lt;a href="https://supra-ugc-maker.sktch.io/" rel="noopener noreferrer"&gt;Supra UGC Maker landing page&lt;/a&gt; and the &lt;a href="https://apps.shopify.com/supra-ugc-maker" rel="noopener noreferrer"&gt;Shopify App Store&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;TL;DR: I stopped thinking about UGC as a one-off asset and started treating it like a repeatable pipeline. Once the inputs are explicit, the creative gets easier to test and much easier to reuse.&lt;/p&gt;

&lt;p&gt;What would you test first: hook, scene, or avatar?&lt;/p&gt;

</description>
      <category>shopify</category>
      <category>ecommerce</category>
      <category>ai</category>
      <category>video</category>
    </item>
    <item>
      <title>How I Built a Programmatic Video Generator With VideoFlow in Node.js</title>
      <dc:creator>Yassine</dc:creator>
      <pubDate>Fri, 22 May 2026 10:38:14 +0000</pubDate>
      <link>https://dev.to/ybouane/how-i-built-a-programmatic-video-generator-with-videoflow-in-nodejs-4m20</link>
      <guid>https://dev.to/ybouane/how-i-built-a-programmatic-video-generator-with-videoflow-in-nodejs-4m20</guid>
      <description>&lt;h1&gt;
  
  
  How I Built a Programmatic Video Generator With VideoFlow in Node.js
&lt;/h1&gt;

&lt;p&gt;I kept running into the same problem: once a video lived in a manual timeline, I lost the ability to regenerate it cleanly. One tiny copy change, one updated product frame, or one new render target and the whole thing turned into another editing job.&lt;/p&gt;

&lt;p&gt;VideoFlow pushed me toward a better shape: describe the video in TypeScript, compile it into portable VideoJSON, and render the same source in the browser, on a server, or inside a live preview. That makes the pipeline feel like code instead of a one-off creative file.&lt;/p&gt;

&lt;p&gt;If you want the short version, here is the workflow I actually care about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start with &lt;code&gt;@videoflow/core&lt;/code&gt; and model the video in code.&lt;/li&gt;
&lt;li&gt;Keep the intermediate format portable so it can be stored, versioned, and reused.&lt;/li&gt;
&lt;li&gt;Pick the renderer based on where export needs to happen.&lt;/li&gt;
&lt;li&gt;Add the React editor only when users need a visual layer on top.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project is open source under Apache-2.0, and the main entry points are the &lt;a href="https://videoflow.dev/" rel="noopener noreferrer"&gt;VideoFlow site&lt;/a&gt;, &lt;a href="https://videoflow.dev/docs" rel="noopener noreferrer"&gt;docs&lt;/a&gt;, &lt;a href="https://videoflow.dev/core" rel="noopener noreferrer"&gt;core docs&lt;/a&gt;, &lt;a href="https://videoflow.dev/renderers" rel="noopener noreferrer"&gt;renderers docs&lt;/a&gt;, &lt;a href="https://videoflow.dev/react-video-editor" rel="noopener noreferrer"&gt;React video editor&lt;/a&gt;, &lt;a href="https://videoflow.dev/playground" rel="noopener noreferrer"&gt;playground&lt;/a&gt;, and &lt;a href="https://videoflow.dev/examples" rel="noopener noreferrer"&gt;examples&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Small Pipeline I Actually Wanted
&lt;/h2&gt;

&lt;p&gt;I did not want a fancy editorial toolchain. I wanted a small, repeatable path from structured input to MP4 output. In practice, that means the video authoring step needs to be code-first, and the rendering step needs to stay flexible.&lt;/p&gt;

&lt;p&gt;This is the minimal shape I kept coming back to:&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;install&lt;/span&gt; @videoflow/core
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;VideoFlow&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@videoflow/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;VideoFlow&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;My Video&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1920&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1080&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;fps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello, VideoFlow!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;fontWeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;800&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;transitionIn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;overshootPop&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;500ms&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;json&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;blob&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;renderVideo&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That tiny example is doing the important part: it separates scene authoring from output. &lt;code&gt;compile()&lt;/code&gt; gives you a portable representation of the video, and &lt;code&gt;renderVideo()&lt;/code&gt; gives you the MP4 when you need it.&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2Ftynug6wbqdlmpvl39xrm.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.amazonaws.com%2Fuploads%2Farticles%2Ftynug6wbqdlmpvl39xrm.png" alt="JSON to MP4 workflow on a developer workstation" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I like this setup because it turns video into a thing I can inspect, rebuild, and swap between environments without rewriting the whole project. For product demos, templated social clips, onboarding videos, or generated reports, that matters more than any single animation trick.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why VideoJSON Changes The Maintenance Story
&lt;/h2&gt;

&lt;p&gt;The big win is not just that the videos are generated. It is that the source of truth becomes portable.&lt;/p&gt;

&lt;p&gt;When the intermediate format is JSON, I can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Store templates in Git and review changes like code.&lt;/li&gt;
&lt;li&gt;Feed structured data from a CMS, database, or AI agent into the same template.&lt;/li&gt;
&lt;li&gt;Reuse one video design across multiple render targets without rebuilding the scene logic.&lt;/li&gt;
&lt;li&gt;Keep the project easier to diff when a prompt, scene, or CTA changes.&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Fg8wye63pwgwr6gdhwwx1.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.amazonaws.com%2Fuploads%2Farticles%2Fg8wye63pwgwr6gdhwwx1.png" alt="Versioned JSON video template repository" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That is also where the comparison to older workflows becomes clearer. Traditional timeline editing is great when the work is mostly manual and creative. But if the goal is repeatability, versioning, or automation, a JSON source of truth is much easier to reason about.&lt;/p&gt;

&lt;p&gt;If you want the browser-export angle, I covered that separately in &lt;a href="https://the-lean-ecommerce.blogspot.com/2026/05/how-to-build-browser-based-mp4-export.html" rel="noopener noreferrer"&gt;How to Build a Browser-Based MP4 Export Pipeline with VideoFlow&lt;/a&gt;. For the portable-data angle, &lt;a href="https://how-to.the-lean-ecommerce.com/2026/05/17/how-to-build-a-portable-json-to-video-workflow-with-videoflow/" rel="noopener noreferrer"&gt;How to Build a Portable JSON-to-Video Workflow with VideoFlow&lt;/a&gt; goes deeper on the same idea.&lt;/p&gt;

&lt;h2&gt;
  
  
  Browser, Server, And Live Preview
&lt;/h2&gt;

&lt;p&gt;VideoFlow is useful to me because the same video description can move through different render paths instead of being trapped in one environment.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;@videoflow/renderer-browser&lt;/code&gt; is the right fit when export should happen in the user's browser.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@videoflow/renderer-server&lt;/code&gt; is the better fit when I want queue jobs, APIs, CI, or batch rendering.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@videoflow/renderer-dom&lt;/code&gt; is what I want when I need a live preview inside an app or editor.&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Fi0s1zz2nxbf7cwghyu9u.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.amazonaws.com%2Fuploads%2Farticles%2Fi0s1zz2nxbf7cwghyu9u.png" alt="Browser, server, and live preview renderers" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That separation matters because it lets the same scene logic serve multiple product needs. An editor can preview frames live. A backend can render jobs overnight. A browser app can export without shipping the whole project to a rendering service. I wrote about the server/browser split before in &lt;a href="https://how-to-blog.gitlab.io/2026/05/21/how-to-build-a-video-json-pipeline-that-renders-everywhere-with-videof/" rel="noopener noreferrer"&gt;How to Build a Video JSON Pipeline That Renders Everywhere With VideoFlow&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where The React Editor Fits
&lt;/h2&gt;

&lt;p&gt;I do not reach for the React editor first. I reach for it when the product needs non-developers to adjust or inspect the video without touching code.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://videoflow.dev/react-video-editor" rel="noopener noreferrer"&gt;React video editor&lt;/a&gt; is the layer that makes that practical: multi-track timeline, drag and drop, keyframes, transitions, undo/redo, uploads, theme choices, and MP4 export.&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2Fktr515m58lbo9vm2r257.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.amazonaws.com%2Fuploads%2Farticles%2Fktr515m58lbo9vm2r257.png" alt="React video editor timeline and inspector" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That is the difference between a library and a workflow. The library gives me the rendering primitive. The editor gives me a human interface when the product calls for one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Still Review Manually
&lt;/h2&gt;

&lt;p&gt;Automation is not the same thing as blind publishing. I still review the things that can break trust fast:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Product names, prices, and claims.&lt;/li&gt;
&lt;li&gt;Copy that is too generic or too promotional.&lt;/li&gt;
&lt;li&gt;Visuals that do not match the intent of the post.&lt;/li&gt;
&lt;li&gt;Templates that should be versioned before they are reused.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For that reason, I like treating VideoFlow as the engine and not the entire editorial process. The engine should be fast, portable, and predictable. The review step should stay human where accuracy matters.&lt;/p&gt;

&lt;p&gt;I also keep &lt;a href="https://the-lean-ecommerce.github.io/2026/05/21/how-i-kept-video-templates-versionable-in-git-with-videoflow/" rel="noopener noreferrer"&gt;How I Kept Video Templates Versionable in Git With VideoFlow&lt;/a&gt; and &lt;a href="https://the-lean-ecommerce.blogspot.com/2026/05/how-to-generate-mp4-videos-from-json.html" rel="noopener noreferrer"&gt;How I Built a Programmatic Video Generator in Node.js&lt;/a&gt; nearby when I am deciding whether to ship a scene as code or as a visual editor workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related Reads
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://the-lean-ecommerce.blogspot.com/2026/05/how-to-build-browser-based-mp4-export.html" rel="noopener noreferrer"&gt;How to Build a Browser-Based MP4 Export Pipeline with VideoFlow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://how-to.the-lean-ecommerce.com/2026/05/17/how-to-build-a-portable-json-to-video-workflow-with-videoflow/" rel="noopener noreferrer"&gt;How to Build a Portable JSON-to-Video Workflow with VideoFlow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://the-lean-ecommerce.github.io/2026/05/21/how-i-kept-video-templates-versionable-in-git-with-videoflow/" rel="noopener noreferrer"&gt;How I Kept Video Templates Versionable in Git With VideoFlow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://how-to-blog.gitlab.io/2026/05/21/how-to-build-a-video-json-pipeline-that-renders-everywhere-with-videof/" rel="noopener noreferrer"&gt;How to Build a Video JSON Pipeline That Renders Everywhere With VideoFlow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Next Step
&lt;/h2&gt;

&lt;p&gt;If you are starting from scratch, I would do it in this order: create one template, render it once in Node, then decide whether browser export or a React editor is the next requirement. The fastest way to test that path is the &lt;a href="https://videoflow.dev/playground" rel="noopener noreferrer"&gt;VideoFlow playground&lt;/a&gt; plus the &lt;a href="https://videoflow.dev/docs" rel="noopener noreferrer"&gt;docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What would you automate first?&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>node</category>
      <category>video</category>
    </item>
    <item>
      <title>How To Generate Long Form AI Videos In N8N Workflows</title>
      <dc:creator>Yassine</dc:creator>
      <pubDate>Mon, 04 May 2026 21:54:30 +0000</pubDate>
      <link>https://dev.to/ybouane/how-to-generate-long-form-ai-videos-in-n8n-workflows-28d7</link>
      <guid>https://dev.to/ybouane/how-to-generate-long-form-ai-videos-in-n8n-workflows-28d7</guid>
      <description>&lt;p&gt;If you’ve dreamed of turning a single prompt into a polished, long-form video—automatically—this guide will show you how to do it inside n8n using Scrptly. Scrptly is an AI Video Agent that turns your prompts into ads, product showcases, anime, or short films. With its native n8n integration, you can automate entire video pipelines for ecommerce, faceless YouTube channels, educational explainers, mini-docs, and more.&lt;/p&gt;

&lt;p&gt;What you’ll learn in this guide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to install and authenticate the Scrptly n8n node&lt;/li&gt;
&lt;li&gt;How to design a robust workflow for long-form AI video generation&lt;/li&gt;
&lt;li&gt;Proven prompt templates and best practices for character and scene consistency&lt;/li&gt;
&lt;li&gt;Tips for scaling, error handling, and downstream publishing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Learn more or get started: &lt;a href="https://scrptly.com/" rel="noopener noreferrer"&gt;https://scrptly.com/&lt;/a&gt;&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2F3wvl9fagyl06nmyfa2ku.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.amazonaws.com%2Fuploads%2Farticles%2F3wvl9fagyl06nmyfa2ku.png" alt="A peaceful surreal city above the clouds where translucent panels display film timelines and narration waveforms. Ethereal vines connect the panels like data flows, while soft neon pulses through the links. Warm sunset gradients, volumetric light shafts, subtle depth of field, hyperreal textures, 4k" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Scrptly + n8n for long-form AI video automation
&lt;/h2&gt;

&lt;p&gt;Scrptly’s swarm of specialized AI sub-agents—research, screenplay, character design, narration, and editing—work together to produce cohesive videos from a single prompt plus optional context images. This is especially powerful for longer content, where character and environment consistency are crucial.&lt;/p&gt;

&lt;p&gt;Key advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Long-form reliability: Excellent character and environment consistency across scenes.&lt;/li&gt;
&lt;li&gt;One-prompt simplicity: Provide a detailed prompt and optional context images—Scrptly handles the rest.&lt;/li&gt;
&lt;li&gt;Automation ready: Native n8n node, plus an API and MCP server for agent-to-agent orchestration.&lt;/li&gt;
&lt;li&gt;Scalable: Use the n8n node in scheduled, webhook-triggered, or data-driven workflows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Start here: &lt;a href="https://scrptly.com/" rel="noopener noreferrer"&gt;https://scrptly.com/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;An n8n instance (self-hosted or cloud)&lt;/li&gt;
&lt;li&gt;A Scrptly account and API key from your account page: &lt;a href="https://scrptly.com/" rel="noopener noreferrer"&gt;https://scrptly.com/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Optional but helpful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Product images or brand assets to use as context images for consistency&lt;/li&gt;
&lt;li&gt;A content calendar source (Google Sheet, CMS, database) to feed topics, scripts, or metadata&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Install the Scrptly n8n node
&lt;/h2&gt;

&lt;p&gt;1) In n8n, go to Settings &amp;gt; Community Nodes &amp;gt; Install New&lt;br&gt;
2) Search for: n8n-nodes-scrptly&lt;br&gt;
3) Click Install&lt;/p&gt;

&lt;p&gt;Source and docs: &lt;a href="https://github.com/ybouane/n8n-nodes-scrptly" rel="noopener noreferrer"&gt;https://github.com/ybouane/n8n-nodes-scrptly&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 2: Add credentials
&lt;/h2&gt;

&lt;p&gt;1) In the n8n editor, open the Credentials tab&lt;br&gt;
2) Create New Credential &amp;gt; Scrptly API&lt;br&gt;
3) Paste your Scrptly API key and Save&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 3: Blueprint for a long-form video workflow
&lt;/h2&gt;

&lt;p&gt;Here’s a robust pattern you can adapt for ecommerce, documentaries, or faceless channels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Trigger (Schedule or Webhook)&lt;/li&gt;
&lt;li&gt;Data Prep (HTTP Request or Google Sheets): Fetch topic, product details, or research notes&lt;/li&gt;
&lt;li&gt;Transform (Set or Function): Build a structured prompt and gather context image URLs&lt;/li&gt;
&lt;li&gt;Scrptly (Generate Video): Provide prompt, context images, and budget&lt;/li&gt;
&lt;li&gt;Wait/Async Handling: Either wait for completion or poll task status (if configured)&lt;/li&gt;
&lt;li&gt;Post-Process: Upload to storage, send to a CMS, or publish to social platforms&lt;/li&gt;
&lt;li&gt;Notify/Log: Send a Slack/Email notification and persist the video URL and metadata&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Step 4: Configure the Scrptly node
&lt;/h2&gt;

&lt;p&gt;In your workflow, add the Scrptly node and set these fields:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prompt: A thorough description of your video—story arc, style, length, aspect ratio, key scenes, tone, and CTA.&lt;/li&gt;
&lt;li&gt;Context Images (optional): Brand/product images, character references, or environment stills to ensure consistency.&lt;/li&gt;
&lt;li&gt;Approve Up To: Maximum token budget (default 10,000) to control complexity/cost.&lt;/li&gt;
&lt;li&gt;Wait For Completion: On to block until the video is ready; off to return immediately with a task ID for polling.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tip: For long-form content, lean on context images to lock character and environment consistency. This is where Scrptly shines.&lt;/p&gt;
&lt;h2&gt;
  
  
  Prompt templates for long-form videos
&lt;/h2&gt;

&lt;p&gt;Use these as starting points and adapt per niche.&lt;/p&gt;

&lt;p&gt;1) Ecommerce documentary-style product story (3–6 minutes)&lt;br&gt;
"Create a cinematic mini-documentary about the journey from raw material to finished product. Focus on tactile close-ups, macro textures, and transitions from workshop ambiance to studio showcase. Introduce a recurring artisan character who appears across scenes. Maintain a warm, natural color grade, steady camera, soft ambient sound design, and a calm voiceover. Integrate product close-ups based on provided context images. End with a clear CTA to learn more. Format: 16:9, YouTube-ready."&lt;/p&gt;

&lt;p&gt;2) Faceless YouTube explainer (5–10 minutes)&lt;br&gt;
"Produce a structured explainer with a hook, three chapters, and a summary. Keep on-screen text minimal and rely on smooth cutaways and simple motion graphics. Maintain consistent visual motifs and recurring background environment. Include a friendly but authoritative narration. Insert subtle section bumpers every 90 seconds. Close with a concise takeaway and CTA. Format: 16:9."&lt;/p&gt;

&lt;p&gt;3) Brand UGC hybrid ad (60–120 seconds)&lt;br&gt;
"Make a UGC-style ad featuring hands-on product interactions, natural lighting, and lifestyle b-roll. Keep character appearances consistent using context images. Alternate between handheld and locked-off shots. Include overlays that call out 3 benefits and one social proof element. End with a bold CTA and logo reveal from context images. Format: 9:16 for short-form platforms."&lt;/p&gt;
&lt;h2&gt;
  
  
  Example: Building the prompt dynamically in n8n
&lt;/h2&gt;

&lt;p&gt;Use a Set or Function node to assemble your prompt from upstream data.&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;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"How to Sleep Better in 7 Days"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"chapters"&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="s2"&gt;"Evening light and caffeine timing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Bedroom temperature and sound"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Pre-sleep routines and journaling"&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;"style"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"calming, cinematic, soft piano score, minimal text on screen"&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;"Subscribe for weekly science-backed habits"&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;Then merge into a final prompt string:&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 6–8 minute faceless explainer titled: {{title}}.
Use three chapters: {{chapters}}. Keep shots cohesive with recurring bedroom and desk environments. Maintain character and room consistency with the provided context images. Apply a calming, cinematic grade, soft piano score, clean lower thirds, and natural voiceover pacing. End with CTA: {{cta}}. Output 16:9, YouTube-ready.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pass this final string to the Scrptly node’s Prompt field, and add context image URLs from your product or brand library.&lt;/p&gt;

&lt;h2&gt;
  
  
  Handling async generation
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Recommended: Keep "Wait For Completion" on during prototyping.&lt;/li&gt;
&lt;li&gt;For high throughput: Turn it off, capture the returned task ID, then poll status or continue the pipeline when the video is ready. Use a Wait or polling loop strategy in n8n and route results to upload/publish nodes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Post-processing and publishing ideas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Store the video in cloud storage and write the URL to your CMS&lt;/li&gt;
&lt;li&gt;Auto-generate social cutdowns by triggering additional Scrptly jobs with new prompts&lt;/li&gt;
&lt;li&gt;Send Slack/Email notifications with thumbnail, title, and links&lt;/li&gt;
&lt;li&gt;Schedule platform-specific posts (YouTube, Instagram, TikTok) via their connectors&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Developer note: Using the Scrptly SDK
&lt;/h2&gt;

&lt;p&gt;If you also want programmatic control alongside n8n, install the package and set your API key:&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;install &lt;/span&gt;scrptly
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Scrptly&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;scrptly&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;Scrptly&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setApiSettings&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SCRPTLY_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explore the platform and APIs: &lt;a href="https://scrptly.com/" rel="noopener noreferrer"&gt;https://scrptly.com/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Best practices for long-form consistency
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Provide 2–5 high-quality context images for each recurring character or product.&lt;/li&gt;
&lt;li&gt;Name characters and locations in your prompt to help the agent maintain identity across scenes.&lt;/li&gt;
&lt;li&gt;Specify pacing and structure (acts, chapters, timestamps) to guide narration and editing.&lt;/li&gt;
&lt;li&gt;Define aspect ratio early (16:9 for YouTube, 9:16 for shorts) to avoid reframing.&lt;/li&gt;
&lt;li&gt;Use a steady voice style (calm, energetic, documentary) to match brand tone.&lt;/li&gt;
&lt;li&gt;Budget wisely: increase the token budget for complex multi-location stories.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Troubleshooting checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Characters drifting between scenes? Add more specific context images and reiterate names, wardrobe, and settings.&lt;/li&gt;
&lt;li&gt;Overly fast pacing? Ask for longer beats and fewer cuts per minute.&lt;/li&gt;
&lt;li&gt;Visual style mismatch? Define color grade, lighting, camera movement, and lens feel in the prompt.&lt;/li&gt;
&lt;li&gt;Running time too short/long? State a clear target duration with allowable variance.&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2F3tzq7pupuc0a3ojhydqv.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.amazonaws.com%2Fuploads%2Farticles%2F3tzq7pupuc0a3ojhydqv.png" alt="A tranquil river spirals into the horizon, lined with floating film frames that show evolving scenes from dusk to dawn. Golden guide-lights hover above each frame like milestones, misty mountains in the distance, painterly-meets-photoreal style, serene atmosphere, 4k" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Example workflow: Faceless channel episode, weekly
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Trigger: Schedule weekly at 9 AM&lt;/li&gt;
&lt;li&gt;Fetch topic: HTTP Request to your CMS or spreadsheet adapter&lt;/li&gt;
&lt;li&gt;Build prompt: Function node composes chapters, tone, CTA&lt;/li&gt;
&lt;li&gt;Scrptly node: Generate long-form 16:9 episode with context images&lt;/li&gt;
&lt;li&gt;Upload: Cloud storage node writes the file and returns URL&lt;/li&gt;
&lt;li&gt;Publish: YouTube node drafts title, description, and thumbnail&lt;/li&gt;
&lt;li&gt;Notify: Slack node posts the episode link to your team&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Ready to build your first automated long-form video?
&lt;/h2&gt;

&lt;p&gt;With Scrptly’s AI Video Agent and n8n, you can scale a consistent, on-brand video pipeline from a single prompt. Whether you’re an ecommerce marketer, educator, researcher, or entertainment creator, this stack gives you production-grade output without manual stitching.&lt;/p&gt;

&lt;p&gt;Start creating today: &lt;a href="https://scrptly.com/" rel="noopener noreferrer"&gt;https://scrptly.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;—&lt;/p&gt;

&lt;p&gt;Some images in this article were generated via AI tools and the article itself was proof-read with AI.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How To Download A Framer Site As HTML And Assets</title>
      <dc:creator>Yassine</dc:creator>
      <pubDate>Wed, 01 Apr 2026 12:20:25 +0000</pubDate>
      <link>https://dev.to/ybouane/how-to-download-a-framer-site-as-html-and-assets-hd9</link>
      <guid>https://dev.to/ybouane/how-to-download-a-framer-site-as-html-and-assets-hd9</guid>
      <description>&lt;p&gt;If you’ve ever wished you could download a Framer site as static HTML, CSS, JS, and images for fast, low-cost hosting and full control, you’re in the right place. This guide walks you through a reliable, repeatable way to go from Framer to HTML using a purpose-built Framer Exporter/Framer Downloader: ExFlow.&lt;/p&gt;

&lt;p&gt;Whether you’re optimizing performance, avoiding vendor lock-in, or finding Framer too expensive for hosting, the workflow below helps you Download a Framer Site, self-host it anywhere, and keep your interactive design intact.&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2F3iwz21zl8c3twf6amgv4.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.amazonaws.com%2Fuploads%2Farticles%2F3iwz21zl8c3twf6amgv4.png" alt="4k tranquil surreal coastline at blue hour where luminous origami pages labeled HTML, CSS, JS drift from a minimalist glass tower into tidy folders on the sand; bioluminescent lines connect the tower to the folders, symbolizing an export pipeline; hyperreal soft fog, pastel blues and lilacs, cinematic wide-angle, reflective wet sand with subtle grid patterns, peaceful and futuristic aesthetic." width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Why export a Framer site to HTML and assets?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Self-host Framer site to slash recurring hosting costs and scale on your terms.&lt;/li&gt;
&lt;li&gt;Gain flexibility to integrate with CDNs, CI/CD, or security tooling.&lt;/li&gt;
&lt;li&gt;Improve performance and control caching at the edge.&lt;/li&gt;
&lt;li&gt;Create secure, versioned backups of your live website.&lt;/li&gt;
&lt;li&gt;Explore a Framer Alternative workflow when you need static builds.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What you’ll need&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A published Framer site URL.&lt;/li&gt;
&lt;li&gt;A desktop environment to unzip and preview your exported site.&lt;/li&gt;
&lt;li&gt;Optional: credentials for your target host (FTP, S3, or Git platform).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The fastest path: Use ExFlow (Framer Exporter)&lt;br&gt;
ExFlow is a streamlined Framer to HTML exporter and downloader that turns a live site into downloadable static files—including CSS, JS, images, and multi-page structures—so you can deploy anywhere.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Try ExFlow: &lt;a href="https://exflow.site" rel="noopener noreferrer"&gt;https://exflow.site&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Key features relevant to Framer users:

&lt;ul&gt;
&lt;li&gt;Export CSS, JS, images/media&lt;/li&gt;
&lt;li&gt;Export all pages as .html&lt;/li&gt;
&lt;li&gt;Remove the “Made with” badge&lt;/li&gt;
&lt;li&gt;Add custom script.js and style.css&lt;/li&gt;
&lt;li&gt;Optional sync to Git, S3, or FTP&lt;/li&gt;
&lt;li&gt;Optional built-in hosting with custom domain support&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2F7x61zic6rm0jt9mt3cgn.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.amazonaws.com%2Fuploads%2Farticles%2F7x61zic6rm0jt9mt3cgn.png" alt="ExFlow Banner" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step-by-step: How to Download a Framer site as HTML and assets&lt;br&gt;
1) Open ExFlow&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Visit &lt;a href="https://exflow.site" rel="noopener noreferrer"&gt;https://exflow.site&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;You can start right away—no complex setup.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2) Enter your Framer site URL&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Paste the full URL of your published Framer site (e.g., &lt;a href="https://yourdomain.com" rel="noopener noreferrer"&gt;https://yourdomain.com&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Tip: Use the production domain you control for the most complete export.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;3) Configure export settings&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Export CSS files: Ensure styles are captured in separate, cacheable files.&lt;/li&gt;
&lt;li&gt;Export JS files: Include site interactions and scripts required by your pages.&lt;/li&gt;
&lt;li&gt;Export images/media: Pull down all media used across pages and components.&lt;/li&gt;
&lt;li&gt;Export all pages: Capture multi-page structures, including CMS-driven content where public.&lt;/li&gt;
&lt;li&gt;Pages as .html: Make sure each page is saved as a standalone .html file.&lt;/li&gt;
&lt;li&gt;Remove “Made with” badge: Toggle to remove platform badges from your static build.&lt;/li&gt;
&lt;li&gt;Add custom script.css / style.css: Inject additional logic and styling at build time.&lt;/li&gt;
&lt;li&gt;Optional Sync:

&lt;ul&gt;
&lt;li&gt;Git Sync: Push directly to a repo for CI/CD (e.g., GitHub Pages).&lt;/li&gt;
&lt;li&gt;S3 Sync: Auto-deploy to Amazon S3 for static hosting with a CDN.&lt;/li&gt;
&lt;li&gt;FTP Sync: Upload to your classic shared or VPS host.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Security note: When using Sync features, you’ll be asked for credentials (FTP/S3/Git). Only provide credentials for accounts you control and rotate them regularly. Treat them as sensitive information.&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2Fikf7gysysivaxx28kxnm.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.amazonaws.com%2Fuploads%2Farticles%2Fikf7gysysivaxx28kxnm.png" alt="Screenshot of ExFlow showing the configuration of an export" width="800" height="1223"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4) Start the export&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click to generate your static bundle. ExFlow will crawl your site, collect assets, and package everything into a neat zip.&lt;/li&gt;
&lt;li&gt;Larger sites may take longer—keep the tab open during processing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;5) Download the zip (or auto-sync)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Download the zip to your computer, or let ExFlow push it via Git/S3/FTP if you enabled Sync.&lt;/li&gt;
&lt;li&gt;You now have a fully portable, static version of your Framer site.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;6) Verify locally&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unzip the package.&lt;/li&gt;
&lt;li&gt;Open index.html in your browser.&lt;/li&gt;
&lt;li&gt;Click around to ensure navigation, animations, and assets load correctly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Where to host after exporting (3 quick options)&lt;br&gt;
1) Host on ExFlow’s servers&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The simplest path: Choose Hosting in ExFlow and link your custom domain.&lt;/li&gt;
&lt;li&gt;You’ll get unlimited bandwidth, automated updates via re-exports, and a single place to manage your static site.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2) Host on Amazon S3 (with or without a CDN)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create an S3 bucket and enable static website hosting.&lt;/li&gt;
&lt;li&gt;Use ExFlow’s S3 Sync to push files directly.&lt;/li&gt;
&lt;li&gt;Map your domain via Route 53 or your DNS provider; optionally add CloudFront for global caching.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;3) Host via Git + static site services&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sync to a Git repository using ExFlow’s Git option.&lt;/li&gt;
&lt;li&gt;Deploy with GitHub Pages, Netlify, or a similar static host.&lt;/li&gt;
&lt;li&gt;Benefit from rollbacks, previews, and CI-based deployments.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pro tips for a smooth Framer to HTML export&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clean URLs vs. .html: With static hosting, /about may become /about.html unless you configure rewrite rules. Many hosts let you keep clean URLs via redirects.&lt;/li&gt;
&lt;li&gt;Forms and dynamic features: Native static exports don’t process server-side forms or search. Use serverless functions or third-party form handlers as needed.&lt;/li&gt;
&lt;li&gt;Fonts and third-party embeds: Confirm licensing and embed codes still load over HTTPS from their providers.&lt;/li&gt;
&lt;li&gt;Relative vs. absolute paths: Keep assets relative where possible for portability across environments.&lt;/li&gt;
&lt;li&gt;Password-protected pages: Only export content you own or have rights to access. Provide passwords to ExFlow only when authorized and necessary.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Common questions (FAQs)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Will animations and interactions work after export? Most client-side animations and interactions that Framer ships as JS/CSS continue to work. Server-side or proprietary features that depend on the platform runtime may require adjustments.&lt;/li&gt;
&lt;li&gt;Can I keep my CMS-driven pages? Publicly accessible CMS content can be captured as static HTML. Dynamic features that rely on a live backend may need client-side data fetching or a build pipeline for updates.&lt;/li&gt;
&lt;li&gt;Is this a good Framer Alternative? Exporting gives you a static alternative for sites that don’t need live backend features—ideal when you want speed, portability, and total control.&lt;/li&gt;
&lt;li&gt;What if Framer hosting is too expensive? Exporting and self-hosting can be significantly cheaper, especially at scale. With ExFlow, you can move from Framer to HTML and host wherever it’s most cost-effective.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why ExFlow over generic site downloaders?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Purpose-built for modern site builders: Unlike generic crawlers (which often break animations or miss dynamic content), ExFlow handles today’s front-end stacks more reliably.&lt;/li&gt;
&lt;li&gt;Full-asset capture: HTML, CSS, JS, images/media, and multi-page structures in one flow.&lt;/li&gt;
&lt;li&gt;Seamless deployment: Built-in Hosting and direct Sync to Git, S3, and FTP.&lt;/li&gt;
&lt;li&gt;Badge removal and custom injects: Ship a clean, branded site with your own scripts and styles.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ethical and legal reminder&lt;br&gt;
Only export and self-host assets for sites you own or have explicit permission to export. Review your platform’s terms of service and respect licensing for fonts, images, and third-party scripts.&lt;/p&gt;

&lt;p&gt;Get started now&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Turn your live project into a portable static site in minutes: &lt;a href="https://exflow.site" rel="noopener noreferrer"&gt;https://exflow.site&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Explore a Framer Downloader and Framer Exporter workflow that keeps your creativity intact while delivering the control and savings you need.&lt;/li&gt;
&lt;li&gt;It’s the straightforward way to Download a Framer Site, go from Framer to HTML, and Self-host your Framer site—without compromises.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some images in this article were generated via AI tools and the article itself was proof-read with AI.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
