<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Jan – IMG.LY Blog</title><description>Posts by Jan on the IMG.LY blog.</description><link>https://img.ly/blog/author/jan/</link><language>en-us</language><image><url>https://img.ly/apple-touch-icon.png</url><title>Jan – IMG.LY Blog</title><link>https://img.ly/blog/author/jan/</link></image><atom:link href="https://img.ly/blog/author/jan/rss.xml" rel="self" type="application/rss+xml"/><generator>Astro</generator><lastBuildDate>Wed, 10 Jun 2026 12:21:42 GMT</lastBuildDate><ttl>60</ttl><item><title>How 600+ Teams Shipped Creative Editing in 14 Days</title><link>https://img.ly/blog/imgly-impact-report/</link><guid isPermaLink="true">https://img.ly/blog/imgly-impact-report/</guid><description>A data report based on 600+ customers, 28 structured customer interviews, and a self-reported customer survey.</description><pubDate>Tue, 28 Apr 2026 21:15:17 GMT</pubDate><content:encoded>&lt;h2 id=&quot;the-imgly-impact-report&quot;&gt;The IMG.LY Impact Report&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Based on a self-reported customer survey, 28 structured customer interviews, and IMG.LY’s published customer case studies. External benchmarks cited in context.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;600+ companies&lt;/strong&gt; from startups, over Fortune 500s to government organizations run creative editing on IMG.LY, collectively producing &lt;strong&gt;500 million creations every month&lt;/strong&gt;. The median customer goes from first SDK access to a &lt;strong&gt;working prototype in 2 days&lt;/strong&gt; and a &lt;strong&gt;production-ready feature shipped inside a single 14-day sprint&lt;/strong&gt;. Those self-reported medians run roughly &lt;strong&gt;13× faster&lt;/strong&gt; than the 6-month industry baseline for building an equivalent editor in-house, and around 6× faster than stitching together an open-source toolkit.&lt;/p&gt;
&lt;p&gt;The time-to-market number is the entry ticket. What those 600+ customers do &lt;em&gt;after&lt;/em&gt; shipping, how the editor changes their pricing, funnel, team velocity, and competitive position is what this report is about.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Methodology note.&lt;/strong&gt; Time-to-prototype and time-to-MVP figures are &lt;strong&gt;self-reported by IMG.LY customers&lt;/strong&gt; in a recent customer survey. All named customer outcomes are drawn from &lt;a href=&quot;https://img.ly/case-studies&quot;&gt;IMG.LY’s published case studies&lt;/a&gt;, where the customer has reviewed and approved the specific figures cited. Quantitative ranges and anonymous quotes come from 30 structured customer interviews (2024–2026); individual customers are not identified.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;what-customers-unlock&quot;&gt;What Customers Unlock&lt;/h2&gt;
&lt;h3 id=&quot;1-ship-in-days-not-quarters&quot;&gt;1. Ship in days, not quarters&lt;/h3&gt;
&lt;p&gt;A working prototype takes an average of two days, a production feature often just a single sprint. Customer interviews put the alternative, an in-house build, at &lt;strong&gt;6–12 months with 2–3 senior developers&lt;/strong&gt;, consistent with the cost bands documented in IMG.LY’s &lt;a href=&quot;https://img.ly/blog/strategic-guide-to-creative-editing-when-to-build-when-to-buy/&quot;&gt;Build vs. Buy guide&lt;/a&gt; and independently with the &lt;a href=&quot;https://thestory.is/en/journal/chaos-report/&quot;&gt;Standish Group CHAOS Report&lt;/a&gt;, which finds only &lt;strong&gt;31% of software projects succeed&lt;/strong&gt; on time, on budget, and with full scope… and under &lt;strong&gt;10%&lt;/strong&gt; for large projects.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://img.ly/case-studies/plai&quot;&gt;Plai&lt;/a&gt; went live in about a month where their founder had estimated “months and months” for an in-house build. &lt;a href=&quot;https://img.ly/case-studies/optimizely&quot;&gt;Optimizely&lt;/a&gt;, serving 1,000+ enterprise customers, described the integration as &lt;em&gt;“one of the quickest projects we’ve worked on.”&lt;/em&gt;&lt;/p&gt;
&lt;div class=&quot;imgly-chart imgly-chart--time&quot;&gt;&lt;p class=&quot;imgly-eyebrow&quot;&gt;Time to a production-ready MVP&lt;/p&gt;&lt;h3 class=&quot;imgly-title&quot;&gt;14 days vs. 6 months: how long it takes to ship creative editing&lt;/h3&gt;&lt;p class=&quot;imgly-subtitle&quot;&gt;Median time from project start to a production-ready creative editor, by integration path.&lt;/p&gt;&lt;div class=&quot;imgly-canvas-wrap&quot;&gt;&lt;canvas id=&quot;imgly-chart-time-canvas&quot;&gt;&lt;/canvas&gt;&lt;/div&gt;&lt;p class=&quot;imgly-footnote&quot;&gt;&lt;strong&gt;Sources.&lt;/strong&gt; CE.SDK figure (14 days) is the self-reported median from an IMG.LY customer survey; individual results vary with scope and team. In-house (180 days) and open-source (90 days) figures are midpoints of the ranges documented in IMG.LY&apos;s &lt;em&gt;Build vs. Buy guide&lt;/em&gt;, cross-referenced with customer interviews (N=28).&lt;/p&gt;&lt;/div&gt;
&lt;h3 id=&quot;2-open-new-pricing-and-market-tiers&quot;&gt;2. Open new pricing and market tiers&lt;/h3&gt;
&lt;p&gt;Embedding an editor changes the customer’s &lt;em&gt;own&lt;/em&gt; unit economics. It unlocks a self-serve tier where users previously needed a designer in the loop, lowers the price floor, and opens markets where manual production was the binding constraint.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://img.ly/case-studies/plai&quot;&gt;Plai&lt;/a&gt; doubled annual revenue and now generates &lt;strong&gt;30,000+ ad creatives monthly&lt;/strong&gt; on the platform. &lt;a href=&quot;https://img.ly/case-studies/postbuddy&quot;&gt;Postbuddy&lt;/a&gt; measured a &lt;strong&gt;4× A/B-test improvement&lt;/strong&gt; after moving direct-mail creation in-app, a lift that funded expansion into Sweden and Norway. In an anonymized interview, one customer described the change plainly: &lt;em&gt;“We can lower our prices for the base product, it’s cheaper for clients who can use self-service.”&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;3-lift-your-own-conversion-and-engagement&quot;&gt;3. Lift your own conversion and engagement&lt;/h3&gt;
&lt;p&gt;In-context editing keeps users inside the product, shortens time-to-value, and removes the “export to Photoshop” detour that quietly leaks trials. The effect shows up directly in sign-up and trial-to-paid numbers.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://img.ly/case-studies/omneky&quot;&gt;Omneky&lt;/a&gt; recorded a &lt;strong&gt;10× month-over-month increase in new sign-ups&lt;/strong&gt; after embedding CE.SDK. In a separate interview, one customer described &lt;strong&gt;400–500 organic trials per month with roughly $65–70K of opportunity evaporating&lt;/strong&gt; at an 8% trial-to-paid rate tied largely to editor friction, the number that made their own build-vs-buy case close itself.&lt;/p&gt;
&lt;h3 id=&quot;4-free-your-design-marketing-and-support-teams&quot;&gt;4. Free your design, marketing, and support teams&lt;/h3&gt;
&lt;p&gt;The cost saved by an editor isn’t only on the engineering line. It shows up in designer queues that disappear, support tickets that drop, and marketing teams that stop waiting on the bottleneck.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://img.ly/case-studies/imagebank&quot;&gt;ImageBank X&lt;/a&gt; compressed a recurring asset-prep task from &lt;strong&gt;15 minutes to 2 minutes — an 87% reduction per task&lt;/strong&gt;. &lt;a href=&quot;https://img.ly/case-studies/halio&quot;&gt;Halio.ai&lt;/a&gt; enables financial advisors to produce &lt;strong&gt;30 days of branded content in 30 minutes&lt;/strong&gt;. Interview customers describe the same pattern in plainer language: &lt;em&gt;“happier marketing teams,”&lt;/em&gt; and, of the post-launch support burden, &lt;em&gt;“the things the sales team had to deal with all day are just gone.”&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;5-compound-instead-of-freeze&quot;&gt;5. Compound instead of freeze&lt;/h3&gt;
&lt;p&gt;This is where the engineering-economics story earns its keep. An in-house editor is a snapshot: the team ships what’s feasible in the window, then expends time and money just to keep it alive. Atlassian’s &lt;a href=&quot;https://www.atlassian.com/software/compass/resources/state-of-developer-2024&quot;&gt;2024 State of Developer Experience Report&lt;/a&gt; (N=2,100+) found &lt;strong&gt;69% of developers lose eight or more hours per week to inefficiencies — about 20% of their time — with technical debt as the primary cause&lt;/strong&gt;. Stack Overflow’s &lt;a href=&quot;https://survey.stackoverflow.co/2024/&quot;&gt;2024 Developer Survey&lt;/a&gt; (N=65,437) independently found &lt;strong&gt;62% of developers rank technical debt as their single biggest frustration&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;CE.SDK customers don’t pay that tax. New capabilities such as AI background removal, text-to-image, object add/remove, style transfer arrive as modular plugins, not re-architectures. One interviewed customer, who had spent a year building their own editor before switching, described maintaining it as &lt;em&gt;“a full-time job and our main product isn’t editing.”&lt;/em&gt; Every month an in-house team spends on maintenance is a month IMG.LY customers get new capabilities shipped &lt;em&gt;to&lt;/em&gt; them. The feature gap widens, not narrows.&lt;/p&gt;
&lt;div class=&quot;imgly-chart imgly-chart--compound&quot;&gt;&lt;p class=&quot;imgly-eyebrow&quot;&gt;Editor capability over 24 months&lt;/p&gt;&lt;h3 class=&quot;imgly-title&quot;&gt;In-house builds freeze. CE.SDK customers compound.&lt;/h3&gt;&lt;p class=&quot;imgly-subtitle&quot;&gt;An in-house editor ships at the snapshot the team can afford and then plateaus under the weight of maintenance. CE.SDK customers absorb new capabilities — AI background removal, text-to-image, object remove, automatic subtitles — as modular plugins each quarter.&lt;/p&gt;&lt;div class=&quot;imgly-legend&quot;&gt;&lt;div class=&quot;imgly-legend-item&quot;&gt;&lt;span class=&quot;imgly-legend-line&quot;&gt;&lt;/span&gt;Build in-house&lt;/div&gt;&lt;div class=&quot;imgly-legend-item&quot;&gt;&lt;span class=&quot;imgly-legend-line&quot;&gt;&lt;/span&gt;CE.SDK customer&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;imgly-canvas-wrap&quot;&gt;&lt;canvas id=&quot;imgly-chart-compound-canvas&quot;&gt;&lt;/canvas&gt;&lt;/div&gt;&lt;p class=&quot;imgly-footnote&quot;&gt;&lt;strong&gt;Illustrative.&lt;/strong&gt; The CE.SDK trajectory reflects the cadence of major capability releases shipped to customers without re-architecture. The in-house trajectory reflects the typical build-then-maintain pattern documented in customer interviews and corroborated by the &lt;a href=&quot;https://www.atlassian.com/software/compass/resources/state-of-developer-2024&quot;&gt;Atlassian 2024 State of Developer Experience Report&lt;/a&gt; (69% of developers lose 8+ hours per week to inefficiencies, primarily technical debt).&lt;/p&gt;&lt;/div&gt;
&lt;h3 id=&quot;6-become-deal-eligible-and-privacy-credible&quot;&gt;6. Become deal-eligible and privacy-credible&lt;/h3&gt;
&lt;p&gt;Some categories require an editor to win the deal at all. One interviewed customer received a written RFP rejection that read: &lt;em&gt;“the other provider has an editor, you don’t.”&lt;/em&gt; That single moment approved their budget to buy.&lt;/p&gt;
&lt;p&gt;For regulated buyers, fintech, healthcare, government, enterprise, client-side processing is a procurement requirement, not a feature. CE.SDK’s default client-side execution means customer data never leaves the browser, which makes the editor defensible in categories where server-side alternatives are blocked.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Swiss Post&lt;/strong&gt; producing &lt;strong&gt;1 million+ personalized postcards annually&lt;/strong&gt; on the platform described CE.SDK as &lt;em&gt;“the only solution allowing a specialized, on-brand UI.”&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-economics-in-one-table&quot;&gt;The economics, in one table&lt;/h2&gt;
&lt;p&gt;The cost gap between building and buying isn’t just wider on day one, it widens over time. Every month an in-house team spends maintaining the editor is a month IMG.LY customers compound new capability on top of what’s already shipped. The table below summarizes the 3-year picture. For the full cost methodology, including the open-source path and the senior-developer rate assumptions, see IMG.LY’s &lt;a href=&quot;https://img.ly/blog/strategic-guide-to-creative-editing-when-to-build-when-to-buy/&quot;&gt;Build vs. Buy guide&lt;/a&gt;.&lt;/p&gt;





















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;Build In-House&lt;/th&gt;&lt;th&gt;Open Source + Glue&lt;/th&gt;&lt;th&gt;CE.SDK&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Working prototype&lt;/td&gt;&lt;td&gt;2–6 months&lt;/td&gt;&lt;td&gt;1–2 months&lt;/td&gt;&lt;td&gt;&lt;strong&gt;2 days&lt;/strong&gt; (self-reported median)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Production MVP&lt;/td&gt;&lt;td&gt;6–12+ months&lt;/td&gt;&lt;td&gt;3–6 months&lt;/td&gt;&lt;td&gt;&lt;strong&gt;14 days&lt;/strong&gt; (self-reported median)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Team required&lt;/td&gt;&lt;td&gt;3–5 senior developers&lt;/td&gt;&lt;td&gt;1–2 senior developers&lt;/td&gt;&lt;td&gt;1 developer for integration&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Year-1 development cost&lt;/td&gt;&lt;td&gt;$100K–$500K+&lt;/td&gt;&lt;td&gt;$150K–$400K&lt;/td&gt;&lt;td&gt;License + integration&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Annual maintenance&lt;/td&gt;&lt;td&gt;$75K–$125K (15–25%)&lt;/td&gt;&lt;td&gt;$50K–$100K&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3-year TCO&lt;/td&gt;&lt;td&gt;$525K–$1.4M+&lt;/td&gt;&lt;td&gt;$300K–$700K+&lt;/td&gt;&lt;td&gt;Fraction of build cost&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cross-platform parity&lt;/td&gt;&lt;td&gt;Build per platform&lt;/td&gt;&lt;td&gt;Typically web-only&lt;/td&gt;&lt;td&gt;Web, iOS, Android, Desktop, Server&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;em&gt;Source for build and open-source cost bands: IMG.LY’s&lt;/em&gt; &lt;a href=&quot;https://img.ly/blog/strategic-guide-to-creative-editing-when-to-build-when-to-buy/&quot;&gt;&lt;em&gt;Strategic Guide to Creative Editing: When to Build, When to Buy&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. Cross-referenced against&lt;/em&gt; &lt;a href=&quot;https://www.bls.gov/ooh/computer-and-information-technology/software-developers.htm&quot;&gt;&lt;em&gt;BLS May 2024 wage data&lt;/em&gt;&lt;/a&gt; &lt;em&gt;- median software-developer wage $133,080, 90th percentile $211,450 - and&lt;/em&gt; &lt;a href=&quot;https://pegotec.net/software-maintenance-cost-percentage-2026-industry-benchmarks/&quot;&gt;&lt;em&gt;aggregated maintenance benchmarks (Pegotec, 2026)&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. Time-to-prototype and time-to-MVP for CE.SDK are &lt;strong&gt;self-reported medians from an IMG.LY customer survey&lt;/strong&gt;; individual results vary with scope, team, and platform target.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;when-building-in-house-still-makes-sense&quot;&gt;When building in-house still makes sense&lt;/h2&gt;
&lt;p&gt;This report defends one conclusion, so here is the honest counterweight.&lt;br&gt;
Build your own creative editor if &lt;strong&gt;all&lt;/strong&gt; of the following are true:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Creative editing is your core product, and your unique IP lives inside the editing experience itself.&lt;/li&gt;
&lt;li&gt;Your requirements are genuinely non-standard, i.e. no off-the-shelf SDK supports your rendering or interaction model.&lt;/li&gt;
&lt;li&gt;You have surplus senior engineering capacity that isn’t needed on differentiated work elsewhere.&lt;/li&gt;
&lt;li&gt;Time-to-market is not competitive in your category, nobody else is shipping similar capability.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If any one of these is false, the economics above generally make buying both cheaper and faster.&lt;/p&gt;
&lt;h2 id=&quot;methodology&quot;&gt;Methodology&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Time-to-prototype and time-to-MVP&lt;/strong&gt; (2 days, 14 days) are self-reported medians from an IMG.LY customer survey. Individual results vary with team experience, integration scope, and platform target.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In-house and open-source timeline ranges&lt;/strong&gt; are drawn from 28 structured customer interviews conducted between 2024 and 2026, cross-referenced against IMG.LY’s &lt;a href=&quot;https://img.ly/blog/strategic-guide-to-creative-editing-when-to-build-when-to-buy/&quot;&gt;Build vs. Buy guide&lt;/a&gt;. Interview customers are not identified; quantitative ranges reflect the distribution of answers across the set.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Named customer outcomes&lt;/strong&gt; (Plai, Omneky, Optimizely, Swiss Post, ImageBank X, Halio.ai, Postbuddy) come from &lt;a href=&quot;https://img.ly/case-studies&quot;&gt;IMG.LY’s published case studies&lt;/a&gt;, where the customer has reviewed and approved each cited figure.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;External benchmarks&lt;/strong&gt; are drawn from:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.bls.gov/ooh/computer-and-information-technology/software-developers.htm&quot;&gt;U.S. Bureau of Labor Statistics, Occupational Outlook Handbook, Software Developers (May 2024)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.atlassian.com/software/compass/resources/state-of-developer-2024&quot;&gt;Atlassian State of Developer Experience Report (2024)&lt;/a&gt; (N = 2,100+ developers and engineering leaders, in partnership with DX and Wakefield Research)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://survey.stackoverflow.co/2024/&quot;&gt;Stack Overflow 2024 Developer Survey&lt;/a&gt; (N = 65,437 developers across 185 countries)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://thestory.is/en/journal/chaos-report/&quot;&gt;Standish Group CHAOS Report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Aggregated software-maintenance benchmarks from Gartner, IEEE, and industry practitioners, summarized in &lt;a href=&quot;https://pegotec.net/software-maintenance-cost-percentage-2026-industry-benchmarks/&quot;&gt;Pegotec (2026)&lt;/a&gt; and &lt;a href=&quot;https://ventionteams.com/enterprise/software-maintenance-costs&quot;&gt;Vention Teams&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;frequently-asked-questions&quot;&gt;Frequently asked questions&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;How long does it take to integrate CE.SDK?&lt;/strong&gt;&lt;br&gt;
The median customer in our survey reports a working prototype within &lt;strong&gt;2 days&lt;/strong&gt; and a production-ready MVP within a single &lt;strong&gt;14-day sprint&lt;/strong&gt;. Self-reported; varies with scope and team.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What do IMG.LY customers unlock beyond faster shipping?&lt;/strong&gt;&lt;br&gt;
Five additional outcomes: new pricing and market tiers enabled by self-serve editing; lifted trial-to-paid and sign-up conversion; reduced design, marketing, and support load; a roadmap that compounds instead of freezes as AI features ship as plugins; and deal eligibility in procurement categories that require an embedded editor or client-side processing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Can AI coding agents like Claude Code accelerate CE.SDK integration further?&lt;/strong&gt;&lt;br&gt;
Yes. IMG.LY publishes a set of specialized &lt;a href=&quot;https://github.com/imgly/agent-skills&quot;&gt;CE.SDK Agent Skills&lt;/a&gt; portable knowledge packs that give AI coding assistants expert-level understanding of the SDK before they write a line of code. The skills cover framework-specific documentation lookup (React, Vue, Svelte, Angular, Next.js, Nuxt.js, SvelteKit, Electron, Node.js, Vanilla JS), feature implementation (&lt;code&gt;/cesdk:build&lt;/code&gt;), conceptual explanations (&lt;code&gt;/cesdk:explain&lt;/code&gt;), and a builder agent that autonomously scaffolds complete CE.SDK applications from a natural-language description.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How much does it cost to build a creative editor in-house?&lt;/strong&gt;&lt;br&gt;
Published industry benchmarks and customer-reported estimates converge on &lt;strong&gt;$100K–$500K+ initial development&lt;/strong&gt; over &lt;strong&gt;6–12 months&lt;/strong&gt; with &lt;strong&gt;3–5 senior developers&lt;/strong&gt;, plus &lt;strong&gt;15–25% of that cost annually in maintenance&lt;/strong&gt;. 3-year TCO typically lands between &lt;strong&gt;$525K and $1.4M&lt;/strong&gt;. See our &lt;a href=&quot;https://img.ly/blog/strategic-guide-to-creative-editing-when-to-build-when-to-buy/&quot;&gt;Build vs. Buy guide&lt;/a&gt; for full methodology.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What percentage of developer time is spent on maintenance?&lt;/strong&gt;&lt;br&gt;
Atlassian’s 2024 &lt;em&gt;State of Developer Experience Report&lt;/em&gt; found &lt;strong&gt;69% of developers lose 8+ hours per week to inefficiencies, about 20% of their time, primarily to technical debt&lt;/strong&gt;. Gartner reports that &lt;strong&gt;55–80% of corporate IT budgets&lt;/strong&gt; go to maintaining existing systems.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What is the failure rate of custom software projects?&lt;/strong&gt;&lt;br&gt;
The Standish Group CHAOS research finds only &lt;strong&gt;31% of software projects succeed&lt;/strong&gt; (on time, on budget, full scope); &lt;strong&gt;50% are challenged&lt;/strong&gt;, &lt;strong&gt;19% cancelled outright&lt;/strong&gt;. For large projects specifically, success rates fall &lt;strong&gt;below 10%&lt;/strong&gt;.&lt;/p&gt;
&lt;div class=&quot;imgly-chart imgly-chart--success&quot;&gt;&lt;p class=&quot;imgly-eyebrow&quot;&gt;Custom software project outcomes&lt;/p&gt;&lt;h3 class=&quot;imgly-title&quot;&gt;Only 31% of custom software projects succeed&lt;/h3&gt;&lt;p class=&quot;imgly-subtitle&quot;&gt;Across tens of thousands of tracked projects, the Standish Group CHAOS research finds the majority of custom software is late, over budget, reduced in scope, or cancelled outright.&lt;/p&gt;&lt;div class=&quot;imgly-grid&quot;&gt;&lt;div class=&quot;imgly-canvas-wrap&quot;&gt;&lt;canvas id=&quot;imgly-chart-success-canvas&quot;&gt;&lt;/canvas&gt;&lt;/div&gt;&lt;div class=&quot;imgly-legend&quot;&gt;&lt;div class=&quot;imgly-legend-row&quot;&gt;&lt;span class=&quot;imgly-legend-swatch&quot;&gt;&lt;/span&gt;&lt;div&gt;&lt;div class=&quot;imgly-legend-pct&quot;&gt;31%&lt;/div&gt;&lt;div class=&quot;imgly-legend-label&quot;&gt;Successful&lt;/div&gt;&lt;div class=&quot;imgly-legend-detail&quot;&gt;On time, on budget, with full scope.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;imgly-legend-row&quot;&gt;&lt;span class=&quot;imgly-legend-swatch&quot;&gt;&lt;/span&gt;&lt;div&gt;&lt;div class=&quot;imgly-legend-pct&quot;&gt;50%&lt;/div&gt;&lt;div class=&quot;imgly-legend-label&quot;&gt;Challenged&lt;/div&gt;&lt;div class=&quot;imgly-legend-detail&quot;&gt;Delivered late, over budget, or with reduced features.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;imgly-legend-row&quot;&gt;&lt;span class=&quot;imgly-legend-swatch&quot;&gt;&lt;/span&gt;&lt;div&gt;&lt;div class=&quot;imgly-legend-pct&quot;&gt;19%&lt;/div&gt;&lt;div class=&quot;imgly-legend-label&quot;&gt;Failed&lt;/div&gt;&lt;div class=&quot;imgly-legend-detail&quot;&gt;Cancelled before delivery.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;imgly-callout&quot;&gt;&lt;p class=&quot;imgly-callout-headline&quot;&gt;~25% of IMG.LY customers failed at building a creative editor in-house&lt;/p&gt;&lt;p class=&quot;imgly-callout-body&quot;&gt;In our customer interviews (N=28), roughly one in four customers had attempted to build a creative editor in-house — or stitch one together from open-source — and abandoned the attempt before adopting CE.SDK.&lt;/p&gt;&lt;/div&gt;&lt;p class=&quot;imgly-footnote&quot;&gt;&lt;strong&gt;Source.&lt;/strong&gt; Standish Group CHAOS Report. For large projects specifically — the size band most in-house creative-editor builds fall into — success rates drop below &lt;strong&gt;10%&lt;/strong&gt;. IMG.LY customer figure is drawn from 28 structured customer interviews conducted between 2024 and 2026.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;How many companies use IMG.LY CE.SDK?&lt;br&gt;
600+ customers&lt;/strong&gt; including startups, Fortune 500 companies, and government organizations collectively produce &lt;strong&gt;500 million creations per month&lt;/strong&gt; on the platform.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What platforms does CE.SDK support?&lt;/strong&gt;&lt;br&gt;
Web (React, Angular, Vue, Svelte, Next.js, Nuxt.js, SvelteKit, Vanilla JavaScript, Electron), Mobile (iOS/Swift, Android/Kotlin, React Native, Flutter, Ionic, Cordova), and Server (Node.js headless mode for batch automation).&lt;/p&gt;</content:encoded><dc:creator>Jan</dc:creator><media:content url="https://blog.img.ly/2026/04/imgly-data-report.jpg" medium="image"/><category>Creative Editing</category></item><item><title>Building a CapCut-Like Video Editor with CE.SDK and AI</title><link>https://img.ly/blog/capcut-like-video-editor-web-react/</link><guid isPermaLink="true">https://img.ly/blog/capcut-like-video-editor-web-react/</guid><description>How to built a browser-based video editor with a dark CapCut-inspired UI, multi-track timeline, and AI-powered content generation... in under 200 lines of code.</description><pubDate>Thu, 26 Feb 2026 22:50:34 GMT</pubDate><content:encoded>&lt;h3 id=&quot;build-this-with-ai-in-minutes&quot;&gt;&lt;strong&gt;Build this with AI in minutes&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;This tutorial is a great way to understand how CE.SDK works under the hood. But if you just want to get to the result, you can build this entire editor using &lt;a href=&quot;https://img.ly/docs/cesdk/react/get-started/agent-skills-f7g8h9/&quot;&gt;IMG.LY Agent Skills&lt;/a&gt;, no manual setup required.&lt;/p&gt;
&lt;p&gt;Install the skills, then run:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;/cesdk:build Build a CapCut-like video editor with a dark theme, multi-track timeline, AI video/image/audio generation, background removal, and MP4 export.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Want to understand a specific concept in depth? Use &lt;code&gt;/cesdk:explain&lt;/code&gt; — for example:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;/cesdk:explain How does the video timeline and block hierarchy work?&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;CapCut has set the standard for accessible video editing. Its dark UI, intuitive timeline, and AI-powered features make it feel like a professional tool that anyone can use. But what if you could build something similar embedded directly in your own web application in minutes? Yes, minutes!&lt;/p&gt;
&lt;p&gt;In this tutorial, we’ll walk through how we built a CapCut-like video editor using &lt;a href=&quot;https://img.ly&quot;&gt;IMG.LY’s CreativeEditor SDK (CE.SDK)&lt;/a&gt; for React. The finished editor includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;multi-track timeline&lt;/strong&gt; for video, audio, text, and captions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Trim, split, and join&lt;/strong&gt; operations on video clips&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;CapCut-inspired dark theme&lt;/strong&gt; built with CSS custom properties&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI video generation&lt;/strong&gt; (text-to-video, image-to-video) via Minimax, Kling, and Pixverse&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI image generation&lt;/strong&gt; (text-to-image, image editing) via RecraftV3, IdeogramV3, and GPT Image&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI audio generation&lt;/strong&gt; (text-to-speech, sound effects) via ElevenLabs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI text generation&lt;/strong&gt; (copywriting, translation) via Anthropic Claude&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Background removal&lt;/strong&gt; — client-side, powered by WebAssembly/WebGPU&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MP4 export&lt;/strong&gt; directly from the browser&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The entire editor is a single React component with roughly 180 lines of JavaScript and 100 lines of CSS.&lt;/p&gt;
&lt;h2 id=&quot;architecture-overview&quot;&gt;Architecture Overview&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;App architecture&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 2000px) 2000px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;2000&quot; height=&quot;1969&quot; src=&quot;https://img.ly/_astro/Gemini_Generated_Image_6celpb6celpb6cel_1EicqM.webp&quot; srcset=&quot;/_astro/Gemini_Generated_Image_6celpb6celpb6cel_15nkQs.webp 640w, /_astro/Gemini_Generated_Image_6celpb6celpb6cel_Z1oAwlQ.webp 750w, /_astro/Gemini_Generated_Image_6celpb6celpb6cel_ZxUCR2.webp 828w, /_astro/Gemini_Generated_Image_6celpb6celpb6cel_Z1W608K.webp 1080w, /_astro/Gemini_Generated_Image_6celpb6celpb6cel_s3NdH.webp 1280w, /_astro/Gemini_Generated_Image_6celpb6celpb6cel_2u4DRy.webp 1668w, /_astro/Gemini_Generated_Image_6celpb6celpb6cel_1EicqM.webp 2000w&quot;&gt;&lt;/p&gt;
&lt;p&gt;CE.SDK has two main layers:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;CreativeEngine:&lt;/strong&gt; The headless core that manages scenes, blocks, assets, and rendering. It handles the video timeline, playback, and export entirely client-side.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CreativeEditor UI:&lt;/strong&gt; A pre-built, customizable UI layer that wraps the engine with a dock, inspector, timeline, canvas, and navigation bar.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Plugins extend both layers. The &lt;code&gt;AiApps&lt;/code&gt; plugin, for example, registers AI providers with the engine and injects UI components (dock buttons, canvas menu items, generation panels) into the editor.&lt;/p&gt;
&lt;h2 id=&quot;step-1-project-setup&quot;&gt;Step 1: Project Setup&lt;/h2&gt;
&lt;p&gt;We scaffolded a React project with Vite and installed CE.SDK alongside the AI plugin packages:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; create&lt;/span&gt;&lt;span&gt; vite@latest&lt;/span&gt;&lt;span&gt; capcut-like-editor&lt;/span&gt;&lt;span&gt; --&lt;/span&gt;&lt;span&gt; --template&lt;/span&gt;&lt;span&gt; react&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; capcut-like-editor&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;# Core SDK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; @cesdk/cesdk-js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;# AI plugins&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; @imgly/plugin-ai-apps-web&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; @imgly/plugin-ai-video-generation-web&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; @imgly/plugin-ai-image-generation-web&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; @imgly/plugin-ai-audio-generation-web&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; @imgly/plugin-ai-text-generation-web&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;# Background removal (runs locally via WASM/WebGPU)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; @imgly/plugin-background-removal-web&lt;/span&gt;&lt;span&gt; onnxruntime-web@1.21.0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;why-so-many-packages&quot;&gt;Why so many packages?&lt;/h3&gt;
&lt;p&gt;CE.SDK follows a modular plugin architecture. Each AI capability is a separate package with its own provider modules. This means you only bundle what you use if you don’t need audio generation, don’t install &lt;code&gt;@imgly/plugin-ai-audio-generation-web&lt;/code&gt;. The &lt;code&gt;@imgly/plugin-ai-apps-web&lt;/code&gt; package is the unifying layer that brings them all together into a single dock panel.&lt;/p&gt;
&lt;h2 id=&quot;step-2-the-react-component&quot;&gt;Step 2: The React Component&lt;/h2&gt;
&lt;p&gt;CE.SDK provides a first-class React wrapper via &lt;code&gt;@cesdk/cesdk-js/react&lt;/code&gt;. The &lt;code&gt;&amp;#x3C;CreativeEditor&gt;&lt;/code&gt; component handles mounting, initialization, and cleanup:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;jsx&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; CreativeEditor &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;@cesdk/cesdk-js/react&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; config&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  // license: &apos;YOUR_CESDK_LICENSE_KEY&apos;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; init&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; async&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;cesdk&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  // All setup happens here — theme, assets, plugins, UI customization&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; default&lt;/span&gt;&lt;span&gt; function&lt;/span&gt;&lt;span&gt; VideoEditor&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  return&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &amp;#x3C;&lt;/span&gt;&lt;span&gt;CreativeEditor&lt;/span&gt;&lt;span&gt; config&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{config} &lt;/span&gt;&lt;span&gt;init&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{init} &lt;/span&gt;&lt;span&gt;width&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;100vw&quot;&lt;/span&gt;&lt;span&gt; height&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;100vh&quot;&lt;/span&gt;&lt;span&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;config&lt;/code&gt; object is passed to the engine at creation time. The &lt;code&gt;init&lt;/code&gt; callback fires once the &lt;code&gt;cesdk&lt;/code&gt; instance is ready — this is where all our customization lives.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Pitfall: Silent init errors.&lt;/strong&gt; The &lt;code&gt;&amp;#x3C;CreativeEditor&gt;&lt;/code&gt; component swallows errors thrown inside &lt;code&gt;init&lt;/code&gt;. If something fails, the editor loads but appears broken with no console output. Always wrap &lt;code&gt;init&lt;/code&gt; in a &lt;code&gt;try/catch&lt;/code&gt;:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;step-3-creating-the-video-scene&quot;&gt;Step 3: Creating the Video Scene&lt;/h2&gt;
&lt;p&gt;A video editor needs three things at startup: asset sources, a video scene, and a timeline.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// Load built-in asset libraries (stickers, shapes, filters, typefaces, etc.)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; cesdk.&lt;/span&gt;&lt;span&gt;addDefaultAssetSources&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// Load demo content (sample videos, images, audio) + enable upload slots&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; cesdk.&lt;/span&gt;&lt;span&gt;addDemoAssetSources&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  sceneMode: &lt;/span&gt;&lt;span&gt;&apos;Video&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  withUploadAssetSources: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// Create a video scene with timeline&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; cesdk.&lt;/span&gt;&lt;span&gt;createVideoScene&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;createVideoScene()&lt;/code&gt; sets up the scene hierarchy that powers the timeline:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Scene&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; └── Page (represents the video canvas — 1920x1080 by default)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      ├── Track (video track — holds video clips in sequence)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      ├── Track (overlay track — text, stickers, images)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      ├── CaptionTrack (subtitles synced to playback)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      └── Audio (background music, voiceover, sound effects)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Each element on the timeline is a &lt;strong&gt;block&lt;/strong&gt; with timing properties: &lt;code&gt;timeOffset&lt;/code&gt; (when it appears) and &lt;code&gt;duration&lt;/code&gt; (how long it plays). The engine handles rendering each frame, compositing layers, and synchronizing audio.&lt;/p&gt;
&lt;h3 id=&quot;browser-support&quot;&gt;Browser support&lt;/h3&gt;
&lt;p&gt;Video editing relies on modern web codecs (WebCodecs API), which are available in Chromium-based browsers (Chrome, Edge, Brave). Safari and Firefox support is limited.&lt;/p&gt;
&lt;h2 id=&quot;step-4-the-capcut-dark-theme&quot;&gt;Step 4: The CapCut Dark Theme&lt;/h2&gt;
&lt;p&gt;CapCut’s visual identity is defined by its deep charcoal backgrounds, teal accent colors, and subtle elevation layers. CE.SDK’s theming system maps perfectly to this through CSS custom properties.&lt;/p&gt;
&lt;h3 id=&quot;setting-the-base-theme&quot;&gt;Setting the base theme&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;cesdk.ui.&lt;/span&gt;&lt;span&gt;setTheme&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;dark&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This activates CE.SDK’s built-in dark theme. But we want to go further — we need CapCut’s specific color palette.&lt;/p&gt;
&lt;h3 id=&quot;custom-css-overrides&quot;&gt;Custom CSS overrides&lt;/h3&gt;
&lt;p&gt;CE.SDK scopes all its UI under &lt;code&gt;.ubq-public&lt;/code&gt; with &lt;code&gt;data-ubq-theme&lt;/code&gt; and &lt;code&gt;data-ubq-scale&lt;/code&gt; attributes. We override the CSS custom properties to inject our palette:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;.ubq-public&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;data-ubq-theme&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&apos;dark&apos;&lt;/span&gt;&lt;span&gt;][&lt;/span&gt;&lt;span&gt;data-ubq-scale&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&apos;normal&apos;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;.ubq-public&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;data-ubq-theme&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&apos;dark&apos;&lt;/span&gt;&lt;span&gt;][&lt;/span&gt;&lt;span&gt;data-ubq-scale&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&apos;modern&apos;&lt;/span&gt;&lt;span&gt;] {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  /* Deep charcoal backgrounds — darker than CE.SDK&apos;s default dark */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  --ubq-canvas&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;hsl&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;220&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;!important&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  --ubq-elevation-1&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;hsl&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;220&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;13&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;12&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;!important&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  --ubq-elevation-2&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;hsl&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;220&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;12&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;!important&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  --ubq-elevation-3&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;hsl&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;220&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;18&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;!important&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  /* High-contrast white text */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  --ubq-foreground-default&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;hsla&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;0.92&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;!important&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  --ubq-foreground-light&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;hsla&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;0.55&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;!important&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  /* CapCut&apos;s signature teal/cyan accent */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  --ubq-interactive-accent-default&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;hsl&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;190&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;85&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;48&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;!important&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  --ubq-interactive-accent-hover&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;hsl&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;190&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;85&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;42&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;!important&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  --ubq-interactive-accent-pressed&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;hsl&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;190&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;85&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;36&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;!important&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  /* Subtle borders — barely visible, like CapCut */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  --ubq-border-default&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;hsla&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;0.08&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;!important&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The key design decisions:&lt;/p&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Property&lt;/th&gt;&lt;th&gt;Value&lt;/th&gt;&lt;th&gt;Why&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;--ubq-canvas&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;hsl(220, 15%, 8%)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Near-black with a slight blue tint — matches CapCut’s canvas area&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;--ubq-elevation-1/2/3&lt;/code&gt;&lt;/td&gt;&lt;td&gt;12% → 15% → 18% lightness&lt;/td&gt;&lt;td&gt;Subtle elevation steps create depth without harsh contrast&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;--ubq-interactive-accent-*&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;hsl(190, 85%, 48%)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;CapCut’s teal — used for buttons, selections, and progress bars&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;--ubq-border-default&lt;/code&gt;&lt;/td&gt;&lt;td&gt;8% opacity white&lt;/td&gt;&lt;td&gt;Nearly invisible borders that only appear on close inspection&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;responsive-scale&quot;&gt;Responsive scale&lt;/h3&gt;
&lt;p&gt;We also configure responsive scaling so the editor adapts to touch devices:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;cesdk.ui.&lt;/span&gt;&lt;span&gt;setScale&lt;/span&gt;&lt;span&gt;(({ &lt;/span&gt;&lt;span&gt;containerWidth&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;isTouch&lt;/span&gt;&lt;span&gt; }) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  if&lt;/span&gt;&lt;span&gt; ((containerWidth &lt;/span&gt;&lt;span&gt;&amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span&gt; containerWidth &lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt; 768&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt; isTouch) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    return&lt;/span&gt;&lt;span&gt; &apos;large&apos;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;// Bigger touch targets on small/touch screens&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  return&lt;/span&gt;&lt;span&gt; &apos;normal&apos;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;// Standard desktop sizing&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;step-5-ai-plugin-integration&quot;&gt;Step 5: AI Plugin Integration&lt;/h2&gt;
&lt;p&gt;This is where the editor transforms from a basic video tool into something that feels like CapCut’s AI-powered experience. CE.SDK’s plugin system lets us add all AI capabilities through a single unified &lt;code&gt;AiApps&lt;/code&gt; plugin.&lt;/p&gt;
&lt;h3 id=&quot;the-unified-aiapps-approach&quot;&gt;The unified AiApps approach&lt;/h3&gt;
&lt;p&gt;Instead of registering each AI plugin separately, &lt;code&gt;@imgly/plugin-ai-apps-web&lt;/code&gt; provides a single entry point:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; AiApps &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;@imgly/plugin-ai-apps-web&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; FalAiVideo &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;@imgly/plugin-ai-video-generation-web/fal-ai&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; FalAiImage &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;@imgly/plugin-ai-image-generation-web/fal-ai&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; OpenAiImage &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;@imgly/plugin-ai-image-generation-web/open-ai&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; Elevenlabs &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;@imgly/plugin-ai-audio-generation-web/elevenlabs&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; Anthropic &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;@imgly/plugin-ai-text-generation-web/anthropic&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; cesdk.&lt;/span&gt;&lt;span&gt;addPlugin&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  AiApps&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    dryRun: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;// Simulate for development — no API calls&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    providers: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      text2text: Anthropic.&lt;/span&gt;&lt;span&gt;AnthropicProvider&lt;/span&gt;&lt;span&gt;({ proxyUrl: &lt;/span&gt;&lt;span&gt;PROXY_URL&lt;/span&gt;&lt;span&gt; }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      text2image: [FalAiImage.&lt;/span&gt;&lt;span&gt;RecraftV3&lt;/span&gt;&lt;span&gt;({ proxyUrl }) &lt;/span&gt;&lt;span&gt;/* ... */&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      image2image: [FalAiImage.&lt;/span&gt;&lt;span&gt;GeminiFlashEdit&lt;/span&gt;&lt;span&gt;({ proxyUrl }) &lt;/span&gt;&lt;span&gt;/* ... */&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      text2video: [FalAiVideo.&lt;/span&gt;&lt;span&gt;MinimaxVideo01Live&lt;/span&gt;&lt;span&gt;({ proxyUrl }) &lt;/span&gt;&lt;span&gt;/* ... */&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      image2video: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        FalAiVideo.&lt;/span&gt;&lt;span&gt;MinimaxVideo01LiveImageToVideo&lt;/span&gt;&lt;span&gt;({ proxyUrl }) &lt;/span&gt;&lt;span&gt;/* ... */&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      text2speech: Elevenlabs.&lt;/span&gt;&lt;span&gt;ElevenMultilingualV2&lt;/span&gt;&lt;span&gt;({ proxyUrl }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      text2sound: Elevenlabs.&lt;/span&gt;&lt;span&gt;ElevenSoundEffects&lt;/span&gt;&lt;span&gt;({ proxyUrl }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;provider-categories-explained&quot;&gt;Provider categories explained&lt;/h3&gt;













































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Category&lt;/th&gt;&lt;th&gt;What it does&lt;/th&gt;&lt;th&gt;Models we configured&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;text2text&lt;/code&gt;&lt;/td&gt;&lt;td&gt;AI copywriting — improve text, translate, change tone&lt;/td&gt;&lt;td&gt;Anthropic Claude&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;text2image&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Generate images from text prompts&lt;/td&gt;&lt;td&gt;RecraftV3, IdeogramV3, GPT Image&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;image2image&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Transform existing images with AI&lt;/td&gt;&lt;td&gt;Gemini Flash Edit, GPT Image&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;text2video&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Generate video clips from text descriptions&lt;/td&gt;&lt;td&gt;Minimax Video, Kling Video, Pixverse&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;image2video&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Animate a static image into video&lt;/td&gt;&lt;td&gt;Minimax Video, Kling Video&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;text2speech&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Convert text to spoken audio with voice selection&lt;/td&gt;&lt;td&gt;ElevenLabs Multilingual V2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;text2sound&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Generate sound effects from text&lt;/td&gt;&lt;td&gt;ElevenLabs Sound Effects&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;When multiple providers are configured in an array (like &lt;code&gt;text2image&lt;/code&gt;), the UI automatically shows a provider/model selection dropdown so users can choose which AI model to use.&lt;/p&gt;
&lt;h3 id=&quot;the-proxy-server-requirement&quot;&gt;The proxy server requirement&lt;/h3&gt;
&lt;p&gt;Every provider takes a &lt;code&gt;proxyUrl&lt;/code&gt; parameter. This is critical for production:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Browser  →  Your Proxy Server  →  AI Provider (fal.ai, ElevenLabs, etc.)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                ↑&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          Injects API keys&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          server-side&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Your API keys should never be in client-side code. The proxy server receives requests from CE.SDK, attaches your API key, and forwards to the AI provider. During development, &lt;code&gt;dryRun: true&lt;/code&gt; simulates generation without any API calls.&lt;/p&gt;
&lt;h3 id=&quot;background-removal&quot;&gt;Background removal&lt;/h3&gt;
&lt;p&gt;Background removal is a separate plugin because it runs entirely client-side — no proxy needed:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; BackgroundRemovalPlugin &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;@imgly/plugin-background-removal-web&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; cesdk.&lt;/span&gt;&lt;span&gt;addPlugin&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  BackgroundRemovalPlugin&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ui: { locations: [&lt;/span&gt;&lt;span&gt;&apos;canvasMenu&apos;&lt;/span&gt;&lt;span&gt;] },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This uses ONNX Runtime (WebAssembly + WebGPU) to run an AI segmentation model directly in the browser. The first run downloads ~40MB of model weights, which are then cached. Select any image on the canvas and click “Remove Background” in the context menu.&lt;/p&gt;
&lt;h2 id=&quot;step-6-ui-customization-with-the-component-order-api&quot;&gt;Step 6: UI Customization with the Component Order API&lt;/h2&gt;
&lt;p&gt;CE.SDK’s UI is built from five customizable areas: &lt;strong&gt;Dock&lt;/strong&gt;, &lt;strong&gt;Inspector Bar&lt;/strong&gt;, &lt;strong&gt;Canvas Menu&lt;/strong&gt;, &lt;strong&gt;Navigation Bar&lt;/strong&gt;, and &lt;strong&gt;Canvas Bar&lt;/strong&gt;. The Component Order API lets us insert, remove, and reorder components in each area.&lt;/p&gt;
&lt;h3 id=&quot;adding-the-ai-button-to-the-dock&quot;&gt;Adding the AI button to the dock&lt;/h3&gt;
&lt;p&gt;We want the AI Apps button to be the first thing users see in the dock:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;cesdk.ui.&lt;/span&gt;&lt;span&gt;insertOrderComponent&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  { in: &lt;/span&gt;&lt;span&gt;&apos;ly.img.dock&apos;&lt;/span&gt;&lt;span&gt;, position: &lt;/span&gt;&lt;span&gt;&apos;start&apos;&lt;/span&gt;&lt;span&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &apos;ly.img.ai.apps.dock&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;insertOrderComponent&lt;/code&gt; takes a location specifier and the component(s) to insert. &lt;code&gt;position: &apos;start&apos;&lt;/code&gt; puts it at the top of the dock. Alternative positions include &lt;code&gt;&apos;end&apos;&lt;/code&gt;, a numeric index, or relative placement with &lt;code&gt;before&lt;/code&gt;/&lt;code&gt;after&lt;/code&gt; matchers.&lt;/p&gt;
&lt;h3 id=&quot;ai-options-in-the-canvas-context-menu&quot;&gt;AI options in the canvas context menu&lt;/h3&gt;
&lt;p&gt;When a user selects a text or image block and right-clicks, we want AI options available:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;cesdk.ui.&lt;/span&gt;&lt;span&gt;insertOrderComponent&lt;/span&gt;&lt;span&gt;({ in: &lt;/span&gt;&lt;span&gt;&apos;ly.img.canvas.menu&apos;&lt;/span&gt;&lt;span&gt;, position: &lt;/span&gt;&lt;span&gt;&apos;start&apos;&lt;/span&gt;&lt;span&gt; }, [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &apos;ly.img.ai.text.canvasMenu&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &apos;ly.img.ai.image.canvasMenu&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;]);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Passing an array inserts multiple components at once.&lt;/p&gt;
&lt;h3 id=&quot;custom-export-button-in-the-navigation-bar&quot;&gt;Custom export button in the navigation bar&lt;/h3&gt;
&lt;p&gt;We add an Export button with a real click handler that triggers MP4 export:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;cesdk.ui.&lt;/span&gt;&lt;span&gt;insertOrderComponent&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  { in: &lt;/span&gt;&lt;span&gt;&apos;ly.img.navigation.bar&apos;&lt;/span&gt;&lt;span&gt;, position: &lt;/span&gt;&lt;span&gt;&apos;end&apos;&lt;/span&gt;&lt;span&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    id: &lt;/span&gt;&lt;span&gt;&apos;ly.img.action.navigationBar&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    key: &lt;/span&gt;&lt;span&gt;&apos;export&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    label: &lt;/span&gt;&lt;span&gt;&apos;Export&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    icon: &lt;/span&gt;&lt;span&gt;&apos;@imgly/Download&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    onClick&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; () &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      const&lt;/span&gt;&lt;span&gt; engine&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; cesdk.engine;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      const&lt;/span&gt;&lt;span&gt; page&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; engine.block.&lt;/span&gt;&lt;span&gt;findByType&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;page&apos;&lt;/span&gt;&lt;span&gt;)[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      if&lt;/span&gt;&lt;span&gt; (page) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        const&lt;/span&gt;&lt;span&gt; blob&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; await&lt;/span&gt;&lt;span&gt; engine.block.&lt;/span&gt;&lt;span&gt;exportVideo&lt;/span&gt;&lt;span&gt;(page, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          mimeType: &lt;/span&gt;&lt;span&gt;&apos;video/mp4&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        const&lt;/span&gt;&lt;span&gt; url&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; URL&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;createObjectURL&lt;/span&gt;&lt;span&gt;(blob);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        const&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; document.&lt;/span&gt;&lt;span&gt;createElement&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;a&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        a.href &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; url;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        a.download &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;video.mp4&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        a.&lt;/span&gt;&lt;span&gt;click&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        URL&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;revokeObjectURL&lt;/span&gt;&lt;span&gt;(url);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;exportVideo&lt;/code&gt; method renders every frame of the timeline — compositing video tracks, overlays, text, captions, and audio — into an MP4 blob entirely in the browser.&lt;/p&gt;
&lt;h2 id=&quot;step-7-wiring-generated-audio-into-the-asset-library&quot;&gt;Step 7: Wiring Generated Audio into the Asset Library&lt;/h2&gt;
&lt;p&gt;AI-generated audio (speech and sound effects) is stored in provider-specific history sources. To make this audio browsable alongside regular audio assets, we inject the history source into the audio asset library entry:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; audioEntry&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; cesdk.ui.&lt;/span&gt;&lt;span&gt;getAssetLibraryEntry&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;ly.img.audio&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (audioEntry &lt;/span&gt;&lt;span&gt;!=&lt;/span&gt;&lt;span&gt; null&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  const&lt;/span&gt;&lt;span&gt; existingSourceIds&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; Array.&lt;/span&gt;&lt;span&gt;isArray&lt;/span&gt;&lt;span&gt;(audioEntry.sourceIds)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ?&lt;/span&gt;&lt;span&gt; audioEntry.sourceIds&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    :&lt;/span&gt;&lt;span&gt; audioEntry.&lt;/span&gt;&lt;span&gt;sourceIds&lt;/span&gt;&lt;span&gt;({});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  cesdk.ui.&lt;/span&gt;&lt;span&gt;updateAssetLibraryEntry&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;ly.img.audio&apos;&lt;/span&gt;&lt;span&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    sourceIds: [&lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;existingSourceIds, &lt;/span&gt;&lt;span&gt;&apos;ly.img.ai.audio-generation.history&apos;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now when users open the Audio panel in the dock, they’ll see their AI-generated audio alongside the sample library.&lt;/p&gt;
&lt;h2 id=&quot;step-8-custom-labels-with-i18n&quot;&gt;Step 8: Custom Labels with i18n&lt;/h2&gt;
&lt;p&gt;CE.SDK’s i18n system lets us customize any UI string. We used it to make the AI prompt fields more inviting:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;cesdk.i18n.&lt;/span&gt;&lt;span&gt;setTranslations&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  en: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &apos;ly.img.plugin-ai-video-generation-web.fal-ai/minimax/video-01-live.property.prompt&apos;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      &apos;Describe your video...&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &apos;ly.img.plugin-ai-image-generation-web.fal-ai/recraft-v3.property.prompt&apos;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      &apos;Describe your image...&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Translation keys follow the pattern &lt;code&gt;{plugin-id}.{provider-id}.property.{field}&lt;/code&gt;. You can also add multi-language support by including keys for &lt;code&gt;de&lt;/code&gt;, &lt;code&gt;fr&lt;/code&gt;, &lt;code&gt;es&lt;/code&gt;, etc.&lt;/p&gt;
&lt;h2 id=&quot;the-complete-file-structure&quot;&gt;The Complete File Structure&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;capcut-like-editor/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── src/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── App.jsx              # Root — imports VideoEditor + theme CSS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── VideoEditor.jsx      # The entire editor (single component, ~180 lines)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── capcut-theme.css     # CapCut dark theme overrides (~100 lines)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── index.css            # Global reset (margin/padding/overflow)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   └── main.jsx             # React entry point&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── index.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── package.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└── vite.config.js&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That’s it. The entire CapCut-like editor is three files: one React component, one CSS file, and a thin App wrapper.&lt;/p&gt;
&lt;h2 id=&quot;what-we-get-out-of-the-box&quot;&gt;What We Get Out of the Box&lt;/h2&gt;
&lt;p&gt;Because CE.SDK’s video UI is pre-built, we didn’t write any code for these features — they come from &lt;code&gt;createVideoScene()&lt;/code&gt; and the default UI:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Multi-track timeline&lt;/strong&gt; with drag-to-reorder, drag-to-resize&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Trim and split&lt;/strong&gt; — drag clip edges or use the split tool&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Join and arrange&lt;/strong&gt; — drag clips between tracks&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transform&lt;/strong&gt; — crop, flip, rotate via the inspector&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Playback controls&lt;/strong&gt; — play, pause, seek, scrub&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Text overlays&lt;/strong&gt; — add styled text with the text tool&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stickers and graphics&lt;/strong&gt; — from the asset library&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Filters and effects&lt;/strong&gt; — LUT-based color grading&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Undo/redo&lt;/strong&gt; — full history stack&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zoom and pan&lt;/strong&gt; — standard canvas navigation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The AI plugins add their own UI components (dock buttons, generation panels, context menu items) through the plugin system. We just positioned them where we wanted.&lt;/p&gt;
&lt;h2 id=&quot;going-to-production&quot;&gt;Going to Production&lt;/h2&gt;
&lt;p&gt;To take this from a prototype to production, you need three things:&lt;/p&gt;
&lt;h3 id=&quot;1-license-key&quot;&gt;1. License key&lt;/h3&gt;
&lt;p&gt;Get a free trial key at &lt;a href=&quot;https://img.ly/forms/contact-sales&quot;&gt;https://img.ly/forms/contact-sales&lt;/a&gt; and set it in the config (yes, if you want to ship to production you’ll have to talk to our lovely colleagues in sales):&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; config&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  license: &lt;/span&gt;&lt;span&gt;&apos;YOUR_CESDK_LICENSE_KEY&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;2-proxy-server&quot;&gt;2. Proxy server&lt;/h3&gt;
&lt;p&gt;Set up a server that forwards AI requests with your API keys:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; PROXY_URL&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;https://your-server.com/api/ai-proxy&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;See the &lt;a href=&quot;https://img.ly/docs/cesdk/react/user-interface/ai-integration/proxy-server-61f901/&quot;&gt;CE.SDK Proxy Server guide&lt;/a&gt; for Express.js and other server examples.&lt;/p&gt;
&lt;h3 id=&quot;3-disable-dry-run&quot;&gt;3. Disable dry run&lt;/h3&gt;
&lt;p&gt;Remove &lt;code&gt;dryRun: true&lt;/code&gt; from the AiApps configuration to enable real AI generation.&lt;/p&gt;
&lt;h2 id=&quot;key-takeaways&quot;&gt;Key Takeaways&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;CE.SDK does the heavy lifting.&lt;/strong&gt; The timeline, playback, rendering, and export are all handled by the engine. We wrote zero video processing code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The plugin system is powerful.&lt;/strong&gt; Six AI capabilities were added with a single &lt;code&gt;addPlugin(AiApps({ ... }))&lt;/code&gt; call. Background removal was one more call.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CSS custom properties make theming painless.&lt;/strong&gt; We matched CapCut’s aesthetic by overriding ~25 CSS variables. No forking, no patching.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Component Order API is the customization backbone.&lt;/strong&gt; &lt;code&gt;insertOrderComponent&lt;/code&gt; with position-based placement is the cleanest pattern for adding UI elements.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wrap &lt;code&gt;init&lt;/code&gt; in try/catch.&lt;/strong&gt; CE.SDK’s &lt;code&gt;&amp;#x3C;CreativeEditor&gt;&lt;/code&gt; swallows errors silently. This is the single most important debugging tip.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pin your package versions.&lt;/strong&gt; All &lt;code&gt;@imgly/*&lt;/code&gt; plugins must match the &lt;code&gt;@cesdk/cesdk-js&lt;/code&gt; version exactly. A version mismatch (like 1.68 vs 1.69) will cause peer dependency conflicts.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;resources&quot;&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://img.ly/docs/cesdk/react/prebuilt-solutions/video-editor-9e533a/&quot;&gt;CE.SDK Video Editor Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://img.ly/docs/cesdk/react/user-interface/ai-integration/integrate-8e906c/&quot;&gt;AI Integration Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://img.ly/docs/cesdk/react/user-interface/appearance/theming-4b0938/&quot;&gt;Theming Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://img.ly/docs/cesdk/react/user-interface/customization/quick-start/reorder-components-f6g7h8/&quot;&gt;Rearrange Buttons (Component Order API)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://img.ly/showcases/cesdk/video-ui/web&quot;&gt;Video Editor Web Demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/imgly/cesdk-web-examples&quot;&gt;GitHub Examples&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><dc:creator>Jan</dc:creator><media:content url="https://blog.img.ly/2026/02/blogcover.png" medium="image"/><category>React</category><category>Video Editor</category><category>CE.SDK</category></item><item><title>From Prompt to Editor: Running CE.SDK Inside ChatGPT with the Apps SDK</title><link>https://img.ly/blog/from-prompt-to-editor-running-ce-sdk-inside-chatgpt-with-the-apps-sdk/</link><guid isPermaLink="true">https://img.ly/blog/from-prompt-to-editor-running-ce-sdk-inside-chatgpt-with-the-apps-sdk/</guid><description>We built a technical demo running CE.SDK directly inside ChatGPT using MCP, showing how AI chats can open real, interactive editors. It highlights strict MCP contracts, visual-first UX, and how chat becomes a coordination layer for doing creative work.</description><pubDate>Fri, 19 Dec 2025 15:43:16 GMT</pubDate><content:encoded>&lt;p&gt;With the new ChatGPT Apps SDK and Model Context Protocol (MCP), chat interfaces are starting to look less like Q&amp;#x26;A tools and more like places where work actually happens. To explore what that means for creative workflows, we built a small technical demo: &lt;a href=&quot;https://github.com/imgly/cesdk-web-examples/tree/main/cookbooks-chatgpt-app&quot;&gt;&lt;strong&gt;CE.SDK running directly inside ChatGPT&lt;/strong&gt;.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;From a user’s perspective, the flow is almost trivial. You ask ChatGPT for something like an ecommerce template. ChatGPT searches our template catalog, selects a matching design, and opens it instantly in a fully interactive CE.SDK editor — right inside the chat interface. What looks like a preview is, in fact, a real editor loaded with a real template scene.&lt;/p&gt;
&lt;p&gt;This isn’t meant as a product announcement. It’s a technical proof of concept showing how creative SDKs can plug directly into AI-native interfaces.&lt;/p&gt;
&lt;h2 id=&quot;cesdk-as-a-chatgpt-app&quot;&gt;CE.SDK as a ChatGPT App&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/embed/AoDqUNVLLJ4?feature=oembed&quot;&gt;https://www.youtube.com/embed/AoDqUNVLLJ4?feature=oembed&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The integration is built around a custom MCP server that exposes CE.SDK to ChatGPT as a tool. The server speaks OpenAI’s JSON-RPC–style MCP and implements the standard lifecycle methods (&lt;code&gt;initialize&lt;/code&gt;, &lt;code&gt;tools.list&lt;/code&gt;, &lt;code&gt;tools.call&lt;/code&gt;, &lt;code&gt;resources.read&lt;/code&gt;). It knows about our premium template catalog and emits structured payloads that the frontend understands.&lt;/p&gt;
&lt;p&gt;On the client side, a Next.js app listens to tool output events streamed from ChatGPT, renders CE.SDK widgets, and hydrates them with the payloads returned by the tool — such as a scene URL, placeholder values, or export permissions. Templates are loaded via CE.SDK’s Template API, either from a URL or from a serialized scene string.&lt;/p&gt;
&lt;p&gt;Under the hood, the stack is fairly conventional:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Next.js 15 (App Router)&lt;/li&gt;
&lt;li&gt;CE.SDK Web / CreativeEngine&lt;/li&gt;
&lt;li&gt;A custom MCP handler to normalize JSON-RPC&lt;/li&gt;
&lt;li&gt;Vercel for hosting&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What’s new is not the technology itself, but the context in which it runs.&lt;/p&gt;
&lt;h2 id=&quot;working-with-mcp-in-practice&quot;&gt;Working with MCP in Practice&lt;/h2&gt;
&lt;p&gt;The hardest part of the demo wasn’t CE.SDK — it was MCP.&lt;/p&gt;
&lt;p&gt;OpenAI’s MCP implementation is extremely strict. Even the smallest schema mismatch can trigger the infamous “TaskGroup 424” error, usually without any hint as to what went wrong. In many cases, the HTTP response is technically successful, but the JSON structure doesn’t match the expected schema closely enough.&lt;/p&gt;
&lt;p&gt;The key lesson here is to treat MCP responses as hard contracts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Validate every response against a schema (for example with zod).&lt;/li&gt;
&lt;li&gt;Mirror OpenAI’s field names exactly, even for empty or optional capabilities.&lt;/li&gt;
&lt;li&gt;Assume that a 424 almost always means “your JSON shape is wrong”.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Another important insight was how critical visual context is in chat-based tools. If your MCP responses don’t include thumbnails or preview images, ChatGPT will often fall back to rendering links. For creative tools, that immediately breaks the experience. In a chat UI, visuals aren’t an enhancement — they &lt;em&gt;are&lt;/em&gt; the interface.&lt;/p&gt;
&lt;p&gt;State handling also requires a shift in mindset. ChatGPT can replay tool calls, and each prompt effectively creates a new widget instance. You can’t rely on mutating an existing editor. The frontend needs to be idempotent: load scenes from serialized state first, then apply changes. Every tool call should be treated as a fresh render.&lt;/p&gt;
&lt;h2 id=&quot;why-this-pattern-matters&quot;&gt;Why This Pattern Matters&lt;/h2&gt;
&lt;p&gt;This demo points to a broader change in how creative software may be accessed. Chat becomes a coordination layer, not just a conversational one. Instead of explaining how something could be designed, the AI opens the actual editor and lets the user continue from there.&lt;/p&gt;
&lt;p&gt;For CE.SDK, this fits naturally. Editors become embeddable capabilities rather than standalone applications, and AI systems become the entry point into creative workflows. Prompting turns into doing.&lt;/p&gt;
&lt;h2 id=&quot;beyond-openai-the-mcp-ui-standard&quot;&gt;Beyond OpenAI: The MCP UI Standard&lt;/h2&gt;
&lt;p&gt;Although this demo uses OpenAI’s MCP, the architecture maps cleanly to the new MCP UI standard recently introduced by Anthropic. That standard aims to make tool definitions and UI rendering more consistent across models and platforms.&lt;/p&gt;
&lt;p&gt;Because this integration already separates tool logic from UI rendering and relies on structured, explicit payloads, transferring it to Anthropic’s MCP UI model is conceptually straightforward. CE.SDK can act as a reusable creative surface across ChatGPT, Claude, and future AI app ecosystems.&lt;/p&gt;
&lt;p&gt;You can read more about Anthropic’s MCP UI direction here:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.modelcontextprotocol.io/posts/2025-11-21-mcp-apps/&quot;&gt;https://blog.modelcontextprotocol.io/posts/2025-11-21-mcp-apps/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This demo is intentionally small and technical, but it highlights a meaningful shift: AI systems that don’t just describe creative outcomes, but open the tools to actually create them.&lt;/p&gt;</content:encoded><dc:creator>Jan</dc:creator><dc:creator>Sven</dc:creator><media:content url="https://blog.img.ly/2025/12/chatgpt-open-design-editor-tempalte.jpg" medium="image"/><category>AI</category><category>MCP</category><category>CE.SDK</category></item><item><title>Introducing CE.SDK Renderer: The Missing Piece of Creative Automation</title><link>https://img.ly/blog/ce-sdk-renderer-creative-automation/</link><guid isPermaLink="true">https://img.ly/blog/ce-sdk-renderer-creative-automation/</guid><description>The CE.SDK Renderer brings fast, reliable, fully licensed server-side rendering to your backend unlocking true end-to-end creative automation with GPU acceleration, perfect fidelity, and scalable image, PDF, and video export.</description><pubDate>Mon, 24 Nov 2025 11:05:15 GMT</pubDate><content:encoded>&lt;p&gt;For years, teams have used &lt;strong&gt;CE.SDK&lt;/strong&gt; to power rich, customizable editing experiences across web, mobile, and desktop. But one critical component of true end-to-end creative automation remained challenging: &lt;strong&gt;server-side rendering&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Until now, export workflows depended on client devices, brittle FFmpeg scripts, or slow headless browser setups. While these approaches worked, they often fell short for enterprise scale workflows, AI pipelines, or high-volume creative automation.&lt;/p&gt;
&lt;p&gt;Today, we’re excited to introduce the &lt;a href=&quot;https://img.ly/docs/cesdk/renderer/get-started/overview-e18f40/&quot;&gt;&lt;strong&gt;CE.SDK Renderer&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;,&lt;/strong&gt; the native, GPU-accelerated server-side rendering engine that completes the CE.SDK ecosystem.&lt;/p&gt;
&lt;p&gt;The Renderer brings CE.SDK’s design engine to your backend with &lt;strong&gt;fast, compliant, enterprise-ready&lt;/strong&gt; export for images, PDFs, and video, enabling organizations to generate media at scale with full fidelity and predictable performance.&lt;/p&gt;
&lt;h2 id=&quot;why-the-cesdk-renderer-matters&quot;&gt;&lt;strong&gt;Why the CE.SDK Renderer Matters&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;rendering-has-been-the-last-barrier-to-full-automation&quot;&gt;&lt;strong&gt;Rendering Has Been the Last Barrier to Full Automation&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Teams could design and generate templates programmatically, but producing the final asset—especially video—was constrained by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lack of GPU acceleration&lt;/li&gt;
&lt;li&gt;No native CE.SDK export on servers&lt;/li&gt;
&lt;li&gt;Legal requirements for H.264/H.265&lt;/li&gt;
&lt;li&gt;Unstable browser virtualization&lt;/li&gt;
&lt;li&gt;Node.js memory and performance limits&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The CE.SDK Renderer solves all of this in one fell swoop with a native Linux binary packaged as a Docker container, built explicitly for backend media generation.&lt;/p&gt;
&lt;p&gt;Many of our SaaS customers have told us the same thing: they want a safe, supported alternative to FFmpeg that they don’t have to maintain themselves.&lt;/p&gt;
&lt;h2 id=&quot;what-the-cesdk-renderer-delivers&quot;&gt;&lt;strong&gt;What the CE.SDK Renderer Delivers&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;The CE.SDK Renderer fully unlocks its value in the &lt;a href=&quot;http://IMG.LY&quot;&gt;IMG.LY&lt;/a&gt; ecosystem by providing a creative automation infrastructure layer for the user facing portion of &lt;a href=&quot;http://IMG.LY&quot;&gt;IMG.LY&lt;/a&gt;’s editor SDK. It enables two core capabilities that modern creative automation depends on: &lt;strong&gt;scalable rendering&lt;/strong&gt; and &lt;strong&gt;fully compliant video export:&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;gpu-accelerated-export-performance&quot;&gt;&lt;strong&gt;GPU-Accelerated Export Performance&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Native code and GPU acceleration allow extremely fast rendering. Ideal for heavy scenes, 4K+ requests, and large batch pipelines.&lt;/p&gt;
&lt;h3 id=&quot;fully-licensed-video-on-the-backend-h264h265&quot;&gt;&lt;strong&gt;Fully Licensed Video on the Backend (H.264/H.265)&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;You can render MP4 video entirely on your servers with full licensing compliance. Powered by &lt;a href=&quot;https://fluendo.com/&quot;&gt;Fluendo&lt;/a&gt;’s AV stack, the Renderer provides enterprise-grade legal protection for H.264/H.265, eliminating the risks associated with unlicensed or open-source encoding. This gives teams the confidence to run video-heavy pipelines at scale.&lt;/p&gt;
&lt;h3 id=&quot;built-for-scale&quot;&gt;&lt;strong&gt;Built for Scale&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Perfect for workloads generating hundreds or thousands of creative variations: ads, postcards, dynamic social assets, catalogs, and more on stable maintainable infrastructure supplanting FFmpeg or brittle pipelines based on headless browsers.&lt;/p&gt;
&lt;h3 id=&quot;perfect-visual-fidelity&quot;&gt;&lt;strong&gt;Perfect Visual Fidelity&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Because it uses the same CE.SDK engine that powers the editing experience, the Renderer produces output that matches exactly what users see in the editor. This fidelity is critical for automated pipelines, ensuring every exported asset is accurate, consistent, and visually correct.&lt;/p&gt;
&lt;p&gt;Together, these unlock a complete creative automation workflow: &lt;strong&gt;design → generate → render&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;how-it-works&quot;&gt;How It Works&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 2000px) 2000px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;2000&quot; height=&quot;1125&quot; src=&quot;https://img.ly/_astro/Serverside-rendering_--1-_Z12wLhR.webp&quot; srcset=&quot;/_astro/Serverside-rendering_--1-_2sjmMl.webp 640w, /_astro/Serverside-rendering_--1-_Z2iVc0.webp 750w, /_astro/Serverside-rendering_--1-_6sJi2.webp 828w, /_astro/Serverside-rendering_--1-_Zbw4HI.webp 1080w, /_astro/Serverside-rendering_--1-_WsUly.webp 1280w, /_astro/Serverside-rendering_--1-_ZPsEqN.webp 1668w, /_astro/Serverside-rendering_--1-_Z12wLhR.webp 2000w&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;async-exports&quot;&gt;Async Exports&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;A CE.SDK scene is created via browser editor, mobile app, or Node.js.&lt;/li&gt;
&lt;li&gt;The scene is sent to the &lt;strong&gt;Renderer&lt;/strong&gt;, running in Docker.&lt;/li&gt;
&lt;li&gt;The Renderer outputs: PNG/JPEG, PDF, MP4 (H.264/H.265)&lt;/li&gt;
&lt;li&gt;The rendered asset is returned to your application or batch pipeline.&lt;/li&gt;
&lt;li&gt;Users can continue editing while export happens asynchronously.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This removes export load from the client entirely and opens the door for sophisticated backend media generation.&lt;/p&gt;
&lt;h3 id=&quot;batch-rendering&quot;&gt;Batch Rendering&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Multiple CE.SDK templates are prepared for automation.&lt;/li&gt;
&lt;li&gt;An external data source (CSV, JSON, API) is connected to the templates to generate all design variants.&lt;/li&gt;
&lt;li&gt;Each resulting scene is sent as a separate job to the &lt;strong&gt;Renderer&lt;/strong&gt; running in Docker.&lt;/li&gt;
&lt;li&gt;The Renderer outputs PNG/JPEG, PDF, or MP4 for every variant.&lt;/li&gt;
&lt;li&gt;All assets are returned to your backend or stored in your pipeline, enabling large-scale automated creative production.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;example-use-case-hyper-personalized-video-ads-at-massive-scale&quot;&gt;&lt;strong&gt;Example Use Case: Hyper-Personalized Video Ads at Massive Scale&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;One of our customers runs large demographic-targeted campaigns where a single master video must transform into tens of thousands of personalized variants. Instead of showing the same creative to everyone, they tailor each video to the viewer’s profile think &lt;em&gt;German, mid-30s, dog owner&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;From one base creative, their system dynamically generates up to &lt;strong&gt;100,000 unique versions&lt;/strong&gt;. Their backend assembles all scene variations in Node.js, then hands them off to the CE.SDK Renderer to produce the final video files.&lt;/p&gt;
&lt;p&gt;Before adopting CE.SDK Renderer, this workflow was painful: brittle FFmpeg scripts, unpredictable render results across machines, codec licensing concerns, and processing times that stretched over days.&lt;/p&gt;
&lt;p&gt;Maintaining this setup consumed engineering time that would have been better spent on improving the creative logic itself.&lt;/p&gt;
&lt;p&gt;With CE.SDK Renderer, the entire pipeline became both scalable and predictable. They now render thousands of variants with consistent results, fully licensed codecs, and throughput high enough to keep up with real-world campaign demands. Instead of fighting their rendering stack, their team can focus on creative automation and campaign performance.&lt;/p&gt;
&lt;p&gt;This is just one example of how CE.SDK Renderer enables production-grade, high-volume personalized media at scale something that previously required complex custom infrastructure.&lt;/p&gt;
&lt;h2 id=&quot;licensing-options&quot;&gt;&lt;strong&gt;Licensing Options&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;open-source-renderer&quot;&gt;&lt;strong&gt;Open-Source Renderer&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;A lightweight version using open-source codecs. It’s fast, simple to run, and great for prototyping or early-stage products. Because it doesn’t include licensed H.264/H.265 encoding, it isn’t suitable for enterprise video production or legally compliant distribution.&lt;/p&gt;
&lt;h3 id=&quot;av-licensed-renderer-fluendo&quot;&gt;&lt;strong&gt;AV-Licensed Renderer (Fluendo)&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;This edition includes fully licensed H.264/H.265 encoding powered by &lt;a href=&quot;https://fluendo.com/&quot;&gt;Fluendo&lt;/a&gt;, ensuring your video exports meet all patent and compliance requirements. It uses concurrency-based licensing and is designed for production workloads, regulated industries, and any platform generating video at scale.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;By bringing fast, compliant, and scalable rendering to the backend, the CE.SDK Renderer removes one of the biggest engineering hurdles in creative automation. Whether you’re generating hundreds or hundreds of thousands of assets, it gives you the tools to build stable, modern media pipelines without the maintenance burden. The simplest path to production-grade creative automation.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://img.ly/forms/free-trial&quot;&gt;Start your free trial&lt;/a&gt; today and get started in minutes.&lt;/p&gt;</content:encoded><dc:creator>Jan</dc:creator><media:content url="https://blog.img.ly/2025/11/render-automation-nodejs-alternative-creative-sdk-imgly-export-video.jpg" medium="image"/><category>Creative Automation</category><category>Server-side Video</category></item><item><title>How to Embed an Editable InDesign Template in Your Website</title><link>https://img.ly/blog/embed-edit-automate-indesign-files-in-the-browser-complete-guide-2025/</link><guid isPermaLink="true">https://img.ly/blog/embed-edit-automate-indesign-files-in-the-browser-complete-guide-2025/</guid><description>InDesign files hold valuable design structure - yet remain stuck offline. This article shows how CE.SDK turns IDML templates into web-editable layouts with full fidelity, unlocking collaboration and automation impossible in desktop-only workflows.</description><pubDate>Tue, 28 Oct 2025 12:29:03 GMT</pubDate><content:encoded>&lt;h2 id=&quot;why-editing-indesign-files-in-the-browser-matters-now&quot;&gt;&lt;strong&gt;Why Editing InDesign Files in the Browser Matters Now&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Adobe InDesign has long been the standard for high-fidelity layout and print design. Yet for many teams, its power comes with friction: it’s desktop-bound, collaboration-limited, and inaccessible to clients or non-designers who simply need to make minor edits.&lt;/p&gt;
&lt;p&gt;Creative work requires ever shorter feedback loops and is becoming more and more accessible to the average users, hence organizations are looking for ways to &lt;strong&gt;bring InDesign workflows into the browser&lt;/strong&gt; to make templates editable, collaborative, and automatable.&lt;/p&gt;
&lt;p&gt;At the same time, businesses are under pressure to modernize creative production. Marketing teams need to localize campaigns at scale, SaaS platforms want to let users personalize assets, and agencies aim to deliver editable templates instead of static files. The question naturally arises:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;“Can I edit InDesign files in a browser?”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Until recently, the answer was “not really.” Adobe offers &lt;em&gt;Share for Review&lt;/em&gt; for commenting, &lt;em&gt;InCopy on the Web&lt;/em&gt; for limited text changes, and &lt;em&gt;Adobe Express&lt;/em&gt; for simplified exports, but none provide full-fidelity, browser-native editing or the ability to embed such functionality into your own product.&lt;/p&gt;
&lt;p&gt;That’s where &lt;strong&gt;CE.SDK&lt;/strong&gt; enters the picture.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;CE.SDK is an embeddable creative editor that powers photo, video, and design workflows directly in the browser. It’s deeply customizable and extensible, enabling developers to tailor every aspect of the editing experience. The same SDK works cross-platform, Web, iOS, Android, Desktop, and Server, so teams can build consistent creative tools across environments.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;By combining CE.SDK’s robust editing engine with the &lt;a href=&quot;https://img.ly/showcases/cesdk/indesign-template-import/web&quot;&gt;&lt;strong&gt;InDesign Importer&lt;/strong&gt;&lt;/a&gt;, you can now &lt;strong&gt;bring InDesign templates (IDML files) into a fully fledged web-based design editor&lt;/strong&gt; while preserving essential layout, style, and asset information. The result: true browser editing of InDesign content, without the limitations of traditional desktop software.&lt;/p&gt;
&lt;h2 id=&quot;the-current-landscape-whats-possible-and-what-isnt-with-indesign-on-the-web&quot;&gt;&lt;strong&gt;The Current Landscape: What’s Possible (and What Isn’t) with InDesign on the Web&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;While creative teams increasingly expect collaborative, browser-based tools, Adobe InDesign remains deeply rooted in its desktop heritage. Its powerful layout engine and proprietary file structure were never designed for real-time, cloud-native editing. As a result, teams who rely on InDesign often face friction when trying to make designs accessible to clients or other stakeholders online.&lt;/p&gt;
&lt;p&gt;Adobe has made incremental steps toward the web, but these tools still serve limited purposes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://helpx.adobe.com/indesign/using/share-for-review.html?utm_source=chatgpt.com&quot;&gt;&lt;strong&gt;Share for Review&lt;/strong&gt;&lt;/a&gt; – enables commenting and approval workflows in the browser, but doesn’t allow editing or layout changes.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://helpx.adobe.com/indesign/using/incopy-web.html?utm_source=chatgpt.com&quot;&gt;&lt;strong&gt;InCopy on the Web (beta)&lt;/strong&gt;&lt;/a&gt; – offers browser-based text editing within locked layouts. It’s useful for copy review, yet visual elements remain untouchable.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://helpx.adobe.com/indesign/using/export-to-express.html&quot;&gt;&lt;strong&gt;Adobe Express export&lt;/strong&gt;&lt;/a&gt; – lets designers repurpose InDesign layouts as simplified templates for lightweight editing, but the process is one-way and loses much of InDesign’s fidelity and control.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For teams that need to &lt;strong&gt;deliver editable templates, enable client-side personalization, or embed creative workflows inside their own platforms&lt;/strong&gt;, these options aren’t sufficient. They lack extensibility, API access, and the ability to maintain brand-level control in a web environment.&lt;/p&gt;
&lt;h3 id=&quot;beyond-adobe-existing-alternatives&quot;&gt;&lt;strong&gt;Beyond Adobe: Existing Alternatives&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Several third-party tools have tried to fill the gap:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://viva.systems/designer&quot;&gt;&lt;strong&gt;VivaDesigner&lt;/strong&gt;&lt;/a&gt; mirrors parts of InDesign’s functionality in a browser, but operates as a self-contained product rather than an embeddable SDK.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.siliconpublishing.com/designer/&quot;&gt;&lt;strong&gt;Silicon Designer&lt;/strong&gt;&lt;/a&gt; builds on InDesign Server to power web-to-print solutions, but depends on heavy backend infrastructure and costly licensing.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.photopea.com/&quot;&gt;&lt;strong&gt;Photopea&lt;/strong&gt;&lt;/a&gt; provides impressive browser editing for layered graphics and basic IDML files, yet lacks enterprise-grade extensibility or workflow integration.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each of these solutions demonstrates what’s possible, but none offer a developer-friendly foundation for building editing workflows and experience on-top of InDesign in the browser.&lt;/p&gt;
&lt;h3 id=&quot;where-imglys-cesdk-fits-in&quot;&gt;&lt;strong&gt;Where IMG.LY’s CE.SDK Fits In&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;This is the gap that CE.SDK fills.&lt;/p&gt;
&lt;p&gt;Instead of emulating InDesign’s desktop application, CE.SDK focuses on &lt;strong&gt;data translation and browser-native rendering&lt;/strong&gt;. Its &lt;strong&gt;InDesign Importer&lt;/strong&gt; converts the open IDML format into CE.SDK’s optimized scene format retaining layout structure, typography, and key design elements so users can edit and export designs directly in the browser and all other platforms supported by CE.SDK.&lt;/p&gt;
&lt;p&gt;For developers, this approach unlocks a new level of flexibility:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Embed an editable InDesign experience in any web platform.&lt;/li&gt;
&lt;li&gt;Integrate design editing into DAMs, CMSs, or creative automation workflows.&lt;/li&gt;
&lt;li&gt;Customize UI, behaviors, and integrations to match existing systems.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In short, CE.SDK transforms what used to be static, desktop-bound InDesign files into &lt;strong&gt;interactive, web-based design templates&lt;/strong&gt;, without compromising control or scalability.&lt;/p&gt;
&lt;h2 id=&quot;introducing-the-cesdk-indesign-importer&quot;&gt;&lt;strong&gt;Introducing the CE.SDK InDesign Importer&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;video src=&quot;https://blog.img.ly/2025/11/indesign-importer-creative-sdk-martech-saas-whitelabel-imgly.mp4&quot; controls autoplay muted loop playsinline&gt;&lt;/video&gt;&lt;/p&gt;
&lt;p&gt;Moving professional InDesign layouts into the browser isn’t just about file conversion, it’s about &lt;strong&gt;accurately translating complex design data&lt;/strong&gt; into a web-native format that can be rendered, edited, and automated.&lt;/p&gt;
&lt;p&gt;That’s exactly what the &lt;strong&gt;CE.SDK InDesign Importer&lt;/strong&gt; does.&lt;/p&gt;
&lt;p&gt;The importer acts as a bridge between &lt;strong&gt;Adobe InDesign’s IDML format&lt;/strong&gt; and &lt;strong&gt;CE.SDK’s scene model&lt;/strong&gt;, transforming desktop-authored layouts into editable, browser-ready projects. Once an &lt;code&gt;.idml&lt;/code&gt; file is exported from InDesign, the importer reconstructs its layers, assets, and properties, packaging them into a CE.SDK scene archive that can be opened instantly inside any CE.SDK instance.&lt;/p&gt;
&lt;p&gt;Explore the &lt;a href=&quot;https://img.ly/showcases/cesdk/indesign-template-import/web&quot;&gt;InDesign Template Import Demo&lt;/a&gt; for a comprehensive example.&lt;/p&gt;
&lt;h3 id=&quot;a-stand-alone-module-built-for-integration&quot;&gt;&lt;strong&gt;A Stand-Alone Module, Built for Integration&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Unlike the core CE.SDK editor, the InDesign Importer is distributed as a &lt;strong&gt;stand-alone package&lt;/strong&gt; that you can integrate into any workflow. It’s available via npm as&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.npmjs.com/package/@imgly/idml-importer/v/1.1.1&quot;&gt;&lt;code&gt;@imgly/idml-importer&lt;/code&gt;&lt;/a&gt;,&lt;/p&gt;
&lt;p&gt;allowing developers to run imports in their own build systems, servers, or client-side applications before loading the resulting scene into CE.SDK.&lt;/p&gt;
&lt;p&gt;This separation makes it easy to slot the importer into existing pipelines, for example, automated template ingestion systems, DAM integrations, or internal pre-processing tools — without requiring the full editor runtime.&lt;/p&gt;
&lt;h3 id=&quot;how-it-fits-into-the-cesdk-ecosystem&quot;&gt;&lt;strong&gt;How It Fits into the CE.SDK Ecosystem&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;CE.SDK&lt;/strong&gt; (CreativeEditor SDK) is an &lt;strong&gt;embeddable creative editor&lt;/strong&gt; powering photo, video, and design workflows across &lt;strong&gt;Web, iOS, Android, Desktop, and Server&lt;/strong&gt;. It offers a modular, extensible engine and UI framework that teams can tailor to any brand or use case.&lt;/p&gt;
&lt;p&gt;The InDesign Importer extends that ecosystem by unlocking compatibility with one of the most widely used layout tools in the world. Together, they enable a complete pipeline:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;InDesign (IDML) → @imgly/idml-importer → CE.SDK Scene File → Browser Editing &amp;#x26; Automation&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This means existing InDesign templates can become live, editable browser experiences — without rebuilding designs manually or deploying heavy server infrastructure.&lt;/p&gt;
&lt;h3 id=&quot;what-the-importer-delivers&quot;&gt;&lt;strong&gt;What the Importer Delivers&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;File-Format Translation&lt;/strong&gt; – Converts IDML files into CE.SDK scene archives while preserving layout hierarchy, positioning, and grouping.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Asset Bundling&lt;/strong&gt; – Packages fonts, embedded images, and color data for immediate use in CE.SDK.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Color Mapping&lt;/strong&gt; – Converts CMYK values into RGB for web rendering (native CMYK support is in development).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Element Preservation&lt;/strong&gt; – Maintains grouping, rotation, shapes (rectangles, ovals, polygons, lines), gradients, transparency, and strokes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Developer Flexibility&lt;/strong&gt; – Import locally or at scale, feed the resulting scene into CE.SDK’s API, or integrate into automated asset pipelines.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;real-world-use-cases--workflows&quot;&gt;&lt;strong&gt;Real-World Use Cases &amp;#x26; Workflows&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Once an InDesign file becomes editable in the browser, entirely new workflows open up — from collaborative editing to automated content generation.&lt;/p&gt;
&lt;p&gt;The CE.SDK InDesign Importer enables organizations to extend proven InDesign templates into scalable, web-native experiences:&lt;/p&gt;
&lt;h3 id=&quot;web-to-print-platforms&quot;&gt;&lt;strong&gt;Web-to-Print Platforms&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Allow end users to personalize marketing collateral, business cards, or packaging directly in a browser editor while maintaining the designer’s original layout integrity.&lt;/p&gt;
&lt;h3 id=&quot;brand-template-portals&quot;&gt;&lt;strong&gt;Brand Template Portals&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Empower distributed teams, agencies, or franchise partners to create on-brand materials without ever touching desktop software. Designers upload InDesign templates once; users edit and export variations on demand.&lt;/p&gt;
&lt;h3 id=&quot;creative-automation-systems&quot;&gt;&lt;strong&gt;Creative Automation Systems&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Combine CE.SDK with data pipelines to automatically generate localized or personalized assets at scale — replacing time-consuming manual layout work with programmable design workflows.&lt;/p&gt;
&lt;h3 id=&quot;client-collaboration&quot;&gt;&lt;strong&gt;Client Collaboration&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Deliver interactive proofing experiences where clients can adjust copy, swap images, or approve layouts in a controlled browser environment, eliminating the “export–review–revise” loop typical of InDesign-based projects.&lt;/p&gt;
&lt;p&gt;Each of these use cases builds on the same foundation: reliable IDML translation plus CE.SDK’s flexible editing engine.&lt;/p&gt;
&lt;p&gt;That combination makes the Importer not just a conversion tool, but a bridge to &lt;strong&gt;entirely new creative business models&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;cesdk-vs-traditional-indesign-server--other-alternatives&quot;&gt;&lt;strong&gt;CE.SDK vs. Traditional InDesign Server &amp;#x26; Other Alternatives&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;For teams exploring browser-based design editing, the landscape typically centers on three paths — &lt;strong&gt;InDesign Server&lt;/strong&gt;, &lt;strong&gt;web-to-print middleware&lt;/strong&gt;, or &lt;strong&gt;browser SDKs&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The CE.SDK InDesign Importer offers a modern alternative to all three.&lt;/p&gt;















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Feature / Capability&lt;/th&gt;&lt;th&gt;&lt;strong&gt;InDesign Server&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;Third-Party Tools (VivaDesigner, Silicon Designer)&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;CE.SDK + InDesign Importer&lt;/strong&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Editing Fidelity&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Full but desktop-rendered&lt;/td&gt;&lt;td&gt;Partial; varies by implementation&lt;/td&gt;&lt;td&gt;High; layout preserved via IDML&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Web Accessibility&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Limited; server-side only&lt;/td&gt;&lt;td&gt;Browser UI, but closed systems&lt;/td&gt;&lt;td&gt;Fully client-side, browser-native&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Embeddable / SDK&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Proprietary&lt;/td&gt;&lt;td&gt;Yes + modular npm packages&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Infrastructure&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Requires Adobe licensing &amp;#x26; server setup&lt;/td&gt;&lt;td&gt;Vendor-hosted&lt;/td&gt;&lt;td&gt;Lightweight; deploy anywhere&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Extensibility&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Restricted scripting&lt;/td&gt;&lt;td&gt;Limited&lt;/td&gt;&lt;td&gt;Full API &amp;#x26; UI customization&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Cost / Licensing&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;High, per-instance&lt;/td&gt;&lt;td&gt;Varies; often enterprise-only&lt;/td&gt;&lt;td&gt;Predictable developer friendly licensing&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;CE.SDK’s approach eliminates the dependency on server-side rendering and proprietary hosting, providing &lt;strong&gt;a developer-first, browser-native foundation&lt;/strong&gt; for creative editing.&lt;/p&gt;
&lt;p&gt;By translating InDesign layouts into open CE.SDK scenes, it combines &lt;strong&gt;professional-grade fidelity&lt;/strong&gt; with the &lt;strong&gt;flexibility of modern web architecture&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;conclusion--a-new-era-for-indesign-workflows&quot;&gt;&lt;strong&gt;Conclusion – A New Era for InDesign Workflows&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;For years, creative teams have struggled to bridge the gap between &lt;strong&gt;InDesign’s print-grade precision&lt;/strong&gt; and the &lt;strong&gt;web’s flexibility and scalability&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;CE.SDK InDesign Importer&lt;/strong&gt; closes that gap — turning traditional &lt;code&gt;.indd&lt;/code&gt; projects into browser-ready, editable templates that can live inside any modern application.&lt;/p&gt;
&lt;p&gt;Whether you’re building a &lt;strong&gt;web-to-print platform&lt;/strong&gt;, empowering clients through &lt;strong&gt;self-service editing&lt;/strong&gt;, or connecting templates to &lt;strong&gt;creative-automation pipelines&lt;/strong&gt;, CE.SDK provides the foundation to make it happen — with full developer control and a consistent experience across Web, Mobile, and Desktop.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Explore the live demo: &lt;a href=&quot;https://img.ly/showcases/cesdk/indesign-template-import/web&quot;&gt;InDesign Template Import Demo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Try the importer: &lt;a href=&quot;https://www.npmjs.com/package/@imgly/idml-importer/v/1.1.1&quot;&gt;&lt;code&gt;@imgly/idml-importer&lt;/code&gt; on npm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Learn more about CE.SDK: &lt;a href=&quot;https://img.ly/products/creative-sdk&quot;&gt;https://img.ly/products/creative-sdk&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;frequently-asked-questions&quot;&gt;&lt;strong&gt;Frequently Asked Questions&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;can-i-edit-an-indesign-file-directly-in-a-browser&quot;&gt;&lt;strong&gt;Can I edit an InDesign file directly in a browser?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Not with Adobe’s native tools alone — &lt;em&gt;Share for Review&lt;/em&gt; and &lt;em&gt;InCopy on the Web&lt;/em&gt; only allow commenting or text changes. With the &lt;strong&gt;CE.SDK InDesign Importer&lt;/strong&gt;, however, you can convert an exported IDML file into a browser-editable format that retains layout, fonts, and key visual elements.&lt;/p&gt;
&lt;h3 id=&quot;what-file-formats-does-the-importer-support&quot;&gt;&lt;strong&gt;What file formats does the importer support?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;The importer reads &lt;strong&gt;IDML&lt;/strong&gt; files exported from Adobe InDesign and converts them into &lt;strong&gt;CE.SDK scene archives&lt;/strong&gt;. These can then be opened in CE.SDK for full browser editing and exported again to formats such as &lt;strong&gt;PDF, PNG, or JSON&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;does-it-require-adobe-indesign-server&quot;&gt;&lt;strong&gt;Does it require Adobe InDesign Server?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;No. The &lt;strong&gt;@imgly/idml-importer&lt;/strong&gt; runs independently — it’s a standalone npm package and doesn’t depend on InDesign Server or any Adobe infrastructure. You only need an IDML export from InDesign.&lt;/p&gt;
&lt;h3 id=&quot;is-cmyk-color-supported&quot;&gt;&lt;strong&gt;Is CMYK color supported?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Currently, CMYK values are automatically translated into RGB for accurate web rendering. Native CMYK support is planned in future updates.&lt;/p&gt;
&lt;h3 id=&quot;can-i-automate-bulk-imports&quot;&gt;&lt;strong&gt;Can I automate bulk imports?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Yes. Because the importer is installable via npm, you can integrate it into scripts or pipelines to process large template libraries automatically before loading them into CE.SDK.&lt;/p&gt;
&lt;h3 id=&quot;do-imported-indesign-templates-remain-editable-for-non-designers&quot;&gt;&lt;strong&gt;Do imported InDesign templates remain editable for non-designers?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Absolutely. Once loaded into CE.SDK, templates can be edited through a customizable browser interface — ideal for client portals, marketing platforms, or self-service brand editors.&lt;/p&gt;
</content:encoded><dc:creator>Jan</dc:creator><media:content url="https://blog.img.ly/2025/10/edit-indesign-file-in-browser.jpg" medium="image"/><category>Insights</category><category>Design Editor</category><category>Creative Workflows</category></item><item><title>Animate Between Images - AI-Native Video Workflows with CE.SDK and Veo 3</title><link>https://img.ly/blog/animate-between-images-ai-native-video-workflows-with-ce-sdk-and-veo-3/</link><guid isPermaLink="true">https://img.ly/blog/animate-between-images-ai-native-video-workflows-with-ce-sdk-and-veo-3/</guid><description>See how we integrated Veo 3.1 into CE.SDK to animate between images in seconds. With generation times as low as 9 s, this demo shows how easily you can embed AI-native workflows from stills to smooth video clips directly inside your Creative Editor.</description><pubDate>Wed, 22 Oct 2025 14:10:31 GMT</pubDate><content:encoded>&lt;p&gt;With the release of &lt;a href=&quot;https://aistudio.google.com/models/veo-3&quot;&gt;&lt;strong&gt;Veo 3.1&lt;/strong&gt;,&lt;/a&gt; we wanted to show just how effortless it is to embed generative AI capabilities directly into creative workflows. In this quick demo, we integrated Veo 3 into &lt;strong&gt;CreativeEditor SDK (CE.SDK)&lt;/strong&gt; enabling users to &lt;strong&gt;animate between two still images&lt;/strong&gt; in just a few clicks.&lt;/p&gt;
&lt;p&gt;&lt;video src=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/ai-launch/IMG-LY-CE-SDK-veo-3-1-video-design-editor-sdk.mp4&quot; controls autoplay muted loop playsinline&gt;&lt;/video&gt;&lt;/p&gt;
&lt;h3 id=&quot;from-still-images-to-motion&quot;&gt;From Still Images to Motion&lt;/h3&gt;
&lt;p&gt;In our demo, we start with two images of the same person, one wearing a hat, the other without. Inside the editor, users simply select both images, click the &lt;strong&gt;AI context button&lt;/strong&gt;, and choose &lt;strong&gt;“Animate between images.”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The images are loaded into a side panel where users can optionally add a &lt;strong&gt;text prompt&lt;/strong&gt; to guide the transition. Once generated, the resulting short video is placed directly on the canvas ready for editing, compositing, or export.&lt;/p&gt;
&lt;p&gt;What’s particularly impressive is the &lt;strong&gt;generation speed&lt;/strong&gt;. In this example, Veo 3.1 produced a smooth &lt;strong&gt;8-second transition in just 9 seconds&lt;/strong&gt; a major improvement compared to earlier versions. This speed makes iterative creative workflows feel fluid and responsive, bridging the gap between prompt-driven generation and real-time editing.&lt;/p&gt;
&lt;h3 id=&quot;try-it-out&quot;&gt;Try It Out&lt;/h3&gt;
&lt;p&gt;&lt;img alt=&quot;Try out Veo 3.1&amp;#39;s magic in CE.SDK.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1312px) 1312px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1312&quot; height=&quot;310&quot; src=&quot;https://img.ly/_astro/veo-fal-ai-video-editor-sdk-ce_sdk-imgly_Z2d7vDi.webp&quot; srcset=&quot;/_astro/veo-fal-ai-video-editor-sdk-ce_sdk-imgly_z0ja6.webp 640w, /_astro/veo-fal-ai-video-editor-sdk-ce_sdk-imgly_Z1ivUdP.webp 750w, /_astro/veo-fal-ai-video-editor-sdk-ce_sdk-imgly_Zs5oeI.webp 828w, /_astro/veo-fal-ai-video-editor-sdk-ce_sdk-imgly_ZkhHeU.webp 1080w, /_astro/veo-fal-ai-video-editor-sdk-ce_sdk-imgly_Z20tepT.webp 1280w, /_astro/veo-fal-ai-video-editor-sdk-ce_sdk-imgly_Z2d7vDi.webp 1312w&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can check out the implementation on &lt;a href=&quot;https://github.com/imgly/plugins/blob/main/examples/ai/src/pages/Veo31Example.tsx&quot;&gt;GitHub&lt;/a&gt; and give Veo 3.1 a spin inside your CE.SDK instance (sign up for a &lt;a href=&quot;https://img.ly/forms/free-trial&quot;&gt;free trial&lt;/a&gt; if you haven’t already).&lt;/p&gt;
&lt;h3 id=&quot;a-glimpse-of-ai-native-editing&quot;&gt;A Glimpse of AI-Native Editing&lt;/h3&gt;
&lt;p&gt;This simple feature highlights how easy it is to make your editor &lt;strong&gt;AI-native,&lt;/strong&gt; combining traditional editing tools with generative intelligence.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Practical use cases include:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;E-commerce&lt;/strong&gt;&lt;br&gt;
Show products “in action” or animate between styles and configurations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Marketing&lt;/strong&gt;&lt;br&gt;
Create quick product reveal animations from static assets.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content creation&lt;/strong&gt;&lt;br&gt;
Generate short motion clips or “tween” between creative scenes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And if users want longer clips, they can simply &lt;strong&gt;add another 8-second track&lt;/strong&gt; and &lt;strong&gt;transition seamlessly&lt;/strong&gt; into the next.&lt;/p&gt;
&lt;h3 id=&quot;the-future-of-creative-workflows&quot;&gt;The Future of Creative Workflows&lt;/h3&gt;
&lt;p&gt;With Veo 3 integrated, CE.SDK becomes a powerful playground for AI-driven creativity from image-to-video to scene interpolation and contextual animation.&lt;/p&gt;
&lt;p&gt;We already empowered over 600 innovative startups, government entities, and Fortune 500 companies to add powerful design, video, and photo editing workflows to their products. &lt;a href=&quot;https://img.ly/forms/contact-sales?ref=img.ly&quot;&gt;Get in touch&lt;/a&gt;, to see how we can do the same for you.&lt;/p&gt;</content:encoded><dc:creator>Jan</dc:creator><dc:creator>Marcin</dc:creator><media:content url="https://blog.img.ly/2025/10/veo-3_1-creative-editor-sdk-video-editor-imgly-2.jpg" medium="image"/><category>AI</category><category>Video Editing</category><category>Image2Video</category></item><item><title>A Guide to Creative Automation with CE.SDK &amp; Javascript</title><link>https://img.ly/blog/a-guide-to-creative-automation-with-ce-sdk-javascript/</link><guid isPermaLink="true">https://img.ly/blog/a-guide-to-creative-automation-with-ce-sdk-javascript/</guid><description>Discover how to build end-to-end creative automation with CE.SDK and React. This guide shows you how to create templates with placeholders, connect them to external data, and automatically generate personalized assets at scale.</description><pubDate>Fri, 05 Sep 2025 11:14:31 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/embed/GtORNyzjOq0?feature=oembed&quot;&gt;https://www.youtube.com/embed/GtORNyzjOq0?feature=oembed&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;what-is-creative-automation&quot;&gt;What is Creative Automation?&lt;/h2&gt;
&lt;p&gt;Creative Automation is the process of generating visual content, images, videos, designs, programmatically, often in response to structured inputs like product data, user attributes, or campaign parameters.&lt;/p&gt;
&lt;p&gt;Instead of designing each asset manually, creative automation enables you to define templates and rules that the system uses to produce content at scale.&lt;/p&gt;
&lt;p&gt;This approach accelerates production workflows and enables personalization at scale, multivariate testing, and omni-channel consistency without stretching design resources.&lt;/p&gt;
&lt;h2 id=&quot;creative-automation--generative-ai&quot;&gt;Creative Automation &amp;#x26; Generative AI&lt;/h2&gt;
&lt;p&gt;Of course, you cannot talk about creative automation in this day and age without also discussing the role of generative AI. Gen AI introduces intelligent content generation into the pipeline making it easy to generate headlines, product descriptions and entire design elements like illustrations, videos or voiceovers and background music.&lt;/p&gt;
&lt;p&gt;When paired with a robust editing and rendering engine like &lt;strong&gt;CE.SDK&lt;/strong&gt;, generative AI becomes even more powerful. A design editor that sits at the intersection between the human decision maker and raw AI generated creatives ensures that those creatives can be curated, refined and deployed in an orderly fashion. This usually works by employing design templates that provide extension points for dynamic data through variables and placeholders and that AI generated content can be merged into for a brand-safe final creative.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://img.ly/case-studies/omneky&quot;&gt;Our customer Omneky&lt;/a&gt; provides an excellent example of how these components can be orchestrated for maximum efficiency and productivity. Omneky is an ad tech platform that uses generative AI to automatically generate creatives and ad copy for a company based on their product and positioning, these are then interpolated into CE.SDK template to create ad variations. These variations are then tested across ad channels and the results used to inform further refinement and ad selection. This is a prime example of how to combine creative automation and editors to tame the chaotic fountain of AI creatives.&lt;/p&gt;
&lt;h2 id=&quot;how-cesdk-enables-creative-automation&quot;&gt;How CE.SDK Enables Creative Automation&lt;/h2&gt;
&lt;p&gt;Let us get into the meat and potatoes of creative automation and sketch out the requirements of a creative automation solution and an end to end example with CE.SDK. &lt;a href=&quot;https://img.ly/products/creative-sdk&quot;&gt;IMG.LY’s &lt;strong&gt;CreativeEditor SDK (CE.SDK)&lt;/strong&gt;&lt;/a&gt; offers both a user interface for design-time flexibility and a graphics processing engine API for runtime automation.&lt;/p&gt;
&lt;h3 id=&quot;design-once-automate-everywhere&quot;&gt;Design Once, Automate Everywhere&lt;/h3&gt;
&lt;p&gt;With CE.SDK, you create &lt;strong&gt;design templates&lt;/strong&gt; that define placeholders, variables, and lockable design elements. These templates ensure brand consistency while allowing dynamic content generation. Whether you’re building social ads, team cards, or product visuals, the structure remains stable while the content varies. The diagram below illustrates these components using a classical mail merge example. The user creates a design template within the editor and defines certain variables like &lt;code&gt;first_name&lt;/code&gt; and &lt;code&gt;address&lt;/code&gt;, a data source of address data can now be merged with this template using the engine API: &lt;code&gt;variable: setString&lt;/code&gt; to create an individualized postcard for every data point in the set:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 2106px) 2106px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;2106&quot; height=&quot;1142&quot; src=&quot;https://img.ly/_astro/Screenshot-2025-09-02-at-10.37.28_t8Kns.webp&quot; srcset=&quot;/_astro/Screenshot-2025-09-02-at-10.37.28_1dUVmO.webp 640w, /_astro/Screenshot-2025-09-02-at-10.37.28_Zk7OGd.webp 750w, /_astro/Screenshot-2025-09-02-at-10.37.28_1R5JUa.webp 828w, /_astro/Screenshot-2025-09-02-at-10.37.28_ZChl63.webp 1080w, /_astro/Screenshot-2025-09-02-at-10.37.28_1aY7if.webp 1280w, /_astro/Screenshot-2025-09-02-at-10.37.28_1hkYAr.webp 1668w, /_astro/Screenshot-2025-09-02-at-10.37.28_Z1X6d9H.webp 2048w, /_astro/Screenshot-2025-09-02-at-10.37.28_t8Kns.webp 2106w&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;under-the-hood-cesdk-architecture&quot;&gt;Under the Hood: CE.SDK Architecture&lt;/h2&gt;
&lt;p&gt;In order to fully understand how to implement creative automation workflows with CE.SDK we need a basic mental model of its architecture. CE.SDK is built on two distinct layers, giving you total flexibility and control.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;UI Layer&lt;/strong&gt; is the customizable frontend allowing users to design and edit different media types from photos, design compositions such as collages, videos or mixed media.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Engine Layer&lt;/strong&gt; exposes the Creative Engine, CE.SDK’s core rendering and editing engine, through an API. The architecture of CE.SDK is built around a layered approach that separates concerns while ensuring cross-platform consistency:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;**Engine Core (C++)**At the foundation lies the &lt;strong&gt;Creative Engine&lt;/strong&gt;, a high-performance rendering and editing core written in C++. This is where all processing, layouting, and rendering logic happens, guaranteeing precision and fidelity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API Layer&lt;/strong&gt;On top of the core sits the &lt;strong&gt;API Layer&lt;/strong&gt;, which exposes the engine’s capabilities in a consistent, high-level interface. This abstraction allows developers to focus on creative logic without dealing directly with low-level rendering details.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross-Platform Targets&lt;/strong&gt;The same engine and API are &lt;strong&gt;cross-compiled to iOS, Android, Web, and server environments&lt;/strong&gt;, ensuring that rendering results remain identical regardless of platform. This uniformity is critical for automation workflows, where assets may be produced or consumed across multiple devices and services.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Headless Mode&lt;/strong&gt;Beyond powering interactive UIs, the engine can also be run &lt;strong&gt;headlessly&lt;/strong&gt;. In this mode, CE.SDK operates without a frontend, enabling automated scenarios such as bulk rendering of images or videos, dynamic template generation, and data-driven personalization at scale.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This modular architecture ensures that whether you are building a &lt;strong&gt;custom editing UI&lt;/strong&gt; or running &lt;strong&gt;automated creative workflows on the server&lt;/strong&gt;, every output is backed by the same reliable, cross-platform engine.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1926px) 1926px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1926&quot; height=&quot;1880&quot; src=&quot;https://img.ly/_astro/CESDK-architecture_283XmL.webp&quot; srcset=&quot;/_astro/CESDK-architecture_Z27QaY4.webp 640w, /_astro/CESDK-architecture_1cBoGo.webp 750w, /_astro/CESDK-architecture_WALWv.webp 828w, /_astro/CESDK-architecture_zTc2L.webp 1080w, /_astro/CESDK-architecture_ZjscFX.webp 1280w, /_astro/CESDK-architecture_Zx5Uoe.webp 1668w, /_astro/CESDK-architecture_283XmL.webp 1926w&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;how-to-integrate-creative-automation-into-your-workflow&quot;&gt;How to Integrate Creative Automation into Your Workflow&lt;/h2&gt;
&lt;h3 id=&quot;step-1-integrate-cesdk&quot;&gt;Step 1: Integrate CE.SDK&lt;/h3&gt;
&lt;p&gt;Even if you don’t plan to use the CE.SDK UI for end users, you still need to spin it up locally or within internal tooling to create templates. Let’s install CE.SDK and configure it to the advanced UI, in Creator mode.&lt;/p&gt;
&lt;p&gt;CE.SDK by default comes with two UI flavors. The design or default UI config exposes all the essentials for productive design editing by most users, ideal for adapting templates. An advanced UI fine grained editing controls and the ability to define placeholder elements and control what users can change.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The “Creator” role allows setting constraints on template elements, while the “Adopter” role is focused on adapting these elements.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Creator: Set constraints and manage template settings.&lt;/li&gt;
&lt;li&gt;Adopter: Edit elements within the bounds set by the Creator.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Install CE.SDK following &lt;a href=&quot;https://img.ly/docs/cesdk/js/get-started/overview-e18f40/&quot;&gt;one of our guides&lt;/a&gt; and explore the entire &lt;a href=&quot;https://img.ly/showcases/cesdk/headless-design/web&quot;&gt;demo here.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can find the complete demo here&lt;/p&gt;
&lt;h3 id=&quot;configuring-cesdk-for-template-creation&quot;&gt;Configuring CE.SDK for Template Creation&lt;/h3&gt;
&lt;p&gt;Below is a sample configuration. Notice how we set &lt;code&gt;role: &apos;Creator&apos;&lt;/code&gt; and &lt;code&gt;view: &apos;advanced&apos;&lt;/code&gt; to unlock template authoring features. We also configure an &lt;code&gt;onSave&lt;/code&gt; callback to export complete &lt;strong&gt;template archives&lt;/strong&gt; — these include all necessary resources (images, fonts, stickers, etc.) in a &lt;strong&gt;self-contained package&lt;/strong&gt;. Archives are what you’ll deliver to adopters or use for data-driven automation later.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; config&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  theme: &lt;/span&gt;&lt;span&gt;&apos;dark&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  role: &lt;/span&gt;&lt;span&gt;&apos;Creator&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  callbacks: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    onExport: &lt;/span&gt;&lt;span&gt;&apos;download&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    onUpload: &lt;/span&gt;&lt;span&gt;&apos;local&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    onSave&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;sceneString&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; string&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      try&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        // assumes engine is available in scope&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        const&lt;/span&gt;&lt;span&gt; blob&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; await&lt;/span&gt;&lt;span&gt; engine.scene.&lt;/span&gt;&lt;span&gt;saveToArchive&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        const&lt;/span&gt;&lt;span&gt; formData&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; FormData&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        formData.&lt;/span&gt;&lt;span&gt;append&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;file&apos;&lt;/span&gt;&lt;span&gt;, blob);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        await&lt;/span&gt;&lt;span&gt; fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;/upload&apos;&lt;/span&gt;&lt;span&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          method: &lt;/span&gt;&lt;span&gt;&apos;POST&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          body: formData,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      } &lt;/span&gt;&lt;span&gt;catch&lt;/span&gt;&lt;span&gt; (error) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        console.&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;Save failed&apos;&lt;/span&gt;&lt;span&gt;, error);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  ui: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    elements: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      view: &lt;/span&gt;&lt;span&gt;&apos;advanced&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      panels: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        inspector: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          show: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          position: &lt;/span&gt;&lt;span&gt;&apos;right&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      dock: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        iconSize: &lt;/span&gt;&lt;span&gt;&apos;normal&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        hideLabels: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      navigation: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        action: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          export: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            show: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            format: [&lt;/span&gt;&lt;span&gt;&apos;image/png&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;application/pdf&apos;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;step-2-build-smart-templates&quot;&gt;Step 2: Build Smart Templates&lt;/h3&gt;
&lt;p&gt;With CE.SDK running in &lt;strong&gt;Creator mode&lt;/strong&gt;, we can now define &lt;strong&gt;editable templates&lt;/strong&gt;. These templates can include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Named blocks&lt;/strong&gt; → Easy-to-reference design regions (e.g., &lt;code&gt;PodcastCover&lt;/code&gt;, &lt;code&gt;PodcastBadge&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Variables&lt;/strong&gt; → Text placeholders enclosed in double curly braces (e.g., &lt;code&gt;{{Message}}&lt;/code&gt;, &lt;code&gt;{{PodcastName}}&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For example, here’s a &lt;strong&gt;podcast cover template&lt;/strong&gt; with two text variables and named blocks. The variables make it possible to inject data programmatically later.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Podcast template:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- Variables: {{Message}}, {{PodcastName}}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- Named blocks: PodcastCover, PodcastBadge&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Since we’re in Creator mode, we can also enforce &lt;strong&gt;brand constraints,&lt;/strong&gt; for instance, locking background colors, logos, or fonts so that adopters (or automated processes) don’t accidentally override brand-critical assets.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 2000px) 2000px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;2000&quot; height=&quot;1053&quot; src=&quot;https://img.ly/_astro/Screenshot-2025-09-04-at-13.01.25_Zk5tHC.webp&quot; srcset=&quot;/_astro/Screenshot-2025-09-04-at-13.01.25_1q0By1.webp 640w, /_astro/Screenshot-2025-09-04-at-13.01.25_ZPg61j.webp 750w, /_astro/Screenshot-2025-09-04-at-13.01.25_Z24JzkD.webp 828w, /_astro/Screenshot-2025-09-04-at-13.01.25_ZMaA2F.webp 1080w, /_astro/Screenshot-2025-09-04-at-13.01.25_ZnnIT1.webp 1280w, /_astro/Screenshot-2025-09-04-at-13.01.25_Z1HnUMn.webp 1668w, /_astro/Screenshot-2025-09-04-at-13.01.25_Zk5tHC.webp 2000w&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;step-3-automate-asset-creation&quot;&gt;Step 3: Automate Asset Creation&lt;/h3&gt;
&lt;p&gt;Once you have a template, the next step is automation. Using the &lt;strong&gt;headless Creative Engine&lt;/strong&gt;, you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Populate placeholders with &lt;strong&gt;external data&lt;/strong&gt; (e.g., from APIs).&lt;/li&gt;
&lt;li&gt;Swap images, update text variables, or adjust styling dynamically.&lt;/li&gt;
&lt;li&gt;Export the results at scale into formats like PNG, PDF, or even video.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;example-dynamic-podcast-covers&quot;&gt;Example: Dynamic Podcast Covers&lt;/h3&gt;
&lt;p&gt;In this demo, we connect to the &lt;strong&gt;Apple iTunes API&lt;/strong&gt; to fetch podcast data. Whenever a podcast is selected (or user input changes), our &lt;code&gt;fillTemplate&lt;/code&gt; function updates the CE.SDK scene.&lt;/p&gt;
&lt;p&gt;&lt;video src=&quot;https://blog.img.ly/2025/09/podcast-data-source.mov&quot; controls autoplay muted loop playsinline&gt;&lt;/video&gt;&lt;/p&gt;
&lt;p&gt;Key concepts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Blocks API&lt;/strong&gt; → Query template blocks by name (&lt;code&gt;engine.block.findByName(&apos;PodcastBadge&apos;)&lt;/code&gt;) and replace their fills.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fills&lt;/strong&gt; → Blocks can have images, solid colors, gradients, or videos. For podcast artwork, we set &lt;code&gt;imageFileURI&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Variables API&lt;/strong&gt; → Set text variables directly (&lt;code&gt;engine.variable.setString(&apos;Message&apos;, &apos;Hello World&apos;)&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt; const&lt;/span&gt;&lt;span&gt; fillTemplate&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;engine&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; CreativeEngine&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;page&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; number&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; { r, g, b } &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; backgroundColorRGBA;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    engine.block.&lt;/span&gt;&lt;span&gt;setColor&lt;/span&gt;&lt;span&gt;(page, &lt;/span&gt;&lt;span&gt;&apos;fill/solid/color&apos;&lt;/span&gt;&lt;span&gt;, { r, g, b, a: &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; (podcast) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      const&lt;/span&gt;&lt;span&gt; photoBlocks&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; engine.block.&lt;/span&gt;&lt;span&gt;findByName&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;PodcastCover&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      photoBlocks.&lt;/span&gt;&lt;span&gt;forEach&lt;/span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;photoBlock&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; number&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        const&lt;/span&gt;&lt;span&gt; photoFillBlock&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; engine.block.&lt;/span&gt;&lt;span&gt;getFill&lt;/span&gt;&lt;span&gt;(photoBlock);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        engine.block.&lt;/span&gt;&lt;span&gt;setString&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          photoFillBlock,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          &apos;fill/image/imageFileURI&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          podcast.artworkUrl600&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    const&lt;/span&gt;&lt;span&gt; colorTheme&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; getThemeColorFromBackgroundColor&lt;/span&gt;&lt;span&gt;(backgroundColorRGBA);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    const&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;badgeBlock&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; engine.block.&lt;/span&gt;&lt;span&gt;findByName&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;PodcastBadge&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    engine.block.&lt;/span&gt;&lt;span&gt;setString&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      engine.block.&lt;/span&gt;&lt;span&gt;getFill&lt;/span&gt;&lt;span&gt;(badgeBlock),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      &apos;fill/image/imageFileURI&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      caseAssetPath&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        `/podcast-badge-${&lt;/span&gt;&lt;span&gt;colorTheme&lt;/span&gt;&lt;span&gt; ===&lt;/span&gt;&lt;span&gt; &apos;light&apos;&lt;/span&gt;&lt;span&gt; ?&lt;/span&gt;&lt;span&gt; &apos;black&apos;&lt;/span&gt;&lt;span&gt; :&lt;/span&gt;&lt;span&gt; &apos;white&apos;}.png`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    // set text variables&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    engine.variable.&lt;/span&gt;&lt;span&gt;setString&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;Message&apos;&lt;/span&gt;&lt;span&gt;, debouncedMessage &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt; &apos;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    engine.variable.&lt;/span&gt;&lt;span&gt;setString&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      &apos;PodcastName&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      podcast &lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt; podcast.collectionName &lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &apos;&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      // set text colors based on background theme&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      const&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;messageBlock&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; engine.block.&lt;/span&gt;&lt;span&gt;findByName&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;Message &amp;#x26; Name&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      const&lt;/span&gt;&lt;span&gt; rgb&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      colorTheme &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; &apos;dark&apos;&lt;/span&gt;&lt;span&gt; ?&lt;/span&gt;&lt;span&gt; { r: &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;, g: &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;, b: &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt; } &lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { r: &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;, g: &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;, b: &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt; };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      engine.block.&lt;/span&gt;&lt;span&gt;setTextColor&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      messageBlock,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      { &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;rgb, a: &lt;/span&gt;&lt;span&gt;0.75&lt;/span&gt;&lt;span&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      &quot;{{Message}}&quot;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;length&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    engine.block.&lt;/span&gt;&lt;span&gt;setTextColor&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      messageBlock,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      { &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;rgb, a: &lt;/span&gt;&lt;span&gt;1.0&lt;/span&gt;&lt;span&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;       &quot;{{Message}}&quot;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;length&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  };&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;At this point, you’ve created a &lt;strong&gt;data-driven creative automation pipeline&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Templates authored with &lt;strong&gt;placeholders and constraints&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Dynamic population of text and image fields via external data.&lt;/li&gt;
&lt;li&gt;Export to &lt;strong&gt;high-quality assets&lt;/strong&gt; at scale.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This workflow is the foundation for &lt;strong&gt;personalized marketing campaigns, automated content production, and AI-driven design pipelines&lt;/strong&gt; with CE.SDK.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Creative Automation isn’t just about speed it’s about &lt;strong&gt;scalability, consistency, and customization&lt;/strong&gt;. &lt;a href=&quot;http://IMG.LY&quot;&gt;IMG.LY&lt;/a&gt;’s CE.SDK gives you the tools to build powerful, flexible automation workflows tailored to your brand and users.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://img.ly/forms/free-trial&quot;&gt;Start you free trial today&lt;/a&gt; and integrate content automation into your application.&lt;/p&gt;</content:encoded><dc:creator>Jan</dc:creator><media:content url="https://blog.img.ly/2025/09/Creative-Automation-Cover.png" medium="image"/><category>Creative Automation</category></item><item><title>The Top 7 Video Editing SDKs in 2026</title><link>https://img.ly/blog/top-7-video-editing-sdks-in-2025/</link><guid isPermaLink="true">https://img.ly/blog/top-7-video-editing-sdks-in-2025/</guid><description>In this guide, we break down the seven leading video editing SDK solutions: IMG.LY, Meishe, Banuba, Shotstack, BytePlus, Rendley, and Picsart, covering their features, platforms, use cases, and trade-offs. </description><pubDate>Tue, 02 Sep 2025 11:19:08 GMT</pubDate><content:encoded>&lt;p&gt;With dozens of video editing SDKs on the market, choosing the right one can feel like a daunting task.&lt;/p&gt;
&lt;p&gt;To help you cut through the noise, we’ve put together a breakdown of the &lt;strong&gt;7 best video editing SDKs in 2026:&lt;/strong&gt; IMG.LY, Meishe SDK, Banuba, Shotstack, BytePlus Effects, Rendley, and Picsart. We’ll cover:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Key features and capabilities&lt;/li&gt;
&lt;li&gt;Supported platforms and customization options&lt;/li&gt;
&lt;li&gt;Ideal use cases and trade-offs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This guide is unbiased, but we’ll also highlight how IMG.LY compares and where it stands out as the only solution that combines a polished editor with scalable automation in a single package.&lt;/p&gt;
&lt;h2 id=&quot;1-imgly-creativeeditor-sdk-cesdk&quot;&gt;&lt;strong&gt;1. IMG.LY CreativeEditor SDK (CE.SDK)&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Choosing IMG.LY means selecting a platform that offers both: a Canva-grade editor for your users and a powerful Engine API for automation. That dual focus is what sets CE.SDK apart.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Features &amp;#x26; capabilities:&lt;/strong&gt; CE.SDK works best when you see it as a bridge between what end users expect and what your product team needs behind the scenes. On the surface, users get familiar tools including multi‑track editing, ready‑made templates, and a growing set of AI features like text‑to‑image, text‑to‑video, and AI voiceovers. Behind the scenes, developers can extend and customise with a plugin system so the editor adapts as your product evolves.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Platforms &amp;#x26; customization:&lt;/strong&gt; This flexibility carries over to platforms. CE.SDK works across Web, iOS, Android, React Native, Flutter, Electron, and Node.js. It’s also fully white‑label, which means your customers see a seamless extension of your brand, not a third‑party tool.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Implementation &amp;#x26; use cases:&lt;/strong&gt; Getting started with our tool doesn’t require a huge lift. Teams can spin up a proof of concept quickly, then scale into enterprise deployment when ready. That’s why you’ll see CE.SDK inside SaaS platforms, e‑commerce personalization tools, DAM systems, and even social networks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Future‑proofing, support &amp;#x26; pricing&lt;/strong&gt;: What reassures teams is the long‑term roadmap: regular feature releases, AI integrations, and direct support from solution engineers. Enterprise SLAs and SSO come standard. Pricing depends on the usage, which makes it easier to scale without committing to rigid licensing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Who it’s for:&lt;/strong&gt; CE.SDK is valuable for SaaS, MarTech, e-commerce, and DAM platforms. These teams need to give users a simple, branded editing experience while also managing complex automation in the background. Instead of stitching together multiple tools or sacrificing one capability for another, CE.SDK provides an all-in-one foundation: polished editing, scalable automation, enterprise-grade support, and ongoing AI-driven innovation.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;key-differentiator&quot;&gt;&lt;strong&gt;Key differentiator&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;CE.SDK doesn’t force you to choose between usability and power. On one side, it delivers a polished, user-facing editor that feels familiar to end users. On the other hand, it provides a powerful automation engine that scales with your product. Most SDKs lean heavily in one direction. They either focus on end-user editing or specialize in backend automation. CE.SDK is different because it combines both in a single platform.&lt;/p&gt;
&lt;h2 id=&quot;2-meishe-sdk-meicam&quot;&gt;&lt;strong&gt;2. Meishe SDK (Meicam)&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Meishe SDK, also known as Meicam, is a mature Chinese SDK that has carved out a space in many professional apps across Asia. Think of it as a toolkit built for industries that need stability and advanced editing power, though it comes with a few trade‑offs that teams should weigh carefully.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Features &amp;#x26; capabilities:&lt;/strong&gt; Meishe offers multi‑track timelines, real‑time effects, and plugin support across mobile, web, and PC. Industries like automotive, broadcasting, and education have already used Meishe successfully, showing how it handles complex and demanding video workflows.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Platforms &amp;#x26; customization:&lt;/strong&gt; It supports full UI customization, white‑labeling, and plugins. And while customization depth is solid, integration tends to be heavier compared to other tools. Documentation can feel dense, which sometimes slows teams down as they work toward launch.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Implementation &amp;#x26; use cases:&lt;/strong&gt; Meishe SDK is beginning to layer in AI integrations like intelligent editing and motion tracking. For large organizations in Asia with strong internal dev resources, these capabilities can be appealing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Future‑proofing, support &amp;#x26; pricing:&lt;/strong&gt; Meishe continues to expand with new AI features like facial recognition and virtual anchors. It also offers custom enterprise support agreements. However, teams often struggle with the integration process, and the developer experience feels less polished. Setting up complex projects can take longer, and the documentation isn’t as approachable, which leaves some developers hesitant to adopt it widely. Pricing typically follows an enterprise licensing model, which can be less flexible for fast‑scaling SaaS companies.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Who it’s for:&lt;/strong&gt; Meishe SDK is best suited for large-scale apps in Asia and companies with internal dev resources.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;how-it-compares-to-imgly&quot;&gt;&lt;strong&gt;How it compares to IMG.LY&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Meishe delivers solid editing capabilities and is a proven choice in professional and regional contexts. But the trade‑offs become clear when you look at integration and support. It can feel heavy to implement, and documentation isn’t as approachable.&lt;/p&gt;
&lt;p&gt;IMG.LY pulls ahead here with stronger web support, compatibility with creative file types like PSD, AI, and INDD, and a faster onboarding process that makes it easier for teams to move from idea to production.&lt;/p&gt;
&lt;p&gt;Learn more about how &lt;a href=&quot;https://img.ly/meishesdk-alternative&quot;&gt;IMG.LY compares to Meishe SDK here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;3-banuba&quot;&gt;&lt;strong&gt;3. Banuba&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Banuba is a mobile‑first SDK with a strong focus on augmented reality (AR). It has built its reputation on powering social and UGC apps with effects that mimic the TikTok experience. If your product relies on immersive filters, beauty effects, or virtual try‑on, Banuba often appears at the top of the evaluation list.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Features &amp;#x26; capabilities:&lt;/strong&gt; The SDK provides a TikTok‑like editor with AR masks, beauty filters, face tracking, background removal, and even virtual try‑on features. These tools are designed to keep users engaged with interactive and shareable content.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Platforms &amp;#x26; customization:&lt;/strong&gt; Banuba supports iOS, Android, Flutter, and React Native. It offers modular components with a preset UI, which makes implementation faster for mobile. That said, customization options are limited when compared to solutions designed for enterprise-level flexibility.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Implementation &amp;#x26; use cases:&lt;/strong&gt; Integration is relatively quick for mobile teams, and the SDK has proven popular among social media platforms, beauty apps, and e‑commerce companies offering AR try‑on. However, support for web or large‑scale enterprise environments is limited, which narrows its scope.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Future‑proofing, support &amp;#x26; pricing:&lt;/strong&gt; The company continues to expand its AR and AI features, focusing on personalization and beauty‑driven effects. Banuba operates with a smaller team of about 70 employees, which can affect the pace of enterprise‑grade support. Licensing costs are typically high and not publicly disclosed, which may be a barrier for smaller companies.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Who it’s for:&lt;/strong&gt; Banuba is best suited for mobile apps that need advanced AR features like beauty filters, face tracking, or virtual try‑on to keep users engaged.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;how-it-compares-to-imgly-1&quot;&gt;&lt;strong&gt;How it compares to IMG.LY&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Banuba leads when it comes to AR‑driven capabilities, making it a natural fit for beauty and social platforms. But when teams look beyond filters to enterprise readiness, automation, and cross‑platform support, other options such as IMG.LY offer broader possibilities.&lt;/p&gt;
&lt;p&gt;Learn more about how &lt;a href=&quot;https://img.ly/banuba-alternative&quot;&gt;IMG.LY compares to Banuba here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;4-shotstack&quot;&gt;&lt;strong&gt;4. Shotstack&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Shotstack focuses squarely on automation. It’s a cloud‑based video editing API designed for bulk rendering rather than end‑user editing. Teams often evaluate it when they need to generate thousands of videos quickly and at scale.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Features &amp;#x26; capabilities:&lt;/strong&gt; Shotstack runs on a JSON‑driven API that lets developers programmatically create and assemble video content. With this approach, teams can handle automated ad generation, personalization, or large‑scale marketing campaigns. While powerful for automation, it doesn’t include a native editor, which means you must build a custom UI if you want end‑user editing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Platforms &amp;#x26; customization:&lt;/strong&gt; Shotstack is built as a REST API in the cloud, so it fits naturally into modern development stacks. It allows teams to design workflows programmatically, though the absence of prebuilt UI components makes it harder to use the tool right away as compared to other SDKs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Implementation &amp;#x26; use cases:&lt;/strong&gt; Developers appreciate the smooth onboarding experience and clear API structure. Typical use cases include bulk rendering of ads, dynamic personalization for campaigns, and other scenarios where scaling output matters more than in‑app editing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Future‑proofing, support &amp;#x26; pricing:&lt;/strong&gt; Shotstack continues to invest in automation and AI‑powered generation, offering tools that personalize video creation at scale. The vendor provides commercial SLAs, but support resources remain limited given the team size. Pricing follows a pay‑as‑you‑go model ($0.30 per minute) or subscription plans, which can work well for predictable, high‑volume usage.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Who it’s for:&lt;/strong&gt; Shotstack is best suited for teams that need scalable rendering pipelines and automation rather than in‑app editing features.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;how-it-compares-to-imgly-2&quot;&gt;&lt;strong&gt;How it compares to IMG.LY&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Shotstack gives you powerful rendering automation and programmatic workflows. IMG.LY takes it further by combining those automation strengths with a complete, user‑facing editor, so you can address both your development needs and your end‑users’ experiences in one solution.&lt;/p&gt;
&lt;p&gt;Get a detailed &lt;a href=&quot;https://img.ly/shotstack-alternative&quot;&gt;comparison of IMG.LY CreativeEditor SDK and Shotstack&lt;/a&gt; here.&lt;/p&gt;
&lt;h2 id=&quot;5-byteplus-effects&quot;&gt;&lt;strong&gt;5. BytePlus Effects&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;BytePlus Effects is modelled after TikTok and CapCut. It’s designed to give app developers the same kind of short‑form, social‑first experience that has made those platforms successful. As a result, it appeals to teams that want to replicate TikTok‑like engagement inside their own apps.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Features &amp;#x26; capabilities:&lt;/strong&gt; The SDK offers more than 80,000 effects and filters, including AR stickers and beautification tools. These features aim to keep users engaged by giving them endless ways to personalize and enhance their content.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Platforms &amp;#x26; customization:&lt;/strong&gt; BytePlus integrates with iOS, Android, React Native, and Flutter, making it a strong option for mobile‑first development. You can customise the UI to match your brand, but customization beyond theming is limited, which can be a constraint if you need deeper control.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Implementation &amp;#x26; use cases:&lt;/strong&gt; Since it’s optimized for mobile integration, you can embed it relatively quickly into short‑form consumer video apps. Common use cases include social platforms, beauty apps, and any consumer‑facing product that thrives on AR‑enhanced video.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Future‑proofing, support &amp;#x26; pricing:&lt;/strong&gt; With the backing of TikTok’s ecosystem, BytePlus is evolving rapidly, adding new AI‑driven AR and beauty effects frequently. However, commercial support feels less transparent, and licensing comes through enterprise negotiations with annual fees. This structure can work for large consumer platforms, but may be harder for smaller teams.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Who it’s for:&lt;/strong&gt; BytePlus is best suited for apps that want to recreate TikTok‑style user experiences and rely heavily on prebuilt AR effects to keep users engaged.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;how-it-compares-to-imgly-3&quot;&gt;&lt;strong&gt;How it compares to IMG.LY&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;BytePlus takes a step ahead when it comes to prebuilt effects and AR‑driven experiences. But if you need more flexibility in customization, automation capabilities, or enterprise‑grade workflows, IMG.LY offers a broader solution.&lt;/p&gt;
&lt;p&gt;For a detailed comparison, take a look at our guide on &lt;a href=&quot;https://img.ly/byteplus-alternative&quot;&gt;IMG.LY vs BytePlus Video Editor.&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;6-rendley&quot;&gt;&lt;strong&gt;6. Rendley&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Rendley is a newer player in the SDK space and has gained attention because of its browser‑only approach. It’s JavaScript‑based and runs entirely in the browser, which means you don’t need a server to get started. This makes it attractive for teams that want a lightweight, client‑only setup without managing infrastructure.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Features &amp;#x26; capabilities:&lt;/strong&gt; The SDK supports multi‑track editing, keyframes, and even integrates with After Effects (AE). These features give frontend developers enough flexibility to build interactive editing experiences directly in the browser.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Platforms &amp;#x26; customization:&lt;/strong&gt; Rendley runs entirely in the browser, which makes it a natural fit for lightweight web apps and UGC platforms. Developers get flexibility through an open, in‑browser approach. However, without enterprise‑level frameworks, scaling to larger organizations becomes more difficult.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Implementation &amp;#x26; use cases:&lt;/strong&gt; Setting up Rendley is straightforward for frontend teams, which makes it appealing for lightweight UGC applications or smaller web projects. That ease of entry, however, comes with limits: AI integrations aren’t a core focus, so its potential for more advanced future applications remains restricted.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Future‑proofing, support &amp;#x26; pricing:&lt;/strong&gt; Rendley is still early‑stage and hasn’t yet proven itself at enterprise scale. Support is provided by a small vendor team, which can make long‑term stability less certain. Pricing details are not publicly available, leaving prospective users to negotiate directly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Who it’s for:&lt;/strong&gt; Rendley fits developers who want a browser‑native, client‑only editing tool without the need for server infrastructure.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;how-it-compares-to-imgly-4&quot;&gt;&lt;strong&gt;How it compares to IMG.LY&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Rendley works well as a lightweight, browser‑native solution. But if you need enterprise‑grade robustness, automation, or dedicated support, IMG.LY offers more comprehensive coverage.&lt;/p&gt;
&lt;p&gt;Learn more about how &lt;a href=&quot;https://img.ly/rendley-alternative&quot;&gt;IMG.LY is a great alternative for Rendley&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;7-picsart-video-sdk&quot;&gt;&lt;strong&gt;7. Picsart Video SDK&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Picsart Video SDK is an embeddable video editor SDK that brings Picsart’s creative editing tools into third-party apps or websites.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Features &amp;#x26; capabilities:&lt;/strong&gt; This SDK brings the company’s well‑known creative editing tools into third‑party products. Out of the box, you get features like trimming, multi‑scene editing, transitions, dynamic audio, subtitles, and text overlays, enough to cover the basics of video creation. AI‑driven tools extend these capabilities with smarter image and video editing options.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Platforms &amp;#x26; customization:&lt;/strong&gt; The SDK is React Native‑based but optimized for web embedding, making it appealing for web‑first platforms. You can configure the UI, apply theming, white‑label the experience, toggle features on or off, and integrate your own asset library so the editor matches your product’s design and workflow.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Implementation &amp;#x26; use cases:&lt;/strong&gt; One of Picsart’s strengths is ease of setup: installation is fast, with a React editor installation process that reduces complexity, documentation is detailed, and the editor is designed to embed with minimal lift. This makes it a good choice for advertising or marketing platforms, edu‑tech products, and media platforms that want to give users creative tools quickly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Future‑proofing, support &amp;#x26; pricing:&lt;/strong&gt; The SDK is backed by Picsart’s large ecosystem and its AI research arm (PAIR), so teams can expect regular updates, new features, and scalable performance. Support comes through developer documentation, a support team, and enterprise collaboration options. Pricing isn’t public, but it’s likely offered as enterprise or usage‑based licensing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Who it’s for:&lt;/strong&gt; Picsart’s Video SDK is best for teams that need a web‑based video editor to power product features or educational video production without investing heavily in custom development.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;how-it-compares-to-imgly-5&quot;&gt;&lt;strong&gt;How it compares to IMG.LY&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Picsart offers a fast, embeddable editor with AI effects and a strong ecosystem. However, IMG.LY provides deeper customization, more automation capabilities, cross‑platform support, and enterprise‑grade integrations.&lt;/p&gt;
&lt;h2 id=&quot;overview-table-use-cases-vs-solutions&quot;&gt;&lt;strong&gt;Overview Table (Use Cases vs. Solutions)&lt;/strong&gt;&lt;/h2&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;When you line these SDKs up side by side, it’s clear that each one has its own niche strengths and limitations. Here’s a quick overview:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Banuba / BytePlus:&lt;/strong&gt; These are the strongest options for AR and social apps, with beauty filters, effects, and TikTok-like workflows.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Meishe:&lt;/strong&gt; A professional, Asia-centric SDK with heavy native capabilities, but a steeper implementation curve.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shotstack / Rendley:&lt;/strong&gt; Both shine in automation pipelines or lightweight browser-based setups, but they don’t offer polished editor UIs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Picsart:&lt;/strong&gt; A strong web-first, prebuilt editor with AI effects that’s simple to embed, though limited in customization and automation.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;where-does-that-leave-you&quot;&gt;Where does that leave you?&lt;/h3&gt;
&lt;p&gt;If you’re evaluating SDKs, you need to balance two priorities: delivering a great editor UX for your users and scaling automation behind the scenes. Only IMG.LY covers both ends: offering a polished, enterprise-ready editor and a scalable automation engine.&lt;/p&gt;
&lt;p&gt;That makes it the go-to option for teams planning not only their current projects but also long-term growth. With IMG.LY, you can give users a polished editing experience today while building the automation backbone that will let your product scale tomorrow&lt;/p&gt;
&lt;p&gt;If you’d like to see how IMG.LY can fit into your platform, &lt;a href=&quot;https://img.ly/forms/contact-sales&quot;&gt;get in touch with our experts today&lt;/a&gt; for a deeper look and tailored guidance.&lt;/p&gt;</content:encoded><dc:creator>Jan</dc:creator><media:content url="https://blog.img.ly/2025/09/top-video-editor-sdks-in-2025--1-.png" medium="image"/><category>Video Editor</category><category>Insights</category></item><item><title>What is Visual Prompting?</title><link>https://img.ly/blog/what-is-visual-prompting/</link><guid isPermaLink="true">https://img.ly/blog/what-is-visual-prompting/</guid><description>Visual Prompting is a new way to guide AI using visual input instead of just text. By composing layouts with images, annotations, and design cues directly on the canvas, creators can prompt AI more intuitively. Learn how IMG.LY’s CE.SDK brings this paradigm to life.</description><pubDate>Tue, 29 Jul 2025 13:06:11 GMT</pubDate><content:encoded>&lt;h2 id=&quot;a-new-paradigm-for-creative-ai-built-by-imgly&quot;&gt;A New Paradigm for Creative AI, Built by IMG.LY&lt;/h2&gt;
&lt;p&gt;To say it’s trite to refer to the impact of AI in this or that domain as disruptive or groundbreaking would be an understatement. Yet, few areas have been as profoundly affected as the creative process. With just a text prompt, anyone can produce stunning images, remix visual styles, and explore design possibilities at a scale and speed never seen before. AI has inserted itself so quickly into this process that its gone from curious novelty to an essential part of the creator toolchain.&lt;/p&gt;
&lt;p&gt;The more serious adoption we see, however, the more key limitations of today’s AI tooling come into focus: &lt;strong&gt;the prompt itself&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Text alone, for all its expressive power, struggles to capture the essence of visual intent. Most creative work doesn’t begin with a sentence it begins with a sketch, a layout, a mood board, or an arrangement of elements. Visual ideas are shared by pointing, placing, showing.&lt;/p&gt;
&lt;p&gt;At &lt;strong&gt;IMG.LY&lt;/strong&gt;, we have begun to think about better ways to direct AI for visual generation, the term we use is Visual Prompting.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Visual Prompting: the practice of composing a visual scene or layout as input for a generative model.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Instead of describing what you want with paragraphs of text, you show it directly using a canvas of images, text, spatial cues, and annotations. This visual composition then becomes the prompt for the AI to generate new content in return. It’s a more natural, intuitive, and powerful way to collaborate with AI, especially when integrated directly into the creative process.&lt;/p&gt;
&lt;h2 id=&quot;problem-the-chat-disconnect&quot;&gt;Problem: the Chat Disconnect&lt;/h2&gt;
&lt;p&gt;The current generation of AI tools has largely been shaped by language-first interfaces. Whether it’s ChatGPT for writing or Midjourney for image generation, the assumption is the same: the user will type a descriptive prompt, and the AI will generate a result based on it.&lt;/p&gt;
&lt;p&gt;But when it comes to &lt;strong&gt;design&lt;/strong&gt;, this workflow quickly runs into friction. Visual ideas are inherently spatial and non-linear. Trying to express layout, balance, mood, or specific spatial relationships through text can feel like trying to describe a painting over the phone. It’s possible but unnecessarily cumbersome.&lt;/p&gt;
&lt;p&gt;A designer might want to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Indicate that a certain area in the image should be blue.&lt;/li&gt;
&lt;li&gt;Replace a background with a texture sample.&lt;/li&gt;
&lt;li&gt;Position a character precisely in a composition.&lt;/li&gt;
&lt;li&gt;Annotate which parts of a scene to preserve or modify.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of these are difficult to express fluently in text. But they’re &lt;strong&gt;effortless&lt;/strong&gt; in a visual interface. The truth is: &lt;strong&gt;an image is worth more than a thousand words when prompting an image.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;what-is-visual-prompting&quot;&gt;What Is Visual Prompting?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Visual Prompting&lt;/strong&gt; is a multimodal approach to generative AI, where the &lt;strong&gt;input to the model is not just text, but a full visual composition&lt;/strong&gt;: images, text, annotations, and layout.&lt;/p&gt;
&lt;p&gt;Rather than prompting AI in isolation, the user builds their intent on a canvas. This might include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reference images that communicate mood or style.&lt;/li&gt;
&lt;li&gt;Text blocks indicating desired copy or instructions.&lt;/li&gt;
&lt;li&gt;Annotations pointing to specific areas with notes like “make this glow” or “replace this object.”&lt;/li&gt;
&lt;li&gt;Spatial composition: where elements are arranged meaningfully to convey intent.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The visual prompt is then interpreted by a multimodal model such as OpenAI’s &lt;code&gt;gpt-image-1&lt;/code&gt; to generate new visual content that reflects not only the textual description, but also the visual context.&lt;/p&gt;
&lt;h2 id=&quot;how-visual-prompting-works-in-cesdk&quot;&gt;How Visual Prompting Works in CE.SDK&lt;/h2&gt;
&lt;p&gt;About time for an example. As part of our recent AI released &lt;a href=&quot;https://img.ly/showcases/cesdk/ai-editor/web?mode=Design&quot;&gt;we demoed how to use OpenAIs &lt;code&gt;gpt-image-1&lt;/code&gt; model&lt;/a&gt; to build visual prompting into &lt;strong&gt;CreativeEditor SDK (CE.SDK)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Here’s what the process looks like inside CE.SDK:&lt;/p&gt;
&lt;p&gt;&lt;video src=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/imgly-ai/visualprompt_05.mp4&quot; controls autoplay muted loop playsinline&gt;&lt;/video&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Compose Visually:&lt;/strong&gt; The user creates a layout with reference content, uploaded images, icons, color schemes, design elements, placeholder text, and annotations. This composition represents the “prompt” in visual form.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add AI Layers:&lt;/strong&gt; With a single click, the user can trigger image generation using CE.SDK’s built-in AI plugin. The plugin sends the visual context (alongside any optional text input) to a multimodal model capable of interpreting both.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Refine and Iterate:&lt;/strong&gt; Users can adjust the layout, reposition elements, change annotations, or layer in new references, then prompt again. Because the canvas is interactive and editable, the feedback loop is tight.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build Up Complexity:&lt;/strong&gt; Over time, users can layer generated images with manually designed components or other generated outputs, creating rich compositions that blend AI creativity with human direction.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This workflow turns the traditional prompt/response cycle into a &lt;strong&gt;conversation between the designer and the model&lt;/strong&gt;, with the canvas acting as the shared language.&lt;/p&gt;
&lt;h2 id=&quot;who-is-visual-prompting-for&quot;&gt;Who Is Visual Prompting For?&lt;/h2&gt;
&lt;p&gt;The use cases for Visual Prompting extend across industries:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Creative teams&lt;/strong&gt; can go from reference to generation in seconds, iterating visually instead of wrangling prompts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Marketing teams&lt;/strong&gt; can generate regionalized or personalized creative variants from a shared layout.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Product designers&lt;/strong&gt; can prototype in context, turning layouts into realistic screens without leaving the editor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Storytellers and content creators&lt;/strong&gt; can use annotated sketches to generate detailed illustrations or scene variations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;E-commerce platforms&lt;/strong&gt; can give sellers the power to visually customize their brand materials with AI assistance.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In every case, Visual Prompting replaces friction with flow and text-based prompting with something more expressive, more reliable, and more fun.&lt;/p&gt;
&lt;h2 id=&quot;built-for-this-multimodal-models-and-cesdks-plugin-system&quot;&gt;Built for This: Multimodal Models and CE.SDK’s Plugin System&lt;/h2&gt;
&lt;p&gt;Visual Prompting is only possible because of two parallel advancements:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Multimodal AI models&lt;/strong&gt;, such as OpenAI’s &lt;code&gt;gpt-image-1&lt;/code&gt;, that can interpret both images and text, understand spatial relationships, and respond to annotated cues.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A flexible, composable editor SDK&lt;/strong&gt; like CE.SDK, which enables the construction of visual prompts on a live canvas, and makes it easy to integrate AI models directly into the design flow.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Our SDK was built from the ground up to support &lt;strong&gt;AI-first creative workflows&lt;/strong&gt;. Its plugin architecture allows you to add any model or API, image generation, video generation, captioning, text rewriting and use it natively inside the editor without the need to switch tools or copy/paste.&lt;/p&gt;
&lt;p&gt;Generative AI’s full potential is only unlocked when it is embedded directly into the tools creatives use not siloed in chatbots or separate interfaces. Visual Prompting allows that embedding to go even deeper, aligning the &lt;strong&gt;mode of input (visual)&lt;/strong&gt; with the &lt;strong&gt;desired output (visual)&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;explore-it-yourself&quot;&gt;Explore It Yourself&lt;/h3&gt;
&lt;p&gt;🎨 Try out Visual Prompting in our &lt;a href=&quot;https://img.ly/showcases/cesdk/ai-editor/web?mode=Design&quot;&gt;AI Editor demo&lt;/a&gt;&lt;br&gt;
📘 &lt;a href=&quot;https://img.ly/docs/cesdk/js/user-interface/ai-integration/integrate-8e906c/&quot;&gt;Learn How to Integrate AI into CE.SDK&lt;/a&gt;&lt;br&gt;
💬 &lt;a href=&quot;https://img.ly/forms/contact-sales&quot;&gt;Contact Us&lt;/a&gt; to Bring Visual Prompting to Your Product&lt;/p&gt;</content:encoded><dc:creator>Jan</dc:creator><media:content url="https://blog.img.ly/2025/07/cesdk-2025-07-25T12_20_58.735Z--1-.png" medium="image"/><category>AI</category><category>CE.SDK</category><category>Creativity</category><category>Creative Workflows</category></item><item><title>Build vs. Buy: Is Fabric.js Right for You</title><link>https://img.ly/blog/build-vs-buy-is-fabric-js-right-for-you/</link><guid isPermaLink="true">https://img.ly/blog/build-vs-buy-is-fabric-js-right-for-you/</guid><description>This blog article provides a detailed comparison between Fabric.js and IMG.LY’s CreativeEditor SDK (CE.SDK) for teams building in-product design editors. It outlines the strengths of Fabric.js as a low-level canvas library, but focuses on the growing limitations teams face as they scale.</description><pubDate>Thu, 15 May 2025 09:31:43 GMT</pubDate><content:encoded>&lt;p&gt;When you’re building a design editor into your product whether for social content, marketing assets, video, or design workflows choosing the right foundation matters. Many teams start with Fabric.js, an open-source canvas library, attracted by its flexibility and permissive license. But as the project scope grows, so do the limitations.&lt;/p&gt;
&lt;p&gt;This article explores the advantages, but also the pitfalls of building a creative tool with Fabric.js and why many product teams ultimately decide to switch or start with a commercial SDK like &lt;a href=&quot;https://IMG.LY&quot;&gt;IMG.LY&lt;/a&gt;’s CreativeEditor SDK (CE.SDK).&lt;/p&gt;
&lt;p&gt;Consult our &lt;a href=&quot;https://img.ly/fabricjs-alternative&quot;&gt;comparison page of Fabric.js and IMG.LY&lt;/a&gt; for a feature by feature breakdown of the differences between our SDKs and Fabric.js.&lt;/p&gt;
&lt;h2 id=&quot;why-teams-switch-from-fabricjs&quot;&gt;&lt;strong&gt;Why Teams Switch from Fabric.js&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;We’ve spoken with dozens of companies, from startups to enterprise clients, who evaluated Fabric.js and in many cases opted for IMG.LY instead. Here’s what we consistently hear:&lt;/p&gt;
&lt;h3 id=&quot;1-time-to-market-vs-reinventing-the-wheel&quot;&gt;&lt;strong&gt;1. Time-to-Market vs. Reinventing the Wheel&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Open-source is attractive at first. But once the excitement of building wears off, teams often face a sobering reality: stitching together a decent editing experience from Fabric.js is a months-long effort.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“We used Fabric.js before, but if IMG.LY’s SDK is cost-effective, we’d rather not reinvent the wheel.”&lt;/p&gt;
&lt;p&gt;— B2B SaaS Prospect&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;They want a modern editor UI, fast iteration cycles, and a stable base not to spend their next quarter building the basics like zoom, text editing, object grouping, layer management, or responsive templates.&lt;/p&gt;
&lt;h3 id=&quot;2-lack-of-advanced-features&quot;&gt;&lt;strong&gt;2. Lack of Advanced Features&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Fabric.js excels at low-level canvas manipulation&lt;/strong&gt;, offering a robust API for working directly with objects on the HTML5 canvas - shapes, images, text, and transformations. It’s a great starting point for developers who want fine-grained control over rendering and interactivity. &lt;strong&gt;However, it falls short when it comes to modern editing paradigms&lt;/strong&gt;. Fabric.js provides no native concept of reusable templates, lacks support for layout and design constraints like alignment guides or snapping behavior, and does not include higher-level abstractions for content-aware or AI-powered editing. &lt;strong&gt;In short, Fabric.js gives you a raw toolkit, not a polished, plug-and-play editing solution.&lt;/strong&gt; If you’re building a sophisticated design application, you’ll need to layer these capabilities yourself or integrate additional frameworks to bridge the gap.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“We needed a template system and advanced photo editing. Open-source libraries couldn’t do it out of the box.”&lt;/p&gt;
&lt;p&gt;— Marketplace Platform Prospect&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Teams chasing parity with Canva or Adobe tools quickly hit walls. What starts as a proof-of-concept becomes a rebuild of the tables stakes of design editing.&lt;/p&gt;
&lt;h2 id=&quot;real-world-use-cases--vertical-specific-challenges&quot;&gt;&lt;strong&gt;Real-World Use Cases &amp;#x26; Vertical-Specific Challenges&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;We’ve seen teams from various industries reach the same conclusion: Fabric.js doesn’t scale to meet their creative, technical, or business needs. A few common themes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;E-commerce &amp;#x26; Web-to-Print&lt;/strong&gt;: Retailers building product customization flows need template constraints, consistent output quality, and export formats that go beyond canvas. They can’t afford rendering inconsistencies or unpredictable export fidelity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MarTech &amp;#x26; Social Media Tools&lt;/strong&gt;: Marketers need batch generation, AI-assisted creative workflow, brand constraints and consistent creative output across devices. Fabric.js lacks built-in support for these workflows.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mobile-first Apps&lt;/strong&gt;: Teams building hybrid apps or web apps that need to be functional on mobile struggle with Fabric.js’ &lt;a href=&quot;https://github.com/fabricjs/fabric.js/issues/6980&quot;&gt;lacklustre mobile support&lt;/a&gt;. The inability to deliver a consistent UX across iOS, Android, and Web leads to dropped features or split tech stacks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Video and Multimedia Platforms&lt;/strong&gt;: Fabric.js has no native video support, track-based editing, or multi-frame logic. Prospects in this space frequently abandon their Fabric.js POCs once real constraints emerge.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A major pain point across all verticals is &lt;strong&gt;rendering consistency&lt;/strong&gt;. CE.SDK renders identically across browser, server, and mobile thanks to a shared rendering core (&lt;a href=&quot;https://img.ly/docs/cesdk/node/get-started/overview-e18f40/&quot;&gt;CreativeEngine&lt;/a&gt;). This is critical for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Workflows that begin on web and finish on mobile&lt;/li&gt;
&lt;li&gt;Server-side generation (e.g., previews, PDFs, batch exports)&lt;/li&gt;
&lt;li&gt;Feature parity and UX reliability across platforms&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Check out our &lt;a href=&quot;https://img.ly/showcases/cesdk&quot;&gt;demo page&lt;/a&gt; to explore these use cases.&lt;/p&gt;
&lt;h2 id=&quot;technical-debt-the-hidden-cost-of-fabricjs&quot;&gt;&lt;strong&gt;Technical Debt: The Hidden Cost of Fabric.js&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;On paper, Fabric.js seems like a fast way to get started. But its real cost emerges over time in performance bottlenecks, missing architecture, and maintenance drag.&lt;/p&gt;
&lt;h3 id=&quot;aging-codebase-and-patchy-maintenance&quot;&gt;&lt;strong&gt;Aging Codebase and Patchy Maintenance&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;As of 2025, Fabric.js has over 400 open issues on GitHub, some dating back years. Many feature requests such as better performance for large object sets, async rendering, or text-on-path improvements are either unresolved or uncertainly prioritized.&lt;/p&gt;
&lt;p&gt;The core maintainers do their best, but progress is slow. You’re relying on volunteer effort for critical infrastructure.&lt;/p&gt;
&lt;h3 id=&quot;slow-issue-resolution&quot;&gt;&lt;strong&gt;Slow Issue Resolution&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Many of the GitHub issues (e.g., &lt;a href=&quot;https://github.com/fabricjs/fabric.js/issues/5885&quot;&gt;#5885&lt;/a&gt;, &lt;a href=&quot;https://github.com/fabricjs/fabric.js/issues/6582&quot;&gt;#6582&lt;/a&gt;) highlight long-standing rendering bugs and performance problems. These are hard to fix, and updates can break your own hacks or workarounds.&lt;/p&gt;
&lt;p&gt;Unlike a commercial SDK, Fabric.js doesn’t guarantee backward compatibility. No SLAs. Little roadmap visibility.&lt;/p&gt;
&lt;h2 id=&quot;customer-feedback-why-they-walked-away&quot;&gt;&lt;strong&gt;Customer Feedback: Why They Walked Away&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Here are some soundbites from our customers and prospects on why they decided against building with Fabric.js:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;“The quality and UX didn’t meet our standards.”&lt;/em&gt;&lt;br&gt;
Product Customizer&lt;/p&gt;
&lt;p&gt;&lt;em&gt;“Developer experience was poor. We spent more time debugging than building features.”&lt;/em&gt;&lt;br&gt;
B2B SaaS Ad Design&lt;/p&gt;
&lt;p&gt;&lt;em&gt;“We needed enterprise support, scalability, and documentation. Open source didn’t cut it.”&lt;/em&gt;&lt;br&gt;
Web to print Customer&lt;/p&gt;
&lt;p&gt;&lt;em&gt;“Cross-platform support and minimum SDK version constraints were a major blocker.”&lt;/em&gt;&lt;br&gt;
Claim Management Application&lt;/p&gt;
&lt;h2 id=&quot;voice-of-the-dev&quot;&gt;&lt;strong&gt;Voice of the Dev&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Beyond enterprise evaluations, developers working with Fabric.js often share their struggles publicly on GitHub, Stack Overflow, and developer forums. Their commentary offers real-world insight into day-to-day frustrations:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“FabricJS doesn’t seem to work well on Mobile.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/fabricjs/fabric.js/issues/6980&quot;&gt;Github issue #6980&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Fabric.js object controls don’t work until after a common selection is made. Had to hack around it with extra event listeners.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/64697215/fabricjs-object-controls-not-working-until-common-selection&quot;&gt;StackOverflow&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Trying to integrate Fabric.js with Next.js + Rollup is a mess. Unexpected tokens, config rewrites — it doesn’t play well with modern bundlers.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/fabricjs/fabric.js/issues/8444&quot;&gt;GitHub Issue #8444&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“We’re blocked by the use of ‘unsafe-eval’ due to our content security policy. Fabric.js needs a rewrite to be CSP-compliant.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/fabricjs/fabric.js/issues/9666&quot;&gt;GitHub Issue #9666&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Concrete takeaways from developer feedback:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Basic UI control quirks&lt;/strong&gt;: Common issues with selection handling and control behavior require manual workarounds.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compatibility friction&lt;/strong&gt;: Fabric.js does not play well with modern build tools like Next.js and Rollup without additional configuration or patching.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security blockers&lt;/strong&gt;: The reliance on &lt;code&gt;unsafe-eval&lt;/code&gt; creates CSP conflicts, making it unsuitable for projects with strict security requirements.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Uncertain roadmap&lt;/strong&gt;: Critical features like async rendering may sit open for years, and niche features important to your use case may never land if they don’t align with community priorities.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While every open source project faces these difficulties, they do represent systemic issues with performance, extensibility, and production-readiness. For teams building long-lived, customer-facing tools, this developer feedback is often a leading indicator of future roadblocks.&lt;/p&gt;
&lt;h2 id=&quot;back-of-the-envelope-cost-of-building-with-fabricjs&quot;&gt;&lt;strong&gt;Back-of-the-Envelope Cost of Building with Fabric.js&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Many teams underestimate the cost of building a design editor from scratch. Here’s a rough breakdown of the time investment we’ve heard from teams who tried:&lt;/p&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;strong&gt;Task&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;Estimated Engineering Time&lt;/strong&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Core canvas-based editor UI (zoom, drag, resize, selection, tool switching)&lt;/td&gt;&lt;td&gt;6–8 weeks&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SVG support, snapping, grouping, and layer management&lt;/td&gt;&lt;td&gt;4–6 weeks&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Template constraints&lt;/td&gt;&lt;td&gt;3–5 weeks&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cross-platform adaptation (ironing out issues on mobile browsers, defining fallbacks)&lt;/td&gt;&lt;td&gt;4–6 weeks&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Bug triage, ongoing maintenance, and refactors (first 12–18 months)&lt;/td&gt;&lt;td&gt;6–9 weeks&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Total: ~6–8 months of senior dev time&lt;/strong&gt; just to get to feature parity with what CE.SDK offers out of the box.&lt;/p&gt;
&lt;p&gt;This doesn’t include the cost of QA, product management, or future extensibility. Nor the opportunity cost of what your team could be building instead.&lt;/p&gt;
&lt;h2 id=&quot;imglys-cesdk-a-ready-made-solution-built-for-growth&quot;&gt;&lt;strong&gt;IMG.LY’s CE.SDK: A Ready-Made Solution Built for Growth&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;By contrast, IMG.LY offers a production-grade SDK built for cross-platform creative tools, backed by a dedicated engineering team and used by major apps across industries.&lt;/p&gt;
&lt;div&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;strong&gt;Category&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;&lt;a href=&quot;https://IMG.LY&quot;&gt;IMG.LY&lt;/a&gt; (CE.SDK)&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;Fabric.js&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;Notes&lt;/strong&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Out-of-the-box UI&lt;/td&gt;&lt;td&gt;✅ Prebuilt modern UI&lt;/td&gt;&lt;td&gt;❌ Build from scratch&lt;/td&gt;&lt;td&gt;CE.SDK ships with full UI/UX patterns&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Plugin System&lt;/td&gt;&lt;td&gt;✅ Native plugin architecture&lt;/td&gt;&lt;td&gt;⚠️ Manual code extension&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://IMG.LY&quot;&gt;IMG.LY&lt;/a&gt; supports formal plugin APIs&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Free Drawing Tools&lt;/td&gt;&lt;td&gt;⚠️ Requires integration&lt;/td&gt;&lt;td&gt;✅ Built-in pencil + shapes&lt;/td&gt;&lt;td&gt;Fabric.js excels at shape-level control&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Advanced Editing&lt;/td&gt;&lt;td&gt;✅ Vector + raster support, layering, filters&lt;/td&gt;&lt;td&gt;⚠️ Basic vector only&lt;/td&gt;&lt;td&gt;CE.SDK includes pro-grade editing capabilities&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Templating System&lt;/td&gt;&lt;td&gt;✅ Dynamic placeholders + constraints&lt;/td&gt;&lt;td&gt;❌ Manual implementation&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://IMG.LY&quot;&gt;IMG.LY&lt;/a&gt; supports automation workflows&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Video Editing&lt;/td&gt;&lt;td&gt;✅ Multi-track timeline editor&lt;/td&gt;&lt;td&gt;❌ Not supported&lt;/td&gt;&lt;td&gt;No video support in Fabric.js&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cross-Platform&lt;/td&gt;&lt;td&gt;✅ Web, iOS, Android, Node, Flutter&lt;/td&gt;&lt;td&gt;⚠️ Web only&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://IMG.LY&quot;&gt;IMG.LY&lt;/a&gt; has native SDKs and server tools&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Asset Integrations&lt;/td&gt;&lt;td&gt;✅ Unsplash, Getty, Brandfolder&lt;/td&gt;&lt;td&gt;❌ Manual setup&lt;/td&gt;&lt;td&gt;CE.SDK integrates assets out-of-the-box&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Enterprise Support&lt;/td&gt;&lt;td&gt;✅ SLAs, onboarding, deployment help&lt;/td&gt;&lt;td&gt;❌ Community support only&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://IMG.LY&quot;&gt;IMG.LY&lt;/a&gt; offers dedicated engineering help&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Design File Import Support&lt;/td&gt;&lt;td&gt;✅ PSD, AI, INDD&lt;/td&gt;&lt;td&gt;⚠️ None&lt;/td&gt;&lt;td&gt;CE.SDK supports importing common design file formats&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;AI Editing&lt;/td&gt;&lt;td&gt;✅ Background removal, integrate any AI model for image/video/text/audio gen&lt;/td&gt;&lt;td&gt;❌ Not supported&lt;/td&gt;&lt;td&gt;AI-native editing pipeline available&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Rendering Consistency&lt;/td&gt;&lt;td&gt;✅ Unified engine across platforms&lt;/td&gt;&lt;td&gt;⚠️ Browser dependent&lt;/td&gt;&lt;td&gt;CE.SDK ensures pixel-parity on all targets&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;h2 id=&quot;when-does-fabricjs-still-make-sense&quot;&gt;&lt;strong&gt;When Does Fabric.js Still Make Sense?&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;This article might read like a put-down, but it’s not supposed to be that. Until now we were simply evaluating Fabric.js with respect to building fully-featured design editing tools. There are, however, a number of well-scoped use cases where Fabric.js excels. These include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Building an &lt;strong&gt;internal tool&lt;/strong&gt;, proof of concept, or educational app&lt;/li&gt;
&lt;li&gt;Creating a &lt;strong&gt;custom, single-platform sketching or annotation layer&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Developing a &lt;strong&gt;low-fidelity prototype&lt;/strong&gt; with full code-level control&lt;/li&gt;
&lt;li&gt;Building canvas collaboration tools such as &lt;strong&gt;drag and drop editors&lt;/strong&gt; or interactive canvases, such as Miro.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;An example of where Fabric.js worked well is a tool such as &lt;a href=&quot;https://mockola.com/&quot;&gt;Mockola&lt;/a&gt;, a drag-and-drop diagram editor, where shape manipulation, lightweight rendering, and canvas-level control are more important than cross-platform design fidelity. Mockola’s is a good use case, because its emphasis on real-time collaboration and planning rather than high-fidelity design. This means that features like free drawing, drag-and-drop, and JSON-based serialization are a great fit, all of which Fabric.js supports out of the box.&lt;/p&gt;
&lt;p&gt;For teams willing to invest in building and maintaining their own editor infrastructure and whose use case does not require cross-platform parity, advanced media editing, or enterprise scaling Fabric.js continues to be a compelling foundation.&lt;/p&gt;
&lt;p&gt;However, for products that need to ship quickly, scale reliably, and support modern creative workflows across platforms, IMG.LY’s CE.SDK offers the infrastructure and polish that customers now expect.&lt;/p&gt;
&lt;h2 id=&quot;the-bottom-line&quot;&gt;&lt;strong&gt;The Bottom Line&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;As &lt;a href=&quot;https://www.youtube.com/watch?v=TBOazhxtq5s&quot;&gt;MIT CIO Symposium speaker&lt;/a&gt; Mark Holst-Knudsen put it:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“You shouldn’t build anything that’s available off the shelf because it’s not a source of competitive advantage if everybody else can avail themselves of it.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;For most companies, building an editor from scratch is not a competitive edge, it’s a distraction from shipping and scaling. And Fabric.js, while capable in the hands of specialists, isn’t a shortcut to the finish line.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://IMG.LY&quot;&gt;IMG.LY&lt;/a&gt;’s CE.SDK gives you a head start with advanced editing features, AI automation, template support, plugin extensibility, rendering consistency, and battle-tested scalability across platforms. We put together a &lt;a href=&quot;https://img.ly/blog/imgly-impact-report/&quot;&gt;data report based on 600+ customers, 28 structured customer interviews, and a self-reported customer survey&lt;/a&gt; that speaks for itself when it comes to real-life outcomes.&lt;/p&gt;
&lt;p&gt;So before you dive into Fabric.js and start reinventing core functionality, ask yourself: What competitive advantage are you going to build &lt;strong&gt;on top&lt;/strong&gt; of a design editor and which functionality are you better served buying from a trusted vendor?&lt;/p&gt;</content:encoded><dc:creator>Jan</dc:creator><media:content url="https://blog.img.ly/2025/05/build-vs-buy-imgly-fabricjs-sdk.jpg" medium="image"/><category>Fabric.js</category><category>CE.SDK</category><category>OpenSource</category></item><item><title>OpenAI GPT-4o Image Generation (gpt-image-1) API: A Complete Guide for Creative Workflows for 2025</title><link>https://img.ly/blog/openai-gpt-4o-image-generation-api-gpt-image-1-a-complete-guide-for-creative-workflows-for-2025/</link><guid isPermaLink="true">https://img.ly/blog/openai-gpt-4o-image-generation-api-gpt-image-1-a-complete-guide-for-creative-workflows-for-2025/</guid><description>Learn how to integrate OpenAI’s gpt-image-1 API into modern creative applications. This complete 2025 guide covers technical setup, CE.SDK integration, prompt engineering, and tips for building real multimodal creative workflows.</description><pubDate>Mon, 28 Apr 2025 07:55:48 GMT</pubDate><content:encoded>&lt;h2 id=&quot;update-ai-first-visual-editing&quot;&gt;Update: AI-first Visual Editing&lt;/h2&gt;
&lt;p&gt;A day after the release of the &lt;code&gt;gpt-image-1&lt;/code&gt; API, we took it for a spin and integrated it into CreativeEditor SDK. Users can now generate images, create variants and use the canvas to compose visual prompts with our design editor. See it in action:&lt;/p&gt;
&lt;div class=&quot;cta-button-wrapper&quot;&gt;&lt;a href=&quot;https://cdn.img.ly/demo/gpt-image-1/v1/&quot; target=&quot;_blank&quot; class=&quot;cta-button&quot;&gt;Open AI Editor Demo Page&lt;/a&gt;&lt;/div&gt;
&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;The release of OpenAI’s &lt;code&gt;gpt-image-1&lt;/code&gt; model signals a pivotal shift in the creative developer landscape—one that moves beyond static, one-shot image generation and toward a more dynamic, multimodal interaction model. Until recently, most image APIs followed a predictable pattern: submit a prompt, receive a finished image. The process was useful, but flat. What’s changing now is not just image quality or style fidelity, but the shape of the workflow itself. With &lt;code&gt;gpt-image-1&lt;/code&gt;, built on the GPT-4o foundation, developers can start designing creative tools that feel conversational and iterative. This evolution invites a new kind of interface where prompting, tweaking, and refining happen inside the canvas, not outside of it.&lt;/p&gt;
&lt;p&gt;For teams building creative editing experience into their app, this moment coincides with the release of &lt;a href=&quot;https://img.ly/showcases/cesdk/ai-editor/web&quot;&gt;IMG.LY’s AI Editor SDK&lt;/a&gt;, a powerful, fully integrated toolkit designed for generative workflows. The SDK is already equipped to support interactive image generation, contextual editing, and multimodal inputs, and you can try it today through &lt;a href=&quot;https://img.ly/showcases/cesdk&quot;&gt;this live demo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This guide is a comprehensive introduction to the &lt;code&gt;gpt-image-1&lt;/code&gt; API, but it also goes further. It’s not just about wiring up an endpoint, it’s about rethinking what image generation means in a user-centric product.&lt;/p&gt;
&lt;p&gt;From prompt handling to interactive iteration, we’ll walk through how to design creative cycles, not just outputs. This guide explores how to make that shift, how to go from generating images to integrating &lt;code&gt;gpt-image-1&lt;/code&gt; into real creative cycles, where AI becomes a tool that bends to user intent, not the other way around.&lt;/p&gt;
&lt;h2 id=&quot;overview-of-gpt-image-1&quot;&gt;Overview of &lt;code&gt;gpt-image-1&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;OpenAI’s &lt;code&gt;gpt-image-1&lt;/code&gt; model, released in April 2025, is the latest evolution in the company’s generative image lineup and marks a turning point in how developers approach visual creation inside applications. Built on the same multimodal foundation as GPT-4o, this model allows applications to move beyond one-shot static generation and instead build toward more conversational, iterative image workflows.&lt;/p&gt;
&lt;h3 id=&quot;model-architecture-and-capabilities&quot;&gt;Model Architecture and Capabilities&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;gpt-image-1&lt;/code&gt; is rooted in GPT-4o’s ability to understand and generate across modalities. It is designed to produce high-resolution images—up to 4096×4096 pixels—based on natural language prompts. The model handles complex scenes with more fidelity than previous iterations and provides improved consistency in how it interprets detailed descriptions. This is particularly relevant for tools that need reliability when turning prompt inputs into design elements.&lt;/p&gt;
&lt;h3 id=&quot;parameter-control&quot;&gt;Parameter Control&lt;/h3&gt;
&lt;p&gt;Developers working with &lt;code&gt;gpt-image-1&lt;/code&gt; have access to a streamlined set of parameters, here is a subset of the most important ones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;prompt&lt;/code&gt;: The primary text input describing the desired image.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;size&lt;/code&gt;: Choose between “1024x1024”, “1024x1536” (portrait), “1536x1024” (landscape), or “auto” (default, based on prompt).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;n&lt;/code&gt;: Number of images to generate (default is 1).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;response_format&lt;/code&gt;: Always returns &lt;code&gt;b64_json&lt;/code&gt;. URL outputs are not supported.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unlike DALL·E 3, &lt;code&gt;gpt-image-1&lt;/code&gt; does not accept &lt;code&gt;style&lt;/code&gt; modifiers or &lt;code&gt;quality&lt;/code&gt; settings. It is designed for straightforward, high-fidelity image creation driven purely by the text prompt and size selection.&lt;/p&gt;
&lt;p&gt;Full documentation of these options is available via &lt;a href=&quot;https://platform.openai.com/docs/guides/images/usage&quot;&gt;OpenAI’s official guide&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;style-and-use-case-alignment&quot;&gt;Style and Use Case Alignment&lt;/h3&gt;
&lt;p&gt;By supporting a wide range of stylistic templates, &lt;code&gt;gpt-image-1&lt;/code&gt; positions itself as a flexible backend for everything from marketing collateral to storyboarding tools. The output can be tailored to suit technical illustrations, concept art, or even photorealistic renderings, allowing developers to map visual outputs more directly to brand or product requirements.&lt;/p&gt;
&lt;h3 id=&quot;limitations-and-future-direction&quot;&gt;Limitations and Future Direction&lt;/h3&gt;
&lt;p&gt;As of April 2025, &lt;code&gt;gpt-image-1&lt;/code&gt; supports only one image per request and does not offer fine-grained image editing or inpainting. However, its tight coupling with GPT-4o suggests that future iterations may embrace persistent context, conversational refinement, or even integrated image-plus-text exchanges within the same session. For developers building editors or multimodal workflows, the current model lays a strong foundation for these future capabilities.&lt;/p&gt;
&lt;h2 id=&quot;api-setup-and-usage&quot;&gt;API Setup and Usage&lt;/h2&gt;
&lt;h3 id=&quot;21-get-access&quot;&gt;2.1 Get Access&lt;/h3&gt;
&lt;p&gt;To start using &lt;code&gt;gpt-image-1&lt;/code&gt;, developers must first register for access via the OpenAI platform at &lt;a href=&quot;https://platform.openai.com/&quot;&gt;platform.openai.com&lt;/a&gt;. Access requires an API key, which is tied to your OpenAI account and associated usage limits based on your billing tier. Be sure to confirm that your account is approved for image generation, as availability may differ by region and subscription level. Once authenticated, keys can be created in your dashboard and stored securely in your server or development environment.&lt;/p&gt;
&lt;h3 id=&quot;22-first-image-generation-nodejs-example&quot;&gt;2.2 First Image Generation (Node.js Example)&lt;/h3&gt;
&lt;p&gt;The image generation API for &lt;code&gt;gpt-image-1&lt;/code&gt; can be used directly via OpenAI’s official Node.js client. Below is a complete example showing how to send a prompt and receive an image URL in response:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; OpenAI &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;openai&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; fs &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;fs&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; openai&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; OpenAI&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  apiKey: process.env.&lt;/span&gt;&lt;span&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;// make sure this is securely set&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; function&lt;/span&gt;&lt;span&gt; generateImage&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  try&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    const&lt;/span&gt;&lt;span&gt; prompt&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; `&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    A studio ghibli style illustration of a cyberpunk girl holding a butterfly on her finger.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    `&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    const&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; await&lt;/span&gt;&lt;span&gt; openai.images.&lt;/span&gt;&lt;span&gt;generate&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      model: &lt;/span&gt;&lt;span&gt;&apos;gpt-image-1&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      prompt,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      size: &lt;/span&gt;&lt;span&gt;&apos;1024x1024&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;// or &quot;1024x1536&quot;, &quot;1536x1024&quot;, or &quot;auto&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    const&lt;/span&gt;&lt;span&gt; image_base64&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; result.data[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;].b64_json;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    const&lt;/span&gt;&lt;span&gt; image_bytes&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; Buffer.&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;(image_base64, &lt;/span&gt;&lt;span&gt;&apos;base64&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    fs.&lt;/span&gt;&lt;span&gt;writeFileSync&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;butterfly.png&apos;&lt;/span&gt;&lt;span&gt;, image_bytes);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    console.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;Image saved as butterfly.png&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  } &lt;/span&gt;&lt;span&gt;catch&lt;/span&gt;&lt;span&gt; (err) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    console.&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;Error generating image:&apos;&lt;/span&gt;&lt;span&gt;, err);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;generateImage&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Remember that all outputs from &lt;code&gt;gpt-image-1&lt;/code&gt; are delivered as base64-encoded JSON. Developers should decode this data for display, storage, or further processing within their applications. For complete parameter options and examples, consult the &lt;a href=&quot;https://platform.openai.com/docs/guides/images&quot;&gt;OpenAI Images API guide&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;integrating-with-cesdk&quot;&gt;Integrating with CE.SDK&lt;/h2&gt;
&lt;p&gt;Embedding &lt;code&gt;gpt-image-1&lt;/code&gt; into a creative editor like CE.SDK is about more than just piping an image into a canvas. It reshapes how users interact with content creation, bridging manual design work and AI-driven generation within the same editing environment. Rather than operating as a standalone prompt generator, &lt;code&gt;gpt-image-1&lt;/code&gt; becomes a continuous creative partner inside your editor. For in in-depth technical guide on how to integrate &lt;code&gt;gpt-image-1&lt;/code&gt; stay tuned for our upcoming tutorial, &lt;a href=&quot;https://share.hsforms.com/1IgAOV1wASXGPnFG4ZPLejg1hk3i?ref=img.ly&quot;&gt;sign up to our newsletter&lt;/a&gt; to be notified when it goes live.&lt;/p&gt;
&lt;h3 id=&quot;embedding-image-generation-in-a-creative-editing-workflow&quot;&gt;Embedding Image Generation in a Creative Editing Workflow&lt;/h3&gt;
&lt;p&gt;The natural entry point for &lt;code&gt;gpt-image-1&lt;/code&gt; inside CE.SDK is through a dual-mode experience: offering users the option to start either from scratch or from existing context. In “from scratch” mode, a user might open a blank scene and initiate an image generation by writing a prompt for example, “Create a vibrant festival scene at sunset.” The result appears directly on the canvas, immediately editable like any other design element.&lt;/p&gt;
&lt;p&gt;Where &lt;code&gt;gpt-image-1&lt;/code&gt; shows its real potential is in “in-context editing.” Here, users interact with existing content—a background, a product shot, or a decorative element and trigger AI enhancements based on that visual context. A user might select an image of a bird, as in the example below and ask for variants, initiate a background swap, or request a change like adding more birds in a conversational interface embedded in the editor. Because CE.SDK treats generated images as first-class canvas elements, context such as positioning, layering, and cropping is preserved throughout the process.&lt;/p&gt;
&lt;p&gt;Let’s see what this might look like in practice. We positioned an image of a single bird on our canvas, opening the AI context menu we can now manipulate that image in place using the OpenAI API:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 940px) 940px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;940&quot; height=&quot;560&quot; src=&quot;https://img.ly/_astro/Screenshot-2025-04-25-at-16.23.20_1AbrtF.webp&quot; srcset=&quot;/_astro/Screenshot-2025-04-25-at-16.23.20_Z1575S9.webp 640w, /_astro/Screenshot-2025-04-25-at-16.23.20_ys06S.webp 750w, /_astro/Screenshot-2025-04-25-at-16.23.20_Z1EQsbT.webp 828w, /_astro/Screenshot-2025-04-25-at-16.23.20_1AbrtF.webp 940w&quot;&gt;&lt;/p&gt;
&lt;p&gt;We edit the image and prompt the API to add more birds:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1104px) 1104px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1104&quot; height=&quot;638&quot; src=&quot;https://img.ly/_astro/Screenshot-2025-04-25-at-11.19.07_Z25Ctb.webp&quot; srcset=&quot;/_astro/Screenshot-2025-04-25-at-11.19.07_Z1F7wOz.webp 640w, /_astro/Screenshot-2025-04-25-at-11.19.07_TIGxo.webp 750w, /_astro/Screenshot-2025-04-25-at-11.19.07_ab33d.webp 828w, /_astro/Screenshot-2025-04-25-at-11.19.07_1t9at7.webp 1080w, /_astro/Screenshot-2025-04-25-at-11.19.07_Z25Ctb.webp 1104w&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1056px) 1056px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1056&quot; height=&quot;548&quot; src=&quot;https://img.ly/_astro/Screenshot-2025-04-25-at-11.19.31_1AbzqX.webp&quot; srcset=&quot;/_astro/Screenshot-2025-04-25-at-11.19.31_2tR7u4.webp 640w, /_astro/Screenshot-2025-04-25-at-11.19.31_Z1mkOlX.webp 750w, /_astro/Screenshot-2025-04-25-at-11.19.31_YB1k2.webp 828w, /_astro/Screenshot-2025-04-25-at-11.19.31_1AbzqX.webp 1056w&quot;&gt;&lt;/p&gt;
&lt;p&gt;We see that the model correctly identified the type of bird in the picture (seagull) and filled it in with a swarm of flying seagulls.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1130px) 1130px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1130&quot; height=&quot;622&quot; src=&quot;https://img.ly/_astro/Screenshot-2025-04-25-at-11.35.50_ZmbWJt.webp&quot; srcset=&quot;/_astro/Screenshot-2025-04-25-at-11.35.50_cDB31.webp 640w, /_astro/Screenshot-2025-04-25-at-11.35.50_1IhS4i.webp 750w, /_astro/Screenshot-2025-04-25-at-11.35.50_1U1mW3.webp 828w, /_astro/Screenshot-2025-04-25-at-11.35.50_ZmpbYH.webp 1080w, /_astro/Screenshot-2025-04-25-at-11.35.50_ZmbWJt.webp 1130w&quot;&gt;&lt;/p&gt;
&lt;p&gt;We can now continue to work with the image, overlaying filters, changing the texture, cropping etc.&lt;/p&gt;
&lt;h3 id=&quot;switching-between-manual-edits-and-ai-powered-enhancements&quot;&gt;Switching Between Manual Edits and AI-Powered Enhancements&lt;/h3&gt;
&lt;p&gt;A critical design principle when integrating &lt;code&gt;gpt-image-1&lt;/code&gt; is giving users freedom to toggle between manual edits and AI suggestions. Manual edits should always remain possible after generation, e.g. cropping, masking, compositing while users can also seamlessly prompt &lt;code&gt;gpt-image-1&lt;/code&gt; for additional changes without losing prior work. Think of variant generation as a branch: a user picks a generated image and creates “forks” by asking for alternate styles, different lighting, or new thematic elements.&lt;/p&gt;
&lt;p&gt;In this setup, the generated image serves as a stable node in the creative graph, while edits and regenerations can attach contextually. This workflow minimizes user frustration by avoiding the “start over” penalty typical of isolated generation APIs. It also opens up more complex creative behaviors, like blending user-drawn sketches with AI-augmented refinements, or iteratively developing an asset library around a consistent visual theme.&lt;/p&gt;
&lt;p&gt;An upcoming in-depth tutorial will walk through implementing this multimodal workflow step-by-step, but the key takeaway is that &lt;code&gt;gpt-image-1&lt;/code&gt; shines brightest when it is embedded into a creative loop—not treated as a black-box generator, but as an interactive, iterative design companion.&lt;/p&gt;
&lt;h2 id=&quot;prompt-engineering-tips&quot;&gt;Prompt Engineering Tips&lt;/h2&gt;
&lt;p&gt;One of the most overlooked but critical factors in successful image generation is prompt design. With &lt;code&gt;gpt-image-1&lt;/code&gt;, prompt engineering isn’t just about describing an image—it’s about steering the model toward intent, tone, composition, and usability. Because the model is capable of rendering complex scenes and a wide range of styles, thoughtful phrasing and contextual hints can dramatically affect the outcome.&lt;/p&gt;
&lt;h3 id=&quot;writing-for-visual-intent&quot;&gt;Writing for Visual Intent&lt;/h3&gt;
&lt;p&gt;Start by clarifying what the image is supposed to communicate. Are you looking for atmosphere, action, product detail, or narrative clarity? A prompt like “a city skyline at night” is a starting point, but it leaves too much to chance. Adding elements like “view from a rooftop bar, with glowing signage and overcast haze” gives the model anchors for both composition and mood.&lt;/p&gt;
&lt;h3 id=&quot;leveraging-artistic-language&quot;&gt;Leveraging Artistic Language&lt;/h3&gt;
&lt;p&gt;You can further refine outputs by referencing mediums or artistic schools. Prompts that include terms like “in watercolor style,” “oil painting,” ”80s anime aesthetic,” or “studio photography” help the model lock onto a particular visual identity. These cues not only improve stylistic fidelity but also align the output with specific brand or genre expectations, which is especially important for products with a defined look and feel.&lt;/p&gt;
&lt;h3 id=&quot;creating-consistency-in-branded-outputs&quot;&gt;Creating Consistency in Branded Outputs&lt;/h3&gt;
&lt;p&gt;When generating a set of related images, such as social media creatives, campaign assets, or UI visuals, consistency becomes more important than variety. To achieve this, structure prompts with repeatable patterns and include brand elements such as color palettes, motifs, or reference characters. While &lt;code&gt;gpt-image-1&lt;/code&gt; doesn’t yet support persistent memory across requests, consistency can be enforced by prompting with the same style terms, layout descriptions, and constraints. Teams working within CE.SDK can even pair prompt templates with locked canvas layers to preserve composition between generations.&lt;/p&gt;
&lt;p&gt;Ultimately, good prompt engineering is not about verbosity but about clarity and constraint. It’s less like writing poetry and more like drafting a product spec. The best prompts are focused, directive, and give the model just enough creative freedom within clear boundaries. However, effective prompting should not burden the user. In practice, the interface should abstract most of the complexity away. Users can be guided toward better outputs through simple UI choices—selecting predefined styles, choosing themes, or adjusting mood settings—while the system dynamically enhances and augments their input behind the scenes. By managing the technical depth invisibly, you enable a creative process that feels intuitive and powerful without ever making prompt engineering the center of the user experience.&lt;/p&gt;
&lt;h2 id=&quot;real-world-use-cases&quot;&gt;Real-World Use Cases&lt;/h2&gt;
&lt;p&gt;The versatility of &lt;code&gt;gpt-image-1&lt;/code&gt; makes it especially impactful across a variety of industries where visual content creation is either a core product feature or a major operational need. Beyond isolated image generation, the model supports workflows that demand contextual awareness, brand consistency, and iterative refinement, key ingredients for modern digital products.&lt;/p&gt;
&lt;h3 id=&quot;web-to-print&quot;&gt;Web-to-Print&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://img.ly/use-cases/web-to-print-design-tool&quot;&gt;In web-to-print applications&lt;/a&gt;, customers expect to customize marketing materials, event invitations, signage, or packaging with minimal friction. By integrating &lt;code&gt;gpt-image-1&lt;/code&gt;, developers can offer template-driven personalization where users simply select a theme or enter a few keywords, and receive ready-to-edit visual assets. Combined with CE.SDK’s layout and editing capabilities, this enables a highly interactive experience where generated backgrounds, graphical elements, or themed illustrations can be dynamically placed into editable templates.&lt;/p&gt;
&lt;h3 id=&quot;social-media-marketing-and-martech&quot;&gt;Social Media Marketing and MarTech&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://img.ly/industries/marketing-tech&quot;&gt;Marketing teams rely on high-frequency content creation&lt;/a&gt;, often needing visually consistent, campaign-specific assets. &lt;code&gt;gpt-image-1&lt;/code&gt; can assist by automating the generation of background scenes, promotional visuals, and thematic graphics based on campaign briefs. Brands can define style presets aligned with their visual identity, making it easy for marketing teams to produce “on-brand” assets without heavy design overhead. Integrating image generation directly into campaign builders or social scheduling tools amplifies speed without sacrificing quality.&lt;/p&gt;
&lt;h3 id=&quot;digital-asset-management-dam&quot;&gt;Digital Asset Management (DAM)&lt;/h3&gt;
&lt;p&gt;Asset libraries often suffer from gaps: missing variants, seasonal versions, or content tailored to different demographics. &lt;a href=&quot;https://img.ly/industries/digital-asset-management&quot;&gt;DAM systems&lt;/a&gt; can integrate &lt;code&gt;gpt-image-1&lt;/code&gt; to extend asset catalogs dynamically. Instead of manually commissioning variations, users can generate alternative backgrounds, localize visuals with region-specific elements, or adjust brand visuals for different markets—all from a single master file. With CE.SDK handling structured editing, teams maintain asset consistency while boosting creative flexibility.&lt;/p&gt;
&lt;h3 id=&quot;e-commerce&quot;&gt;E-Commerce&lt;/h3&gt;
&lt;p&gt;Product visualization remains a huge &lt;a href=&quot;https://img.ly/industries/e-commerce&quot;&gt;challenge in e-commerce&lt;/a&gt;, especially for smaller retailers. &lt;code&gt;gpt-image-1&lt;/code&gt; can be used to automatically create product lifestyle imagery, context backgrounds, or thematic campaigns without expensive photo shoots. For example, a single shoe photograph can be placed into a generated “urban,” “sporty,” or “luxury” background, customized according to target audiences. When tightly integrated into e-commerce platforms, this enables faster product launches, A/B tested visuals, and localized campaigns at scale.&lt;/p&gt;
&lt;h3 id=&quot;e-learning&quot;&gt;E-Learning&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://img.ly/industries/e-learning&quot;&gt;Educational platforms&lt;/a&gt; can harness &lt;code&gt;gpt-image-1&lt;/code&gt; to generate explanatory diagrams, thematic illustrations, or scene-based visual storytelling assets. Instead of relying solely on static stock imagery, teachers, course designers, or even learners themselves can prompt the generation of custom visuals aligned with the curriculum. When embedded into authoring tools, this approach accelerates content creation and enables more engaging, visually enriched learning experiences tailored to specific topics and age groups.&lt;/p&gt;
&lt;h2 id=&quot;cost-optimization&quot;&gt;Cost Optimization&lt;/h2&gt;
&lt;p&gt;While &lt;code&gt;gpt-image-1&lt;/code&gt; opens up impressive creative possibilities, it also introduces new cost considerations that developers and product teams must plan for carefully. Since image generation typically incurs higher API costs than text-based operations, structuring workflows efficiently becomes critical, especially at scale.&lt;/p&gt;
&lt;h3 id=&quot;balancing-price-quality-and-resolution&quot;&gt;Balancing Price, Quality, and Resolution&lt;/h3&gt;
&lt;p&gt;The cost of generating an image with &lt;code&gt;gpt-image-1&lt;/code&gt; depends significantly on both the requested resolution and the selected quality setting. Higher resolutions like 4096×4096 produce sharper, more detailed results, but they also consume more compute resources-and therefore cost more. For many use cases, especially for previews, lower resolutions such as 1024×1024 or 2048×2048 strike an excellent balance between visual fidelity and API efficiency. Reserving the highest quality settings for final exports or premium workflows can help manage overall spend without compromising user experience.&lt;/p&gt;
&lt;h3 id=&quot;image-reuse-and-smart-upscaling&quot;&gt;Image Reuse and Smart Upscaling&lt;/h3&gt;
&lt;p&gt;One practical cost-saving approach is to design workflows that encourage image reuse. Instead of regenerating similar images for every small variation, applications can create high-quality master images and allow users to crop, edit, or layer additional design elements dynamically. Integrating smart upscaling techniques-for instance, using specialized image enhancement libraries after initial generation-also allows teams to work with smaller base images without sacrificing end-user quality.&lt;/p&gt;
&lt;h3 id=&quot;rate-limits-and-batching-strategies&quot;&gt;Rate Limits and Batching Strategies&lt;/h3&gt;
&lt;p&gt;Every call to &lt;code&gt;gpt-image-1&lt;/code&gt; counts toward your usage quota, and OpenAI imposes rate limits depending on account tier. To optimize performance and cost, it’s helpful to batch generation requests thoughtfully where possible-for instance, combining multiple prompts into structured queues or allowing users to preview low-res draft versions before finalizing a high-res render. Building this logic into your app’s generation flow not only controls expenses but also improves perceived responsiveness, an important UX factor for creative applications.&lt;/p&gt;
&lt;p&gt;By considering cost optimization as an early design constraint rather than a late-stage patch, developers can build scalable, sustainable creative tools powered by &lt;code&gt;gpt-image-1&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;bonus-starter-kit-repo&quot;&gt;Bonus: Starter Kit Repo&lt;/h2&gt;
&lt;p&gt;We are currently in the process of integrating the new GPT-4o-powered &lt;code&gt;gpt-image-1&lt;/code&gt; model into CE.SDK. As part of this effort, we are preparing a comprehensive Starter Kit will showcase a complete with CE.SDK integration, real-time prompt input, image generation workflows, and best practices for building an AI-powered creative editor.&lt;/p&gt;
&lt;p&gt;Both a public GitHub repository and a live demo will be made available soon. If you want to be notified when the Starter Kit launches, you can subscribe to updates &lt;a href=&quot;https://share.hsforms.com/1IgAOV1wASXGPnFG4ZPLejg1hk3i&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This Starter Kit is designed to help developers move beyond simple image generation into building full creative cycles, where users can generate, edit, refine, and remix visuals seamlessly inside the editor.&lt;/p&gt;
&lt;h2 id=&quot;faqs&quot;&gt;FAQs&lt;/h2&gt;

&lt;p&gt;Choosing to work with &lt;code&gt;gpt-image-1&lt;/code&gt; raises a number of practical and strategic questions. Below, we address the most common topics for teams evaluating the model for integration into creative workflows.&lt;/p&gt;
&lt;h3 id=&quot;how-is-gpt-image-1-different-from-dalle-3&quot;&gt;How is &lt;code&gt;gpt-image-1&lt;/code&gt; different from DALL·E 3?&lt;/h3&gt;
&lt;p&gt;While DALL·E 3 and &lt;code&gt;gpt-image-1&lt;/code&gt; both translate text prompts into images, the underlying architecture and integration paths are different. &lt;code&gt;gpt-image-1&lt;/code&gt; is built on GPT-4o’s multimodal framework, making it better suited for future conversational and iterative workflows. It also offers support for a wider range of styles, higher resolutions up to 4096×4096 pixels, and is positioned for deeper integration into dynamic user experiences rather than one-off generation tasks.&lt;/p&gt;
&lt;h3 id=&quot;can-you-fine-tune-or-train-gpt-image-1&quot;&gt;Can you fine-tune or train &lt;code&gt;gpt-image-1&lt;/code&gt;?&lt;/h3&gt;
&lt;p&gt;As of April 2025, OpenAI does not allow fine-tuning of &lt;code&gt;gpt-image-1&lt;/code&gt;. The model is optimized for broad creative use cases out of the box. Developers seeking more control typically customize the user-facing prompt engineering or combine outputs with structured editing tools like CE.SDK to achieve brand or project-specific consistency.&lt;/p&gt;
&lt;h3 id=&quot;is-offline-support-available&quot;&gt;Is offline support available?&lt;/h3&gt;
&lt;p&gt;Currently, &lt;code&gt;gpt-image-1&lt;/code&gt; requires access to OpenAI’s cloud APIs. There is no offline inference mode or local deployment option. Teams requiring strict data residency, offline workflows, or private model hosting should consider hybrid architectures where images are generated securely via backend services and then edited locally using embedded tools like CE.SDK.&lt;/p&gt;
&lt;h3 id=&quot;what-about-copyright-and-licensing&quot;&gt;What about copyright and licensing?&lt;/h3&gt;
&lt;p&gt;Images generated by &lt;code&gt;gpt-image-1&lt;/code&gt; can be used commercially according to OpenAI’s &lt;a href=&quot;https://openai.com/en-GB/policies/usage-policies/&quot;&gt;usage policies&lt;/a&gt;, but developers are encouraged to review the latest terms. Outputs are not directly copyrighted by OpenAI or the user, and responsibility for ensuring compliance with branding, likeness, or content standards typically falls on the developer or platform operator. When deploying generation features to end-users, it is good practice to provide clear terms of use and, if needed, additional moderation or review layers.&lt;/p&gt;
&lt;p&gt;By addressing these considerations early, teams can integrate &lt;code&gt;gpt-image-1&lt;/code&gt; more effectively and responsibly into creative products and workflows.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;gpt-image-1&lt;/code&gt; offers developers a significant opportunity to rethink what image generation can mean inside creative applications. It is not simply a tool for producing pictures on command, but a foundation for building interactive, iterative design workflows where users stay in control of the creative process. When combined with CE.SDK, it becomes even easier to move from static outputs to living, editable canvases that support real-world design needs. As we continue to integrate GPT-4o capabilities, the next wave of creative tooling will be about more than prompting images-it will be about shaping truly collaborative creative environments. Now is the time to start experimenting, iterating, and reimagining the user experience around this new generation of multimodal AI.&lt;/p&gt;</content:encoded><dc:creator>Jan</dc:creator><media:content url="https://blog.img.ly/2025/04/GPT-Image-1-ultimate-guide.jpg" medium="image"/><category>AI</category><category>Creative Workflows</category><category>gpt-4o</category></item><item><title>How OpenAI&apos;s Upcoming GPT-4o Image Generation API Will Change Creative Workflows</title><link>https://img.ly/blog/open-ai-gpt-4o-image-generation-api-will-change-creative-workflows/</link><guid isPermaLink="true">https://img.ly/blog/open-ai-gpt-4o-image-generation-api-will-change-creative-workflows/</guid><description>OpenAI’s GPT-4o enables real-time, interactive image generation. Instead of one-off prompts, users can refine visuals through conversation. This unlocks new UX patterns like editable outputs and character persistence. IMG.LY’s CE.SDK makes GPT-4o easy to integrate into your editor.</description><pubDate>Mon, 14 Apr 2025 10:51:53 GMT</pubDate><content:encoded>&lt;p&gt;If you’ve been working with image-generation APIs over the past year, you’ve probably gotten used to a certain flow: send a prompt, wait a few seconds, and get a flat image back. It’s a one-shot deal. Useful? Definitely. But not exactly interactive. That’s what will change with OpenAI’s upcoming GPT-4o image-generation capabilities.&lt;br&gt;
IMG.LY, which recently &lt;a href=&quot;https://img.ly/use-cases/ai-editor&quot;&gt;released a suite of AI features for its design editor&lt;/a&gt;, is eagerly awaiting the release to expand how users can interact with AI-driven creativity even further.&lt;/p&gt;
&lt;h2 id=&quot;update-ai-first-visual-editing&quot;&gt;Update: AI-first Visual Editing&lt;/h2&gt;
&lt;p&gt;A day after the release of the &lt;code&gt;gpt-image-1&lt;/code&gt; API, we put the UX principles outlined in this post into practice and integrated it into CreativeEditor SDK. Users can now generate images, create variants and use the canvas to compose visual prompts with our design editor. See it in action:&lt;/p&gt;
&lt;div class=&quot;cta-button-wrapper&quot;&gt;&lt;a href=&quot;https://cdn.img.ly/demo/gpt-image-1/v1/&quot; target=&quot;_blank&quot; class=&quot;cta-button&quot;&gt;Open AI Editor Demo Page&lt;/a&gt;&lt;/div&gt;
&lt;h2 id=&quot;gpt-4o-beyond-the-prompt-to-image-pipeline&quot;&gt;GPT-4o: Beyond the Prompt-to-Image Pipeline&lt;/h2&gt;
&lt;p&gt;GPT-4o isn’t just another version of DALL·E. It represents a shift in how developers will integrate AI into creative applications. While DALL·E 3 is powerful it is also somewhat siloed (you send a prompt, you get an image), GPT-4o looks like it will be part of a much more dynamic, conversational model one that accepts both text and image inputs, and could soon generate visual content in context, on the fly, and as part of a back-and-forth user interaction.&lt;/p&gt;
&lt;p&gt;If you’ve used ChatGPT recently, you’ve already seen glimpses of this. You can drop an image into the chat, ask GPT to describe or edit it, and get a response that feels fluid and visual. Developers should expect the API version to follow a similar pattern. It likely won’t just be a &lt;code&gt;/generate-image&lt;/code&gt; endpoint. Instead, we may be looking at an extension of the &lt;code&gt;chat/completions&lt;/code&gt; endpoint that handles multimodal messages. That changes the way you integrate this capability into your application. Rather than simply placing an image generation step in your pipeline, you will have to build your app’s UX around this new user flow. This comes with its own set of unique challenges.&lt;/p&gt;
&lt;h3 id=&quot;rethinking-the-interface-prompting-as-a-conversation&quot;&gt;Rethinking the Interface: Prompting as a Conversation&lt;/h3&gt;
&lt;p&gt;So what does this mean if you’re planning to integrate multi-modal image generation into your own product? For starters, you’ll probably need to rethink how users initiate and refine prompts. In the DALL·E flow, you might offer a text box with a few style dropdowns and call it a day. But in a GPT-4o world, your UI needs to support image inputs, persistent context, and dynamic editing, image gen becomes more like a conversation than a command.&lt;/p&gt;
&lt;p&gt;This is where the rubber meets the road. The tools that will benefit most from GPT-4o aren’t static generators but interactive editors. Think collaborative design apps, video editors with generative overlays, or product customizers that let users sketch or upload a photo and then iterate with AI. Put differently, the model output isn’t the endpoint but rather a checkpoint in the creation process.&lt;/p&gt;
&lt;h3 id=&quot;a-typical-iteration-cycle-in-a-multimodal-workflow&quot;&gt;A Typical Iteration Cycle in a Multimodal Workflow&lt;/h3&gt;
&lt;p&gt;Here’s a rough sketch of a workflow we might be seeing more of: The user starts with a prompt and an image, maybe a rough sketch or collage created inside an editor, a product photo, or a UI frame. GPT-4o returns a generated image based on that input. The user then edits or annotates the result, maybe adds new prompt text for refinement, and resubmits that combination to further develop the output. &lt;strong&gt;This cycle might loop several times&lt;/strong&gt;: generate, tweak, refine, regenerate.&lt;/p&gt;
&lt;p&gt;That’s a fundamentally different interaction model from past AI tooling. It’s less about one-off generation and more about a guided creative journey, where the user is in dialogue with the model. The result: better alignment with the original intent, more control, and more usable creative outputs.&lt;/p&gt;
&lt;p&gt;There is an additional, more subjective benefit to this kind of workflow: it gives the user a sense of autonomy again; they are back in the driver’s seat and less at the whim of an inscrutable machine. In many contexts, that makes a difference. Most notably, as we discussed in our white paper on &lt;a href=&quot;https://img.ly/white-papers&quot;&gt;print personalization&lt;/a&gt;, the psychological benefit of personalization lies to a large extent in the investment, the sense of ownership that comes about when you create something. “Make it yours” is the common tagline attached to personalization campaigns in e-commerce. That only works if the user exerts more control over the output than iterating over a set of prompts.&lt;/p&gt;
&lt;p&gt;The most pithy encapsulation of this paradigm that I have heard is &lt;strong&gt;Humans on top, AI on tap&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;persistent-elements-and-visual-consistency&quot;&gt;Persistent Elements and Visual Consistency&lt;/h3&gt;
&lt;p&gt;One particularly interesting frontier here is character and object persistence. If a user defines a character early in the workflow, either via prompt, image, or a combination, they’ll increasingly expect that character to appear consistently across assets. Think of it as visual continuity, whether you’re generating scenes in a story, slides in a deck, or frames in a video.&lt;/p&gt;
&lt;p&gt;If the user of a creative marketing cloud creates a campaign avatar or mascot, that &lt;strong&gt;character needs to be&lt;/strong&gt; &lt;strong&gt;consistent&lt;/strong&gt; within and across campaigns.&lt;/p&gt;
&lt;p&gt;Being able to reference earlier outputs, prompts, or style cues gives the user control over not just individual assets but the &lt;strong&gt;whole arc of the design narrative&lt;/strong&gt;. GPT-4o’s ability to maintain that continuity is a game-changer for workflows that involve storytelling, brand identity, or serialized design work.&lt;/p&gt;
&lt;h2 id=&quot;what-to-expect-from-the-api&quot;&gt;What to Expect from the API&lt;/h2&gt;
&lt;p&gt;Technically, if GPT-4o follows OpenAI’s recent design philosophy, you can expect a JSON-based API with a &lt;code&gt;messages&lt;/code&gt; array, where content can include both &lt;code&gt;text&lt;/code&gt; and &lt;code&gt;image_url&lt;/code&gt; types. The output will likely be returned either as an image URL hosted by OpenAI or as base64-encoded image data, depending on the format you request.&lt;/p&gt;
&lt;p&gt;That structure plays nicely with modern JavaScript front-end frameworks. React, Svelte, and Vue are all well-suited to async generation flows with visual previews. If you’re already using tools like &lt;a href=&quot;https://zustand.docs.pmnd.rs/&quot;&gt;Zustand&lt;/a&gt; or &lt;a href=&quot;https://jotai.org/&quot;&gt;Jotai&lt;/a&gt; for local state or something like &lt;a href=&quot;https://trpc.io/&quot;&gt;tRPC&lt;/a&gt; or &lt;a href=&quot;https://graphql.org/&quot;&gt;GraphQL&lt;/a&gt; for structured calls, you’re in a good position to layer GPT-4o in without breaking the flow.&lt;/p&gt;
&lt;h3 id=&quot;trade-offs-and-technical-considerations&quot;&gt;Trade-offs and Technical Considerations&lt;/h3&gt;
&lt;p&gt;There are trade-offs, of course. GPT-4o will probably cost more per call than a standard DALL·E 2 or 3 generation. Its latency is still an open question, and the multimodal input support will likely require more thoughtful UX decisions. What happens when a user drops an image and wants to undo just part of the generation? Where do you store prompt context for edits? How do you communicate what’s editable and what’s not?&lt;/p&gt;
&lt;p&gt;This is where design and engineering need to work together. You’ll want to build an interface that makes AI feel like a creative partner, not just a backend service. That might mean giving users a visual prompt history or allowing partial re-generations of specific canvas elements. You’ll need sensible fallback states. What happens when generation fails or the result isn’t what the user wanted?&lt;/p&gt;
&lt;h2 id=&quot;where-imglys-cesdk-fits-in&quot;&gt;Where IMG.LY’s CE.SDK Fits In&lt;/h2&gt;
&lt;p&gt;We have already given the questions raised above some serious thought, and most of the complexities introduced by this new workflow are the table stakes for the Creative Editor. So, if you’ve already integrated IMG.LY’s CE.SDK, we have taken care of most of these problems, and you can seamlessly integrate with any AI model. We are actively working on an off-the-shelf integration of the GPT-4o image model once its public API launches.&lt;/p&gt;
&lt;p&gt;In general, you can treat GPT-4o’s image outputs as just another layer in the editing canvas, positioned, styled, cropped, and ultimately editable in the same environment as everything else. That’s the real power of multimodal workflows: not just generating but integrating. And once GPT-4o’s API goes live, you’ll want your infrastructure ready to slot it in with minimal friction.&lt;/p&gt;
&lt;h3 id=&quot;the-loop-prompt-generate-refine&quot;&gt;The Loop: Prompt, Generate, Refine&lt;/h3&gt;
&lt;p&gt;The era of single-shot generation is winding down. What’s coming next is a loop: edit, prompt, generate, refine, repeat. And this loop doesn’t just belong in the backend, it needs to live in the UI, in a way that invites user input, creativity, and correction.&lt;/p&gt;
&lt;p&gt;We’ll be publishing more on how this integrates into IMG.LY’s upcoming AI workflows soon. Expect tools that don’t just generate visuals but help teams and individuals work through ideas in real time. Because especially as AI gets more potent, it needs humans on top.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;3,000+ creative professionals gain early access to new features and updates—don’t miss out, and&lt;/strong&gt; &lt;a href=&quot;https://share.hsforms.com/1IgAOV1wASXGPnFG4ZPLejg1hk3i?ref=img.ly&quot;&gt;&lt;strong&gt;subscribe&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;to our newsletter.&lt;/strong&gt;&lt;/p&gt;</content:encoded><dc:creator>Jan</dc:creator><media:content url="https://blog.img.ly/2025/04/GPT-4o-API-Changes-1.jpg" medium="image"/><category>AI</category><category>gpt-4o</category><category>Creative Workflows</category></item><item><title>Top 5 Generative AI APIs for Creative Apps in 2025: A Developer’s Guide (GPT-4o, Gemini, Firefly, and More)</title><link>https://img.ly/blog/comparing-image-generation-apis-gpt-4o-gemini-firefly-and-more/</link><guid isPermaLink="true">https://img.ly/blog/comparing-image-generation-apis-gpt-4o-gemini-firefly-and-more/</guid><description>AI image generation is quickly becoming a must-have in creative apps. But with so many models and APIs to choose from, picking the right one can be tricky. This guide breaks down the top options like DALL·E, GPT-4o, Gemini, and SDXL to help you find the best fit for your product and users.</description><pubDate>Mon, 14 Apr 2025 07:57:51 GMT</pubDate><content:encoded>&lt;p&gt;If you’re working on creative tooling right now, anything from a lightweight design editor to a marketing automation suite, you’re probably already thinking about or actively working on bringing image generation into the mix. The tech is here, expectations are rising, and if your users can’t type a prompt and get a visual back in seconds, your app might feel like it’s lagging behind.&lt;/p&gt;
&lt;p&gt;But choosing &lt;em&gt;which&lt;/em&gt; AI model to integrate, and how, isn’t all that straightforward. There’s a growing ecosystem of APIs out there, and they don’t all behave the same way, some are designed for open-ended creativity, others for structured workflows. Some offer pixel-perfect fidelity with fine control, others lean toward rapid ideation. And Importantly in our content not all of them are equally accessible to developers.&lt;/p&gt;
&lt;p&gt;This is a guide to help you make sense of it all. What models are available, how do they differ, and what should you consider when embedding them into your product. This isn’t supposed to be a hype piece or a leaderboard, just a clear-eyed look at what’s out there and what’s coming.&lt;/p&gt;
&lt;h3 id=&quot;openai-gpt-4o&quot;&gt;OpenAI GPT-4o&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://openai.com/index/introducing-4o-image-generation/&quot;&gt;GPT-4o is OpenAI&lt;/a&gt;’s next-gen multimodal model, currently only available inside ChatGPT. It can take both text and images as input and is capable of generating image outputs in context.&lt;/p&gt;
&lt;p&gt;The potential upside is significant. With GPT-4o, you may soon be able to create deeply interactive creative tools where users chat, sketch, and prompt all within a single UI. It’s likely to support richer input types and more natural iteration flows.&lt;/p&gt;
&lt;p&gt;The main downside is availability. There’s no API yet, so you can’t build on it directly. It also remains to be seen how OpenAI will expose generation tools—whether through a dedicated endpoint or via the chat interface.&lt;/p&gt;
&lt;p&gt;GPT-4o is right for you if you’re planning ahead and want to design for a future where multimodal interaction is the norm. It’s not something you can use today, but it should inform how you architect your UI and prompt handling.&lt;/p&gt;
&lt;h3 id=&quot;openai-dalle-3&quot;&gt;OpenAI DALL·E 3&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://openai.com/index/dall-e-3/&quot;&gt;DALL·E 3&lt;/a&gt; is OpenAI’s current image generation API, available via both the platform and ChatGPT. It translates text prompts into images and is known for interpreting prompts accurately and producing clean, useful visuals.&lt;/p&gt;
&lt;p&gt;Its strengths are clarity, commercial readiness, and reliability. It’s easy to use and integrates well into frontend flows that involve text-to-image generation.&lt;/p&gt;
&lt;p&gt;However, it lacks features like inpainting, style tuning, or detailed layout control. You also don’t get deep iteration features—each image is a new generation.&lt;/p&gt;
&lt;p&gt;DALL·E 3 is a good fit if you want &lt;strong&gt;high-quality results from text prompts&lt;/strong&gt; with minimal complexity. It’s especially useful for marketing visuals, content automation, and simple design tools.&lt;/p&gt;
&lt;h3 id=&quot;google-gemini-imagen&quot;&gt;Google Gemini (Imagen)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://gemini.google.com/&quot;&gt;Gemini&lt;/a&gt;, powered by Google’s Imagen models, is available via &lt;a href=&quot;https://fal.ai/&quot;&gt;fal.ai&lt;/a&gt;, Makersuite, Vertex AI. It supports not only text prompts, but also sketches and inpainting, making it one of the more flexible APIs for creative work.&lt;/p&gt;
&lt;p&gt;Its big advantage is control. You can use sketches to guide composition and make visual edits to generated outputs. That makes it ideal for &lt;strong&gt;iterative design processes&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The downside is that it can be tricky to navigate Google’s ecosystem. Access and feature sets can change quickly, and the integration overhead is higher than OpenAI.&lt;/p&gt;
&lt;p&gt;Gemini is right for you if your product needs image refinement, visual grounding, or sketch-to-image workflows. It fits e-commerce editors, mockup tools, and design collaboration features.&lt;/p&gt;
&lt;h3 id=&quot;adobe-firefly&quot;&gt;Adobe Firefly&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.adobe.com/de/products/firefly.html&quot;&gt;Firefly is Adobe&lt;/a&gt;’s generative image model, integrated tightly into Creative Cloud. It stands out for its licensing model—images are trained on Adobe Stock, meaning they’re cleared for commercial use.&lt;/p&gt;
&lt;p&gt;The biggest strength here is trust and integration. Designers already using Photoshop or Illustrator can use Firefly to generate content directly in their layers and work non-destructively.&lt;/p&gt;
&lt;p&gt;The drawback is API access. There is no public endpoint for Firefly yet, and its features are embedded in Adobe’s own ecosystem.&lt;/p&gt;
&lt;p&gt;Firefly is a strong option if you’re building for agencies, brand teams, or other users with high expectations around copyright and integration with existing Adobe workflows.&lt;/p&gt;
&lt;h3 id=&quot;stability-ai-sdxl&quot;&gt;Stability AI (SDXL)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://stability.ai/&quot;&gt;Stability AI&lt;/a&gt; offers an open-source model suite, with SDXL as the flagship for high-resolution image generation. It supports both text and image inputs and can be run locally or hosted via services like Replicate.&lt;/p&gt;
&lt;p&gt;Its biggest advantage is flexibility. You can fine-tune models, build custom workflows, or even run inference offline. It’s ideal for teams that want full control.&lt;/p&gt;
&lt;p&gt;The challenge is quality consistency. Compared to closed models like DALL·E, SDXL may require more tuning, and prompt engineering matters more. Hosting and scaling also require more effort.&lt;/p&gt;
&lt;p&gt;SDXL is right for you if you need an open, customizable system that fits into a broader pipeline. It’s a solid choice for research tools, OSS projects, and privacy-conscious applications.&lt;/p&gt;
&lt;h3 id=&quot;midjourney&quot;&gt;Midjourney&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.midjourney.com/home&quot;&gt;Midjourney&lt;/a&gt; is a proprietary model with a focus on aesthetic, stylized image generation. It runs exclusively via Discord and is popular for its distinctive look and community-driven prompts.&lt;/p&gt;
&lt;p&gt;Its upside is the quality of its visuals, especially for stylized scenes or concept art. Designers often use it as an ideation tool.&lt;/p&gt;
&lt;p&gt;The limitation is integration. There’s no API, no SDK, and limited ways to embed it in your own product beyond scraping or bots.&lt;/p&gt;
&lt;p&gt;Midjourney is best used as an inspiration engine. If your workflow includes moodboarding or creative brainstorming, it can supplement—but not power—your product.&lt;/p&gt;
&lt;h3 id=&quot;hugging-face&quot;&gt;Hugging Face&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://huggingface.co/&quot;&gt;Hugging Face&lt;/a&gt; is a hub for open models, offering hosted APIs for SDXL variants, Playground v2, and other creative generation tools.&lt;/p&gt;
&lt;p&gt;The main benefit is diversity. You can try multiple models, experiment with variations, and deploy quickly using their hosted inference endpoints.&lt;/p&gt;
&lt;p&gt;That said, it’s not always ready for production. Some models lack documentation or support, and you may need to piece together features.&lt;/p&gt;
&lt;p&gt;Hugging Face is a great choice for experimental projects, prototyping, or if you want to stay vendor-neutral and build your own stack.&lt;/p&gt;
&lt;h3 id=&quot;runway-gen-2-and-leonardoai&quot;&gt;Runway Gen-2 and Leonardo.Ai&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://runwayml.com/&quot;&gt;Runway&lt;/a&gt; and &lt;a href=&quot;https://leonardo.ai/&quot;&gt;Leonardo&lt;/a&gt; are rising players at the edge of AI and media. Runway’s Gen-2 supports text-to-video and animated image generation, while Leonardo focuses on style-consistent 2D asset generation.&lt;/p&gt;
&lt;p&gt;These platforms bring specialization. Runway is tailored to video and cinematic scenes, while Leonardo offers structured design features for asset creators.&lt;/p&gt;
&lt;p&gt;They’re less open from a dev perspective. APIs are limited, and integration support is still maturing.&lt;/p&gt;
&lt;p&gt;Use these tools if your use case leans into video, motion, or asset generation for games and content libraries. They’re best when you’re not looking to build your own editor, but to enhance creative capacity.&lt;/p&gt;
&lt;h3 id=&quot;quick-comparison&quot;&gt;Quick Comparison&lt;/h3&gt;





















































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Model/API&lt;/th&gt;&lt;th&gt;Input&lt;/th&gt;&lt;th&gt;Output&lt;/th&gt;&lt;th&gt;Control&lt;/th&gt;&lt;th&gt;API Access&lt;/th&gt;&lt;th&gt;Best For&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;GPT-4o (OpenAI)&lt;/td&gt;&lt;td&gt;text, image (chat)&lt;/td&gt;&lt;td&gt;image (likely)&lt;/td&gt;&lt;td&gt;medium-high&lt;/td&gt;&lt;td&gt;not yet&lt;/td&gt;&lt;td&gt;assistants, multimodal UIs&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;DALL·E 3&lt;/td&gt;&lt;td&gt;text&lt;/td&gt;&lt;td&gt;image&lt;/td&gt;&lt;td&gt;medium&lt;/td&gt;&lt;td&gt;yes&lt;/td&gt;&lt;td&gt;content tools, illustrations&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Gemini (Google)&lt;/td&gt;&lt;td&gt;text, sketch&lt;/td&gt;&lt;td&gt;image&lt;/td&gt;&lt;td&gt;high&lt;/td&gt;&lt;td&gt;yes&lt;/td&gt;&lt;td&gt;e-commerce, product mockups&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Firefly (Adobe)&lt;/td&gt;&lt;td&gt;text&lt;/td&gt;&lt;td&gt;image, layers&lt;/td&gt;&lt;td&gt;very high&lt;/td&gt;&lt;td&gt;no&lt;/td&gt;&lt;td&gt;professional design tools&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SDXL&lt;/td&gt;&lt;td&gt;text, image&lt;/td&gt;&lt;td&gt;image&lt;/td&gt;&lt;td&gt;high&lt;/td&gt;&lt;td&gt;yes&lt;/td&gt;&lt;td&gt;custom tools, OSS projects&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Midjourney&lt;/td&gt;&lt;td&gt;text&lt;/td&gt;&lt;td&gt;image&lt;/td&gt;&lt;td&gt;very high&lt;/td&gt;&lt;td&gt;no&lt;/td&gt;&lt;td&gt;stylized inspiration&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Hugging Face&lt;/td&gt;&lt;td&gt;text, image&lt;/td&gt;&lt;td&gt;image&lt;/td&gt;&lt;td&gt;medium-high&lt;/td&gt;&lt;td&gt;yes&lt;/td&gt;&lt;td&gt;experimentation, open models&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Runway Gen-2&lt;/td&gt;&lt;td&gt;text&lt;/td&gt;&lt;td&gt;video/image&lt;/td&gt;&lt;td&gt;medium&lt;/td&gt;&lt;td&gt;yes&lt;/td&gt;&lt;td&gt;motion design, AI video&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Leonardo.Ai&lt;/td&gt;&lt;td&gt;text&lt;/td&gt;&lt;td&gt;image&lt;/td&gt;&lt;td&gt;high&lt;/td&gt;&lt;td&gt;limited&lt;/td&gt;&lt;td&gt;game assets, style templates&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;If you’re building for creative users, especially those used to real-time feedback and control, then how you wrap these APIs into your workflow matters more than which model you use. It’s not just about generating images. It’s about how you let users prompt, refine, iterate, and remix inside your canvas.&lt;/p&gt;
&lt;p&gt;That’s the opportunity here. Not just plugging in a model, but designing a loop where generation feels native to creation. The APIs are improving fast. The real challenge, and the real product value, is in how you build around them.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;3,000+ creative professionals gain early access to new features and updates—don’t miss out, and &lt;a href=&quot;https://share.hsforms.com/1IgAOV1wASXGPnFG4ZPLejg1hk3i?ref=img.ly&quot;&gt;subscribe&lt;/a&gt; to our newsletter.&lt;/p&gt;</content:encoded><dc:creator>Jan</dc:creator><media:content url="https://blog.img.ly/2025/04/AI-Comparison.jpg" medium="image"/><category>AI</category><category>Image Gen</category><category>Creative Workflows</category><category>gpt-4o</category></item><item><title>How To: Video Generation With Javascript</title><link>https://img.ly/blog/how-to-video-generation-with-javascript/</link><guid isPermaLink="true">https://img.ly/blog/how-to-video-generation-with-javascript/</guid><description>Learn how to programmatically create videos at scale with Javascript and CreativeEditor SDK.</description><pubDate>Wed, 22 Jan 2025 09:53:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Follow this tutorial to learn how to programmatically create videos in JavaScript directly in the browser.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In 2025 video is firmly established as powerhouse for engagement, gaining even more traction with the rise of short-form videos. After all, as humans, we naturally resonate with video content more than any other type of media.&lt;/p&gt;
&lt;p&gt;The problem is that video generation is challenging—and doing it within the browser through JavaScript makes things even more complex. Fortunately, production-grade solutions like &lt;a href=&quot;https://img.ly/docs/cesdk/js/prebuilt-solutions/video-editor-9e533a/&quot;&gt;CreativeEditor SDK (CE.SDK)&lt;/a&gt; make the process not only possible but also easy to implement.&lt;/p&gt;
&lt;p&gt;In this guide, you will learn how to programmatically generate videos in the browser via JavaScript using CreativeEditor SDK. We will cover various applications, including merging videos, adding audio tracks, and even integrating AI features.&lt;/p&gt;
&lt;p&gt;Let’s dive in!&lt;/p&gt;
&lt;h2 id=&quot;why-programmatic-video-generation-matters&quot;&gt;Why Programmatic Video Generation Matters&lt;/h2&gt;
&lt;p&gt;Videos are dominating social media, marketing, and online platforms such as e-commerce platforms (e.g., to showcase products). Numerous studies have proven that &lt;a href=&quot;https://thesocialshepherd.com/blog/video-marketing-statistics&quot;&gt;video is the most effective form of media&lt;/a&gt; for marketing, as it resonates deeply with us.&lt;/p&gt;
&lt;p&gt;As the demand for personalized and dynamic content increases, traditional video production methods are becoming inefficient. The proliferation of channels with different demands on size and video quality as well as the need to create personalized videos at scale means that automated video creation is becoming indispensable. Most existing solutions run batch processing of videos on the server after gathering input data from various source. However, while server-side processing quickly becomes costly and introduces significant communication overhead client devices have become more powerful than ever.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://img.ly/products/creative-sdk&quot;&gt;CreativeEditor SDK&lt;/a&gt; bridges that gap by simplifying programmatic video generation in JavaScript within modern browsers. With CE.SDK, you can automate repetitive tasks and define scalable, personalized, and engaging video creation workflows, ensuring each generated video resonates with its target audience.&lt;/p&gt;
&lt;h2 id=&quot;get-started-with-cesdk-for-javascript&quot;&gt;Get Started with CE.SDK for JavaScript&lt;/h2&gt;
&lt;p&gt;Now that we established why programmatic video generation is important, you are ready to get started with the tool designed for it: CreativeEditor SDK.&lt;/p&gt;
&lt;p&gt;Learn how to integrate CE.SDK for video editing into a vanilla JavaScript application!&lt;/p&gt;
&lt;p&gt;You can access the code for this tutorial on &lt;a href=&quot;https://github.com/imgly/video-generation-js&quot;&gt;Github&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;requirements&quot;&gt;Requirements&lt;/h3&gt;
&lt;p&gt;The only prerequisites to follow this tutorial are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A modern browser&lt;/strong&gt;: CreativeEditor SDK runs directly in your browser’s JavaScript engine, so no additional setup is required. Any &lt;a href=&quot;https://caniuse.com/wasm&quot;&gt;browser supporting WASM&lt;/a&gt; is enough.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A CreativeEditor SDK license&lt;/strong&gt;: If you do not have one yet, &lt;a href=&quot;https://img.ly/forms/free-trial&quot;&gt;sign up for a free trial&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If your web application uses Node.js, ensure you have the &lt;a href=&quot;https://nodejs.org/en/download&quot;&gt;latest stable versions of both Node.js and NPM installed&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;import-the-library&quot;&gt;Import the library&lt;/h3&gt;
&lt;p&gt;In a vanilla JavaScript application, create a JavaScript module file (e.g., video-editor.js) and import the CreativeEditor SDK engine library inside it:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;jsx&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; CreativeEngine &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;&amp;#x3C;https://cdn.img.ly/packages/imgly/cesdk-engine/1.42.0/index.js&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: In this example, the SDK is served from our CDN for convenience. In a production environment, it is recommended to host all &lt;a href=&quot;https://img.ly/docs/cesdk/js/serve-assets-b0827c/&quot;&gt;assets and libraries on your own servers&lt;/a&gt; for improved control and performance.&lt;/p&gt;
&lt;p&gt;To use the video-editor.js module in an HTML page, import it with this line:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;module&quot;&lt;/span&gt;&lt;span&gt; src&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;video-editor.js&quot;&lt;/span&gt;&lt;span&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Note the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules&quot;&gt;type=“module”&lt;/a&gt; attribute tells the browser to treat the script as an ES6 module, so that you can use import and export statements.&lt;/p&gt;
&lt;p&gt;Alternatively, if you are using a module bundler like Webpack, Rollup, Parcel, or Vite, add the &lt;a href=&quot;https://www.npmjs.com/package/@cesdk/engine&quot;&gt;@cesdk/engine&lt;/a&gt; npm package to your project’s dependencies:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; @cesdk/cesdk-js&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In this case, you can then import the headless SDK into your JavaScript code as follows:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;jsx&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; CreativeEngine &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;@cesdk/engine&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Well done!&lt;/p&gt;
&lt;h2 id=&quot;setting-up-your-environment&quot;&gt;&lt;strong&gt;Setting Up Your Environment&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;In your JavaScript module, right below the library import, initialize the &lt;a href=&quot;https://img.ly/docs/cesdk/node/get-started/overview-e18f40/&quot;&gt;CreativeEditor SDK headless engine&lt;/a&gt; using the following code:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;jsx&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// src/video-editor.js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; CreativeEngine &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;&amp;#x3C;https://cdn.img.ly/packages/imgly/cesdk-engine/1.42.0/index.js&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// your CE.SDK license and user configs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; config&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  license: &lt;/span&gt;&lt;span&gt;&apos;&amp;#x3C;YOUR_LICENSE&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;CreativeEngine.&lt;/span&gt;&lt;span&gt;init&lt;/span&gt;&lt;span&gt;(config).&lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;engine&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  // attach the engine canvas to the DOM&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  document.&lt;/span&gt;&lt;span&gt;getElementById&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;cesdk_container&apos;&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;append&lt;/span&gt;&lt;span&gt;(engine.element);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  // do something with your instance of CreativeEditor SDK...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  // detach the engine and clean up its resource&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  engine.element.&lt;/span&gt;&lt;span&gt;remove&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  engine.&lt;/span&gt;&lt;span&gt;dispose&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Replace &lt;code&gt;&amp;#x3C;YOUR_LICENSE&gt;&lt;/code&gt; with the license key provided in your CreativeEditor SDK subscription.&lt;/p&gt;
&lt;p&gt;Ensure that the HTML page importing &lt;code&gt;video-editor.js&lt;/code&gt; contains the following &lt;code&gt;&amp;#x3C;div&gt;&lt;/code&gt; element with the &lt;code&gt;cesdk_container&lt;/code&gt; ID:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt; id&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;cesdk_container&quot;&lt;/span&gt;&lt;span&gt; style&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;width: 100%; height: 100vh;&quot;&lt;/span&gt;&lt;span&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;a href=&quot;https://img.ly/docs/cesdk/js/get-started/overview-e18f40/&quot;&gt;&lt;code&gt;CreativeEngine.init()&lt;/code&gt;&lt;/a&gt; method will mount the editor engine component within this div.&lt;/p&gt;
&lt;p&gt;Congratulations! You have successfully integrated the video editing engine.&lt;/p&gt;
&lt;h2 id=&quot;load-a-video&quot;&gt;&lt;strong&gt;Load a Video&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Use the logic below inside the body of the CreativeEndine.init() callback function to load a video in CE.SDK:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;jsx&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// initialize a new video scene&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; scene&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; engine.scene.&lt;/span&gt;&lt;span&gt;createVideo&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// create a page block and attach it to the scene&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; page&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; engine.block.&lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;page&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.&lt;/span&gt;&lt;span&gt;appendChild&lt;/span&gt;&lt;span&gt;(scene, page);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// set the dimensions of the video page&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.&lt;/span&gt;&lt;span&gt;setWidth&lt;/span&gt;&lt;span&gt;(page, &lt;/span&gt;&lt;span&gt;720&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.&lt;/span&gt;&lt;span&gt;setHeight&lt;/span&gt;&lt;span&gt;(page, &lt;/span&gt;&lt;span&gt;1280&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// create a graphic block to hold the video content&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// and set its shape to a rectangle&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; video&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; engine.block.&lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;graphic&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.&lt;/span&gt;&lt;span&gt;setShape&lt;/span&gt;&lt;span&gt;(video, engine.block.&lt;/span&gt;&lt;span&gt;createShape&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;rect&apos;&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// create a fill type for the video and set the video file URI&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; videoFill&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; engine.block.&lt;/span&gt;&lt;span&gt;createFill&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;video&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.&lt;/span&gt;&lt;span&gt;setString&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  videoFill,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &apos;fill/video/fileURI&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &apos;&amp;#x3C;https://cdn.img.ly/assets/demo/v2/ly.img.video/videos/pexels-drone-footage-of-a-surfer-barrelling-a-wave-12715991.mp4&gt;&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// apply the video fill to the video graphic&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.&lt;/span&gt;&lt;span&gt;setFill&lt;/span&gt;&lt;span&gt;(video, videoFill);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// create a track block to manage the video timeline&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// and attache the track to the page and the video graphic&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// to the track&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; track&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; engine.block.&lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;track&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.&lt;/span&gt;&lt;span&gt;appendChild&lt;/span&gt;&lt;span&gt;(page, track);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.&lt;/span&gt;&lt;span&gt;appendChild&lt;/span&gt;&lt;span&gt;(track, video);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// make the track cover the parent block&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.&lt;/span&gt;&lt;span&gt;fillParent&lt;/span&gt;&lt;span&gt;(track);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This initializes a video scene using &lt;a href=&quot;https://img.ly/docs/cesdk/js/concepts/scenes-e8596d/&quot;&gt;&lt;code&gt;createVideo()&lt;/code&gt;&lt;/a&gt; and creates a &lt;code&gt;&quot;graphic&quot;&lt;/code&gt; block to display the video in a rectangle, adding it to the page. Next, it loads a video from a remote resource and appends it as a track to the parent block.&lt;/p&gt;
&lt;p&gt;For a complete explanation of how the above code works, &lt;a href=&quot;https://img.ly/docs/cesdk/js/create-video-c41a08/&quot;&gt;refer to the documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you comment out the cleanup part, this is what you should see in your browser application:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 608px) 608px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;608&quot; height=&quot;697&quot; src=&quot;https://img.ly/_astro/JS-video-generation-video-fill_Z1LSqkq.webp&quot; srcset=&quot;/_astro/JS-video-generation-video-fill_Z1LSqkq.webp 608w&quot;&gt;&lt;/p&gt;
&lt;p&gt;Notice how the video from the remote URI has been loaded into the &lt;/p&gt;&lt;div&gt; element where CreativeEditor SDK is attached to the page’s DOM.Time to explore more programmatic video generation features!&lt;p&gt;&lt;/p&gt;
&lt;h2 id=&quot;programmatic-video-generation-features&quot;&gt;Programmatic Video Generation Features&lt;/h2&gt;
&lt;p&gt;Follow the use cases below to see how CE.SDK makes automated video generation in JavaScript easier.&lt;strong&gt;Generate Video in Different Formats&lt;/strong&gt; CE.SDK supports video export in &lt;a href=&quot;https://img.ly/docs/cesdk/js/file-format-support-3c4b2a/&quot;&gt;MP4 format&lt;/a&gt; &lt;a href=&quot;https://img.ly/docs/cesdk/faq/video-support/?platform=node&quot;&gt;&lt;/a&gt;(with MP3 audio) with different resolutions and aspect ratios.To export a video with a specific aspect ratio, first adjust the width and height of the parent block to which the video block is attached:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// specify an aspect ratio of 9:16 (ideal for vertical videos)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.&lt;/span&gt;&lt;span&gt;setWidth&lt;/span&gt;&lt;span&gt;(page, &lt;/span&gt;&lt;span&gt;720&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.&lt;/span&gt;&lt;span&gt;setHeight&lt;/span&gt;&lt;span&gt;(page, &lt;/span&gt;&lt;span&gt;1280&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In this case, the video will be automatically adjusted to fit the specified dimensions. Horizontal videos will be cropped to match the defined vertical outline of the block, while vertical videos will be rendered as they are within the specified block.&lt;/p&gt;
&lt;p&gt;Next, you can export the video with the configured 9:16 aspect ratio and a given resolution with:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// define the MIME type for the video export (MP4 format)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; mimeType&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;video/mp4&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// define a callback function to track the progress of video rendering and encoding&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; progressCallback&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;renderedFrames&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;encodedFrames&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;totalFrames&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  console.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &apos;Rendered&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;// log the number of rendered frames&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    renderedFrames,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &apos;frames and encoded&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;// log the number of encoded frames&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    encodedFrames,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &apos;frames out of&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;// log the total frames to be processed&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    totalFrames&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// define the video export options&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; videoOptions&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  duration: &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;// video duration in seconds&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  framerate: &lt;/span&gt;&lt;span&gt;30&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;// video framerate (frames per second)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  targetWidth: &lt;/span&gt;&lt;span&gt;480&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;// target video width in pixels (for the resolution)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  targetHeight: &lt;/span&gt;&lt;span&gt;852&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;// target video height in pixels (for the resolution)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// export the page as an MP4 video&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; blob&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; await&lt;/span&gt;&lt;span&gt; engine.block.&lt;/span&gt;&lt;span&gt;exportVideo&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  page, &lt;/span&gt;&lt;span&gt;// the page containing the design video block&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  mimeType, &lt;/span&gt;&lt;span&gt;// the MIME type for the video (MP4)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  progressCallback, &lt;/span&gt;&lt;span&gt;// the callback to track video rendering progress&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  videoOptions &lt;/span&gt;&lt;span&gt;// the options for the video export&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// create an anchor element to trigger the video download&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; anchor&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; document.&lt;/span&gt;&lt;span&gt;createElement&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;a&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;anchor.href &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; URL&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;createObjectURL&lt;/span&gt;&lt;span&gt;(blob);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;anchor.download &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;video.mp4&apos;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;// output video name&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;anchor.&lt;/span&gt;&lt;span&gt;click&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;a href=&quot;https://img.ly/docs/cesdk/js/export-save-publish/export/overview-9ed3a8/&quot;&gt;&lt;code&gt;exportVideo()&lt;/code&gt;&lt;/a&gt; function produces a &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Blob&quot;&gt;&lt;code&gt;blob video file&lt;/code&gt;&lt;/a&gt; of the specified MIME type. Note that the export occurs over multiple iterations of the update loop, with a frame being encoded in each iteration. &lt;/p&gt;
&lt;p&gt;The &lt;code&gt;targetWidth&lt;/code&gt; and &lt;code&gt;targetHeight&lt;/code&gt; options are optional. If used, the video will be resized to fit the target dimensions while maintaining its aspect ratio. This is useful for setting a specific resolution for the output video while preserving the parent block’s width and height on the output video. If omitted, the produced video will match the resolution of the width and height specified with &lt;code&gt;setWidth()&lt;/code&gt; and &lt;code&gt;setHeight()&lt;/code&gt;, respectively.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;progressCallback()&lt;/code&gt; function will track and display the video generation progress in the browser’s console:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1066px) 1066px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1066&quot; height=&quot;295&quot; src=&quot;https://img.ly/_astro/video-generation-output_2ubce0.webp&quot; srcset=&quot;/_astro/video-generation-output_Z1tfnLU.webp 640w, /_astro/video-generation-output_Z1WemnE.webp 750w, /_astro/video-generation-output_Z2n2XVo.webp 828w, /_astro/video-generation-output_2ubce0.webp 1066w&quot;&gt;&lt;/p&gt;
&lt;p&gt;The final lines of the above code snippet trigger the download operation, mimicking the action of clicking a link to download a resource. This is a common JavaScript technique to programmatically trigger a file download.&lt;/p&gt;
&lt;p&gt;Once the export process completes, the output video file (video.mp4) will be automatically downloaded to the browser’s download directory.  Open its properties and this is what you will see:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 404px) 404px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;404&quot; height=&quot;512&quot; src=&quot;https://img.ly/_astro/js-video-generation-file_HN2N0.webp&quot; srcset=&quot;/_astro/js-video-generation-file_HN2N0.webp 404w&quot;&gt;&lt;/p&gt;
&lt;p&gt;Note the video file’s resolution and the fact that its duration is set to 5 seconds, as defined by the &lt;code&gt;duration&lt;/code&gt; attribute.&lt;/p&gt;
&lt;p&gt;These options enable you to easily create clips with different lengths, aspect ratios, and resolutions, optimized for various audiences and &lt;a href=&quot;https://img.ly/industries/social-media&quot;&gt;social media platforms like LinkedIn, Instagram, Facebook, X, TikTok, YouTube, and more&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;add-audio-tracks&quot;&gt;Add Audio Tracks&lt;/h3&gt;
&lt;p&gt;Adding an audio track for narration or background music to your clip is straightforward. First, create an &lt;a href=&quot;https://img.ly/docs/cesdk/js/create-video-c41a08/&quot;&gt;“audio” block&lt;/a&gt; and add your audio resource to it:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; audio&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; engine.block.&lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;audio&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.&lt;/span&gt;&lt;span&gt;appendChild&lt;/span&gt;&lt;span&gt;(page, audio);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.&lt;/span&gt;&lt;span&gt;setString&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  audio,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &apos;audio/fileURI&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &apos;https://cdn.img.ly/assets/demo/v1/ly.img.audio/audios/far_from_home.m4a&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next, you can easily adjust the volume, and apply fade-in and fade-out effects as follows:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// set the volume level to 80%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.&lt;/span&gt;&lt;span&gt;setVolume&lt;/span&gt;&lt;span&gt;(audio, &lt;/span&gt;&lt;span&gt;0.8&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// start the audio after 1 second of playback&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.&lt;/span&gt;&lt;span&gt;setTimeOffset&lt;/span&gt;&lt;span&gt;(audio, &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// set the audio block&apos;s duration to 5 seconds&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.&lt;/span&gt;&lt;span&gt;setDuration&lt;/span&gt;&lt;span&gt;(audio, &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here is breakdown of the functions used above:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://img.ly/docs/cesdk/js/create-video/control-daba54/&quot;&gt;&lt;strong&gt;&lt;code&gt;setVolume()&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt;: Adjusts the audio volume of the block, with a range from 0 (0%) to 1 (100%).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;setTimeOffset()&lt;/code&gt;&lt;/strong&gt;: Sets the time offset of the block relative to its parent. This determines when the block starts playing in the timeline.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;setDuration()&lt;/code&gt;&lt;/strong&gt;: Sets the playback duration of the audio block in seconds, defining how long the block will play during the scene.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this example, the audio starts at the 1-second mark and plays for 5 seconds (from 1s to 6s), with the volume set to 80% of the original.&lt;/p&gt;
&lt;h3 id=&quot;merge-videos&quot;&gt;&lt;strong&gt;Merge Videos&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;To stitch multiple video clips together in CE.SDK, you first need to import and create separate video blocks:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// create the first video block&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; video1&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; engine.block.&lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;graphic&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.&lt;/span&gt;&lt;span&gt;setShape&lt;/span&gt;&lt;span&gt;(video1, engine.block.&lt;/span&gt;&lt;span&gt;createShape&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;rect&apos;&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; videoFill1&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; engine.block.&lt;/span&gt;&lt;span&gt;createFill&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;video&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.&lt;/span&gt;&lt;span&gt;setString&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  videoFill1,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &apos;fill/video/fileURI&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &apos;https://cdn.img.ly/assets/demo/v2/ly.img.video/videos/pexels-drone-footage-of-a-surfer-barrelling-a-wave-12715991.mp4&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.&lt;/span&gt;&lt;span&gt;setFill&lt;/span&gt;&lt;span&gt;(video1, videoFill1);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// create the second video block&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; video2&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; engine.block.&lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;graphic&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.&lt;/span&gt;&lt;span&gt;setShape&lt;/span&gt;&lt;span&gt;(video2, engine.block.&lt;/span&gt;&lt;span&gt;createShape&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;rect&apos;&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; videoFill2&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; engine.block.&lt;/span&gt;&lt;span&gt;createFill&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;video&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.&lt;/span&gt;&lt;span&gt;setString&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  videoFill2,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &apos;fill/video/fileURI&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &apos;https://cdn.img.ly/assets/demo/v2/ly.img.video/videos/pexels-kampus-production-8154913.mp4&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.&lt;/span&gt;&lt;span&gt;setFill&lt;/span&gt;&lt;span&gt;(video2, videoFill2);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;At this point, you have two different video clips loaded from separate video files.&lt;/p&gt;
&lt;p&gt;Now, assume you want to produce a 10-second video that includes both clips. Start by setting the duration of the page block to 10 seconds with the &lt;a href=&quot;https://img.ly/docs/cesdk/js/create-video/control-daba54/&quot;&gt;&lt;code&gt;setDuration()&lt;/code&gt;&lt;/a&gt; method:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.&lt;/span&gt;&lt;span&gt;setDuration&lt;/span&gt;&lt;span&gt;(page, &lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then, suppose you want the first clip (video1) to play for 7 seconds, and the second clip (video2) to fade in after that and play for 3 seconds (from second 1 to second 4 of the original second clip). This is how you can set that up:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// set the duration of the first and second video clips&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.setDuration(video1, 7); // video1 plays for 7 seconds&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.setDuration(video2, 3); // video2 plays for 3 seconds&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// wait for the second video to be fully loaded before applying the trim options&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;await engine.block.forceLoadAVResource(videoFill2);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// trim the second video to start at 1 second and play up to second 4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.setTrimOffset(videoFill2, 1);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.setTrimLength(videoFill2, 4);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// add a fade-in animation to the second video&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;const fadeInAnimation = engine.block.createAnimation(&quot;fade&quot;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.setInAnimation(video2, fadeInAnimation);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;These are the methods used above:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;setDuration()&lt;/code&gt;&lt;/strong&gt;: Defines the duration (in seconds) that a video block will be active during playback.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;**forceLoadAVResource()**&lt;/code&gt;: Ensures that the audio or video resource (in this case, &lt;code&gt;video2&lt;/code&gt;) is fully loaded before applying trim operations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;setTrimOffset()&lt;/code&gt;&lt;/strong&gt;: Sets the start point (in seconds) within the video where playback begins.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;setTrimLength()&lt;/code&gt;&lt;/strong&gt;: Defines the length of the video to be played from the trim offset.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://img.ly/docs/cesdk/js/animation/overview-6a2ef2/&quot;&gt;&lt;strong&gt;&lt;code&gt;createAnimation()&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt;: Creates a fade-in animation for the second video (&lt;code&gt;video2&lt;/code&gt;) to smoothly transition into the clip.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Finally, add both video blocks to the track block for playback:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;const track = engine.block.create(&quot;track&quot;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.appendChild(page, track);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.appendChild(track, video1); // add the first video to the track&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.appendChild(track, video2); // add the second video to the track&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.fillParent(track);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The result will be:&lt;/p&gt;
&lt;figure class=&quot;kg-card kg-embed-card&quot;&gt;&lt;iframe width=&quot;225&quot; height=&quot;400&quot; src=&quot;https://blog.img.ly/2025/01/video-1.mp4&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/figure&gt;
&lt;p&gt;Note how the second clip fades in after 7 seconds of the first clip, lasting for 3 seconds as specified.&lt;/p&gt;
&lt;h3 id=&quot;incorporate-text-variables&quot;&gt;&lt;a href=&quot;https://img.ly/blog/how-to-video-generation-with-javascript//#Incorporate-Text-Variables&quot;&gt;&lt;/a&gt;Incorporate Text Variables&lt;/h3&gt;
&lt;p&gt;Now, suppose you want to display cool words or messages in your videos. You can easily achieve this by adding a &lt;a href=&quot;https://img.ly/docs/cesdk/js/text/edit-c5106b/&quot;&gt;&lt;code&gt;&quot;text&quot;&lt;/code&gt; block&lt;/a&gt; to your page, as shown below:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;const text = engine.block.create(&quot;text&quot;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// set the vluae of the text variable&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.replaceText(text, &quot;Surfing\nis\nCOOL!&quot;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// set the text color to white and semi-transparent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.setTextColor(text, { r: 255.0, g: 255.0, b: 255.0, a: 0.8 });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// set the font size for the text&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.setTextFontSize(text, 30);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// positioning the text on an absolute position on the video&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.setWidthMode(text, &quot;Auto&quot;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.setHeightMode(text, &quot;Auto&quot;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.setPositionX(text, 130);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.setPositionY(text, 800);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// append the text block to the page&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.appendChild(page, text);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The video canvas will now display a white “Surfing is COOL!” message as follows:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 514px) 514px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;514&quot; height=&quot;812&quot; src=&quot;https://img.ly/_astro/js-video-generation-surfing_ro7yG.webp&quot; srcset=&quot;/_astro/js-video-generation-surfing_ro7yG.webp 514w&quot;&gt;&lt;/p&gt;
&lt;p&gt;In this example, the content of the text block is static. However, it can easily be retrieved from a database or any other source for programmatic video generation with different messages, including personalized ones for tailored outreach (e.g., for custom greetings or offers).&lt;/p&gt;
&lt;h2 id=&quot;advanced-use-case-prompt-based-video-generation-using-ai&quot;&gt;&lt;a href=&quot;https://img.ly/blog/how-to-video-generation-with-javascript//#Advanced-Use-Case-Prompt-Based-Video-Generation-Using-AI&quot;&gt;&lt;/a&gt;Advanced Use Case: Prompt-Based Video Generation Using AI&lt;/h2&gt;
&lt;p&gt;As highlighted in our &lt;a href=&quot;https://www.linkedin.com/posts/eray-basar-57684711_imagine-building-a-full-video-app-in-a-single-activity-7262806525797089280-S_L8?utm_source=share&amp;#x26;utm_medium=member_desktop&quot;&gt;recent LinkedIn post&lt;/a&gt;, &lt;a href=&quot;https://IMG.LY&quot;&gt;IMG.LY&lt;/a&gt; has just experimented with an MVP that turns keywords into fully edited short videos, complete with a script, voiceover, and visuals—all automated.&lt;/p&gt;
&lt;p&gt;That is made possible by integrating CE.SDK with an LLM for coding and scriptwriting, &lt;a href=&quot;https://elevenlabs.io/&quot;&gt;ElevenLabs&lt;/a&gt; for voice synthesis, and Flux (via &lt;a href=&quot;https://fal.ai/&quot;&gt;fal.ai&lt;/a&gt;) for visuals. Specifically, the LLM uses CE.SDK for video composition, animation, and rendering.&lt;/p&gt;
&lt;p&gt;This is just the beginning, showing how AI can be combined with CE.SDK to programmatically generate video scripts—or even templates. A possible scenario would be to use the &lt;a href=&quot;https://img.ly/docs/cesdk/js/user-interface/ui-extensions-d194d1/&quot;&gt;Creative Editor SDK plugin API&lt;/a&gt; to extend CE.SDK with custom plugins that adds AI directly to the design editor engine.&lt;/p&gt;
&lt;p&gt;For example, you could develop a plugin with an LLM integration that allows users to input a prompt like: &lt;em&gt;“Create a 15-second video with the text ‘Welcome to our App!’ and upbeat background music.”&lt;/em&gt; The LLM will process the request, using Creative Editor SDK to automate video creation by leveraging its powerful features.&lt;/p&gt;
&lt;p&gt;Alternatively, the AI could produce a video that you can then automatically edit and enhance using CE.SDK capabilities. One thing is certain: the possibilities are endless with CE.SDK + AI!&lt;/p&gt;
&lt;h2 id=&quot;conclusion-the-future-of-programmatic-video-generation&quot;&gt;&lt;a href=&quot;https://img.ly/blog/how-to-video-generation-with-javascript//#Conclusion-The-Future-of-Programmatic-Video-Generation&quot;&gt;&lt;/a&gt;Conclusion: The Future of Programmatic Video Generation&lt;/h2&gt;
&lt;p&gt;CE.SDK for JavaScript offers exceptional versatility in automating video workflows, allowing you to easily generate, edit, and render videos with just a few lines of code. You can stitch multiple video files, add background audio tracks, and incorporate dynamic text variables to finally produce videos in the browser—all thanks to the CE.SDK headless engine.&lt;/p&gt;
&lt;p&gt;Looking ahead, AI integration with CE.SDK is unlocking even more powerful possibilities, such as prompt-based video content creation and automatic editing directly in the browser.&lt;/p&gt;
&lt;p&gt;With the headless engine provided by CreativeEditor SDK, programmatic video generation in JavaScript can be implemented in just a few minutes. Explore the video capabilities of CE.SDK and &lt;a href=&quot;https://img.ly/docs/cesdk/js/get-started/overview-e18f40/&quot;&gt;dive into the docs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Stay tuned for more updates, and please &lt;a href=&quot;https://img.ly/forms/contact-sales?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=plugins1&quot;&gt;reach out&lt;/a&gt; if you have any questions. Thank you for reading.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Over 3,000 creative professionals gain early access to our new features, demos, and updates—don’t miss out, and&lt;/strong&gt; &lt;a href=&quot;https://share.hsforms.com/1IgAOV1wASXGPnFG4ZPLejg1hk3i?ref=img.ly&quot;&gt;&lt;strong&gt;subscribe&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;to our newsletter.&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;</content:encoded><dc:creator>Antonello</dc:creator><dc:creator>Jan</dc:creator><media:content url="https://blog.img.ly/2025/01/javascript-generate-video.jpg" medium="image"/><category>Video Editing</category><category>Creative Automation</category><category>CE.SDK</category></item><item><title>A Modern Video Editor SDK for Your React Native App</title><link>https://img.ly/blog/a-modern-video-editor-sdk-for-your-react-native-app/</link><guid isPermaLink="true">https://img.ly/blog/a-modern-video-editor-sdk-for-your-react-native-app/</guid><description>Learn how to integrate IMG.LY&apos;s video editor for React Native into your app and how to best leverage its capabilities.</description><pubDate>Mon, 06 Jan 2025 10:40:35 GMT</pubDate><content:encoded>&lt;p&gt;Learn how to integrate &lt;a href=&quot;https://img.ly/docs/cesdk/react-native/prebuilt-solutions/video-editor-9e533a/&quot;&gt;IMG.LY’s video editor for React Native&lt;/a&gt; into your app and how to leverage its capabilities best.&lt;/p&gt;
&lt;h2 id=&quot;why-add-a-video-editor-to-your-react-native-app&quot;&gt;Why Add a Video Editor to Your React Native App?&lt;/h2&gt;
&lt;p&gt;Video content is solidifying its status as the most engaging form of digital media. Platforms like TikTok, Instagram Reels, and YouTube Shorts have made video consumption and creation an engrained habit with billions of users. You can harness this trend by adding a video editor to your app significantly enhancing user engagement and retention.&lt;/p&gt;
&lt;p&gt;React Native, with its ability to create cross-platform applications from a single codebase, is a perfect match for IMG.LY’s &lt;strong&gt;CreativeEditor SDK Video Editor&lt;/strong&gt;. It ensures seamless performance on iOS and Android, powered by the same unified graphics engine across platforms.&lt;/p&gt;
&lt;p&gt;Whether your app focuses on social media, marketing, or eCommerce, integrating a video editor empowers users with a creative tool set while elevating the overall experience.&lt;/p&gt;
&lt;h2 id=&quot;getting-started-integrating-the-video-editor-in-react-native&quot;&gt;Getting Started: Integrating the Video Editor in React Native&lt;/h2&gt;
&lt;h3 id=&quot;requirements&quot;&gt;Requirements&lt;/h3&gt;
&lt;p&gt;Before diving into the integration, ensure your environment meets these requirements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;React Native&lt;/strong&gt;: 0.73+&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;iOS&lt;/strong&gt;: 16+&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Swift&lt;/strong&gt;: 5.10 (Xcode 15.4)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Android&lt;/strong&gt;: 7+&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To get started, add the &lt;strong&gt;@imgly/editor-react-native&lt;/strong&gt; package to your project:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; @imgly/editor-react-native&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;setting-up-the-editor&quot;&gt;Setting Up the Editor&lt;/h3&gt;
&lt;p&gt;Once the package is installed, initialize the editor by importing the necessary modules and creating an instance of &lt;code&gt;EditorSettingsModel&lt;/code&gt;. You’ll need a license key, which you can obtain from the IMG.LY dashboard.&lt;/p&gt;
&lt;p&gt;Here’s how to set up and launch the video editor:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;tsx&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; IMGLYEditor, { EditorSettingsModel } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;@imgly/editor-react-native&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; const&lt;/span&gt;&lt;span&gt; openVideoEditor&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; async&lt;/span&gt;&lt;span&gt; ()&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Promise&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt;&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  const&lt;/span&gt;&lt;span&gt; settings&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; EditorSettingsModel&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    license: &lt;/span&gt;&lt;span&gt;&apos;YOUR_LICENSE_KEY&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  const&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; await&lt;/span&gt;&lt;span&gt; IMGLYEditor.&lt;/span&gt;&lt;span&gt;openEditor&lt;/span&gt;&lt;span&gt;(settings);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This launches the editor with the &lt;strong&gt;Video Editor&lt;/strong&gt; preset, enabling users to trim, cut, and enhance their videos with filters, text overlays, stickers, and music.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1080px) 1080px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1080&quot; height=&quot;1080&quot; src=&quot;https://img.ly/_astro/Video-UI_Z17RDlV.webp&quot; srcset=&quot;/_astro/Video-UI_Z1hzsFw.webp 640w, /_astro/Video-UI_ZUG5b8.webp 750w, /_astro/Video-UI_Oc4wg.webp 828w, /_astro/Video-UI_Z17RDlV.webp 1080w&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;use-cases-building-a-tiktok-like-experience&quot;&gt;Use Cases: Building a TikTok-Like Experience&lt;/h2&gt;
&lt;p&gt;Now that the video editor is integrated into your React Native app, let’s explore some key use cases and how to configure the editor to support them.&lt;/p&gt;
&lt;h3 id=&quot;short-form-video-creation&quot;&gt;Short-Form Video Creation&lt;/h3&gt;
&lt;p&gt;For apps targeting TikTok-style short-form video content, prioritize features that simplify the editing process:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Timeline Control&lt;/strong&gt;: Allow users to trim clips and sync overlays like stickers or music.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Filters &amp;#x26; Effects&lt;/strong&gt;: Offer filters to let users add certain moods to their videos with themes like retro, high contrast, or pastel tones.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Text &amp;#x26; Stickers&lt;/strong&gt;: Add captions and playful stickers for videos that are often consumed on mute.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Music &amp;#x26; Audio&lt;/strong&gt;: Let users add soundtracks or sound effects, with a library of trending music for inspirational background music.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Video Templates&lt;/strong&gt;: Provide ready-made templates that users can customize for specific occasions or themes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This setup allows influencers and brands to create professional-looking videos that they can share across social media platforms with ease.&lt;/p&gt;
&lt;h3 id=&quot;influencers-and-marketing&quot;&gt;Influencers and Marketing&lt;/h3&gt;
&lt;p&gt;If your app serves influencers or businesses, the ability to create polished, on-brand videos is key. Features to consider:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Branded Templates&lt;/strong&gt;: Pre-designed templates aligned with specific brand aesthetics, simplifying content creation for marketing campaigns.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Watermarks&lt;/strong&gt;: Add brand logos or watermarks to videos, ensuring creators and brands maintain visibility.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These features empower influencers and businesses to quickly generate content that’s ready for distribution across platforms.&lt;/p&gt;
&lt;h3 id=&quot;e-commerce-and-user-generated-content&quot;&gt;E-commerce and User-Generated Content&lt;/h3&gt;
&lt;p&gt;Video editing is a powerful tool for e-commerce apps, enabling sellers and customers to create engaging product demos, unboxing videos, reviews and tutorials. Features like trimming, filters, and music tools make it easy to produce compelling content that enhances the shopping experience.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vendors can create promotional videos for products.&lt;/li&gt;
&lt;li&gt;Customers can share authentic reviews or tutorials, increasing trust and boosting sales.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;customization-options-with-creativeeditor-sdk&quot;&gt;Customization Options with CreativeEditor SDK&lt;/h2&gt;
&lt;p&gt;The React Native plugin offers a range of customization options to adapt the editor to your app’s needs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;UI Customization&lt;/strong&gt;: Change themes, colors, and layouts to match your app’s branding.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Video Presets&lt;/strong&gt;: Configure presets for specific use cases, such as limiting video length or optimizing for a particular resolution.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom Assets&lt;/strong&gt;: Add unique filters, stickers, and fonts to create a personalized experience for your audience.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Templates&lt;/strong&gt;: Use the CreativeEditor SDK Web UI to create custom templates, enabling users to start with professional-grade designs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Integrating a video editor into your React Native appwill improve your UX, and help boost engagement, retention, and potential distribution of your product, whether you’re building a social media platform, an influencer tool, or an e-commerce app.&lt;br&gt;
With CreativeEditor SDK, you can create a TikTok-like video editing experience or offer specialized tools for businesses and creators.&lt;/p&gt;
&lt;p&gt;By following the steps in this guide, you can empower your users to create professional-quality video content directly within your app. Explore the full capabilities of the SDK by visiting the &lt;a href=&quot;https://img.ly/docs/cesdk/react-native/prebuilt-solutions/video-editor-9e533a/&quot;&gt;React Native documentation&lt;/a&gt; and getting started today.&lt;/p&gt;
&lt;p&gt;Stay tuned for updates, and don’t hesitate to &lt;a href=&quot;https://img.ly/forms/contact-sales?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=reactnative&quot;&gt;reach out&lt;/a&gt; with any questions.&lt;/p&gt;
&lt;p&gt;Thanks for reading!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3,000+ creative professionals gain early access to new features and updates—don’t miss out, and&lt;/strong&gt; &lt;a href=&quot;https://share.hsforms.com/1IgAOV1wASXGPnFG4ZPLejg1hk3i?ref=img.ly&quot;&gt;&lt;strong&gt;subscribe&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;to our newsletter.&lt;/strong&gt;&lt;/p&gt;</content:encoded><dc:creator>Jan</dc:creator><media:content url="https://blog.img.ly/2024/12/how-to-react-native-video-editor-sdk.jpg" medium="image"/><category>React Native</category><category>How-To</category><category>Video Editor</category><category>Expo</category></item><item><title>Javascript Video Editing: Ultimate Guide for Developers and PMs</title><link>https://img.ly/blog/javascript-video-editing-guide/</link><guid isPermaLink="true">https://img.ly/blog/javascript-video-editing-guide/</guid><description>A comprehensive guide to JavaScript video editing for developers and PMs. Learn about essential features, modern web technologies, and common tools like FFmpeg.js and IMG.LY&apos;s CE.SDK to create powerful web-based video editors.</description><pubDate>Fri, 20 Dec 2024 14:06:55 GMT</pubDate><content:encoded>&lt;p&gt;When developing or integrating a JavaScript-based video editor for the web, you must consider a number of factors to ensure the solution is both efficient and robust. This post is the definitive guide for anyone embarking on such a project. It explores the key technologies involved, their strengths and weaknesses, and how different use cases influence the choice of tech stack. We’ll examine diverse use cases, from lightweight, browser-based editors for quick edits to more advanced tools requiring complex processing and rendering. We’ll then discuss how these scenarios drive the selection of features and technology.&lt;/p&gt;
&lt;p&gt;Additionally, we will show you the best open-source solutions that can accelerate development. This technical analysis will help you make an informed “build vs. buy” decision, ensuring you select the right approach for your project. Throughout this post, we will use the example of the IMG.LY’s JavaScript video editor (see &lt;a href=&quot;https://img.ly/showcases/cesdk/video-ui/web&quot;&gt;here for a demo&lt;/a&gt;), showing you how these considerations shaped its architecture and feature set. You will learn practical insights into the decision-making process behind a successful web-based video editor.&lt;/p&gt;
&lt;p&gt;Modern web technologies like WebGL, WebCodecs and WebAssembly have enabled browsers to efficiently perform resource-intensive tasks such as video editing that had hitherto been the sole domain of desktop applications. As a result Javascript based video editing tools such as &lt;a href=&quot;https://www.veed.io/&quot;&gt;veed.io&lt;/a&gt; have increased in popularity and users expects ever more sophisticated video editing capabilities inside modern video based web apps.&lt;/p&gt;
&lt;h2 id=&quot;video-editing-use-cases&quot;&gt;Video Editing Use Cases&lt;/h2&gt;
&lt;p&gt;Let’s first outline use cases and requirements of video editing applications on the web. These will inform our discussion of technical features of respective solutions below and grant a conceptual framework for evaluating potential benefits and drawbacks of each solution.&lt;/p&gt;
&lt;h3 id=&quot;simple-video-editing&quot;&gt;Simple Video Editing&lt;/h3&gt;
&lt;p&gt;Let’s start with the base case, &lt;strong&gt;simple video edits&lt;/strong&gt; including trimming, cropping and resizing and simple effects such as adjusting brightness or saturation. This is usually sufficient feature set to support video editing for the following use cases:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sales Outreach Videos:&lt;/strong&gt; Sales teams often need to quickly edit customer-specific videos to personalize their outreach. This may involve trimming irrelevant portions, adding company logos, or adjusting brightness to ensure visual clarity.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Messaging Applications:&lt;/strong&gt; These often require basic editing tools to allow users to crop, trim, or apply simple filters to shared videos, ensuring they’re concise and visually appealing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Screencasting:&lt;/strong&gt; Screencasting tools benefit from trimming and resizing capabilities to focus on key parts of recorded screens. Adding effects like brightness adjustment can make tutorials clearer and more professional.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CMS Systems:&lt;/strong&gt; Content management systems may offer built-in video editing to help users optimize media assets for specific platform requirements, such as resizing for web embeds or adding subtle branding.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Screen Recording Applications:&lt;/strong&gt; Screen recording applications often include simple editing options for cleaning up recorded content by trimming extraneous sections or cropping to highlight the most relevant parts.&lt;/p&gt;
&lt;h3 id=&quot;video-annotation&quot;&gt;Video Annotation&lt;/h3&gt;
&lt;p&gt;Next, users might want to add an additional layer of information to videos and overlay other assets, such as stickers, shapes, overlays, or text. Crucially these assets need to be time-based—that is, users need control over when the asset is shown so that particular video sequences can be referenced. This introduces the need for a timeline to arrange different video components relative to each other in time, as well as features like voice-over and audio track support.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;E-commerce Reviews:&lt;/strong&gt; Sellers and reviewers can annotate product demo videos with callouts, price tags, and feature highlights to make the content more engaging and informative.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Claims Management / Insurance:&lt;/strong&gt; Insurance companies can use annotation to highlight key details in submitted video claims, such as timestamps of damage or explanatory text overlaying critical sections of footage.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Real Estate:&lt;/strong&gt; Realtors might annotate property walkthroughs by adding labels, dimensions, or descriptive text overlays to highlight key features of the home or property.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Educational Applications:&lt;/strong&gt; Instructors can use annotation tools to emphasize key moments in lectures or tutorials, such as overlaying text with formulas or concepts, or adding visual shapes to guide attention.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Productivity Tools:&lt;/strong&gt; Users can annotate meeting recordings with timestamps, text notes, or overlay diagrams to summarize key decisions or action points.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Healthcare and Telemedicine:&lt;/strong&gt; Medical professionals might annotate diagnostic videos or procedure recordings to explain findings or highlight areas of interest for training purposes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Customer Support &amp;#x26; Onboarding Tools:&lt;/strong&gt; Companies can add annotations to video tutorials or troubleshooting guides to direct users through specific steps or highlight important information.&lt;/p&gt;
&lt;h3 id=&quot;video-composition&quot;&gt;Video Composition&lt;/h3&gt;
&lt;p&gt;As we’re moving away from single media editing to creating video compositions of several types of media such as audio tracks, text, images, animations, and effects to create appealing visual designs, a well-designed timeline becomes even more important. Users need to manage many different video components in time, requiring user-friendly ways to browse and integrate external assets. This editor variant is most relevant for the following use cases:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Marketing Tech (Promotional Videos):&lt;/strong&gt; Marketers can create visually stunning promotional videos by combining custom animations, background music, and text overlays for branding.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Social Media (Stories and Reels):&lt;/strong&gt; Social media creators can quickly craft short, engaging videos that combine multiple assets like stickers, animations, and dynamic transitions tailored to platform-specific formats.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Event Highlight Reels:&lt;/strong&gt; Event organizers can compile videos, photos, and music into cohesive highlight reels that encapsulate the essence of the occasion.&lt;/p&gt;
&lt;h3 id=&quot;template-based-video-creation&quot;&gt;Template-based Video Creation&lt;/h3&gt;
&lt;p&gt;For many applications, users need starting points and examples for their designs. Starting from a blank canvas is rarely necessary for most use cases. Take a simple product video that includes promotional text, a brand logo, and animations. There is no need to reinvent the wheel for these types of videos. Instead, design applications should offer template libraries to accelerate user workflows.&lt;/p&gt;
&lt;p&gt;Once we introduce workflows involving several stakeholders—such as designers setting up a certain brand framework and marketers working with and adapting these preconfigured designs—templates need to be able to constrain what edit operations adaptors can perform. These requirements are particularly important for these use cases:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Digital Asset Management:&lt;/strong&gt; Organizations can manage and deploy branded video templates across teams, ensuring consistent design and messaging.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Social Media Publishing:&lt;/strong&gt; Social media managers can utilize templates for quick turnaround on platform-specific video formats, such as Instagram Stories or LinkedIn posts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Marketing Tech:&lt;/strong&gt; Marketing teams can rely on pre-designed templates to churn out campaign videos at scale while maintaining brand consistency.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Training Videos:&lt;/strong&gt; HR or L&amp;#x26;D departments can adapt existing templates to quickly produce training materials customized for different teams or scenarios.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;IMG.LY&amp;#39;s Video Editor enables template based constraints&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1380px) 1380px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1380&quot; height=&quot;789&quot; src=&quot;https://img.ly/_astro/Video-Templating_1eQR66.webp&quot; srcset=&quot;/_astro/Video-Templating_7I73m.webp 640w, /_astro/Video-Templating_1h8MhA.webp 750w, /_astro/Video-Templating_1R3Qif.webp 828w, /_astro/Video-Templating_Z2oAeix.webp 1080w, /_astro/Video-Templating_ZYbYlz.webp 1280w, /_astro/Video-Templating_1eQR66.webp 1380w&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;creative-automation-for-video&quot;&gt;Creative Automation for Video&lt;/h3&gt;
&lt;p&gt;Finally, you can leverage data and automation to generate variations of your templates at scale, significantly boosting the productivity of use cases where users need to either test a large number of designs, publish to different channels with different requirements, or adapt designs to many slightly different instances, for example, menu designs for a franchise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Marketing Tech:&lt;/strong&gt; Marketers can generate hundreds of ad variations for A/B testing or localization by dynamically adjusting text, visuals, or calls to action.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Social Media Publishing:&lt;/strong&gt; Social media teams can automate the creation of videos tailored to platform specifications, such as aspect ratios or resolution, while retaining core branding.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;E-commerce:&lt;/strong&gt; Retailers can produce personalized product showcase videos for different customer segments, featuring tailored offers, pricing, or recommendations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hospitality Industry:&lt;/strong&gt; Hotels and restaurants can dynamically generate location-specific promotional videos showcasing seasonal offers, menus, or events.&lt;/p&gt;
&lt;h2 id=&quot;essential-video-editing-features&quot;&gt;Essential Video Editing Features&lt;/h2&gt;
&lt;p&gt;The above use cases are enabled by a set of features from simple transforms to complex compositions. Some video editors are focused more on manipulating individual video clips while others are more oriented towards video creation providing fully-fledged multi-media composition tool. This concise overview serves as a reference for evaluating video editing solutions:&lt;br&gt;
Transforms&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cut, Trim, and Split&lt;/strong&gt;: Basic editing tools for segmenting video clips.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resize and Scale&lt;/strong&gt;: Adjusts clip dimensions, ensuring proper fit or aspect ratio.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Crop and Rotate&lt;/strong&gt;: Controls framing and orientation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zooming Capabilities&lt;/strong&gt;: A UX feature enabling detailed editing and close-up views for precision.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;adjustments&quot;&gt;Adjustments&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Basic Adjustments&lt;/strong&gt;: Controls brightness, contrast, and other visual enhancements.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Filters and Effects&lt;/strong&gt;: Sets the visual appearance and atmosphere of videos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Audio Tracks and Mixing&lt;/strong&gt;: Supports multi-track audio adjustments and volume balancing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Text and Overlay Options&lt;/strong&gt;: Allows visual enhancements with text, captions, and emojis, providing opacity and layering options.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;composition&quot;&gt;Composition&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Multi-media Composition&lt;/strong&gt;: Overlaying images, stickers, text as well as audio tracks are essential for creating videos through composition.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-Track Editing&lt;/strong&gt;: Elements and layers need to be position relative to each other in time allowing the creation of complex composition.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Canvas-Based Editing&lt;/strong&gt;: Provides a flexible workspace for positioning and layering media elements.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Timeline Management&lt;/strong&gt;: Split, join and arrange clips on a timeline. Manages the positioning of clips and timing for seamless transitions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Animations&lt;/strong&gt;: Make static elements dynamic and control their behavior in time. Can be use to create videos from scratch and enhance the storytelling workflow of existing ones.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&quot;IMG.LY&amp;#39;s Video Editor Timeline Feature&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1376px) 1376px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1376&quot; height=&quot;960&quot; src=&quot;https://img.ly/_astro/Video-Editor-Timeline_Z1nLaxM.webp&quot; srcset=&quot;/_astro/Video-Editor-Timeline_Z2giwjW.webp 640w, /_astro/Video-Editor-Timeline_ZYWIGq.webp 750w, /_astro/Video-Editor-Timeline_1NmLoH.webp 828w, /_astro/Video-Editor-Timeline_Z23wuov.webp 1080w, /_astro/Video-Editor-Timeline_Z2pwGVX.webp 1280w, /_astro/Video-Editor-Timeline_Z1nLaxM.webp 1376w&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-technology-landscape&quot;&gt;The Technology Landscape&lt;/h2&gt;
&lt;p&gt;Some time in the early 2000s the web started to be viewed as a platform to run applications not just a distributed database to deliver static html documents. While Javascript development was not yet at a point to serve as foundation for the kind of application development we see today, Adobe Flash filled the role of development platform. Video editing in the early days of the web was mainly provided by Flash-based tools involving simple transform operations such as trimming and basic transitions. Java applets were another way to deliver processing intensive programs via the browser while executing them outside of the browser inside the JVM. These early attempts were either too clunky, since they could not run natively in the browser or lacked the performance to be useful for high quality editing.&lt;/p&gt;
&lt;p&gt;When HTML5 came onto the scene in the early 2000s it became possible to handle multimedia content natively in the browser. Coupled with significant performance advances of Javascript and the introduction of WebRTC this opened the door for video editing on the web.&lt;/p&gt;
&lt;p&gt;Some early cloud-based editors, such as WeVideo and Magisto, while more convenient and user-friendly than its predecessors still suffered from performance issues due to latency and lacked the depth of features found in desktop software.&lt;/p&gt;
&lt;p&gt;In the past few years advances such as WebAssembly and Javascript libraries built upon it e.g. ffmpeg.js have revolutionised browser-based video editing. User can now perform complex editing tasks like multi-track timelines, video effects and real-time in-browser rendering. Modern web-based solution have even come to rival desktop apps, because they can take advantage of GPU acceleration, modern APIs like WebGL and UI frameworks such as React.&lt;/p&gt;
&lt;p&gt;Let’s have a look at the state of the art web technologies that allow us to create performant video editing experiences inside the browsers. We are going to explore their relative strength, their complexities and conclude with when to best use each of these technologies:&lt;/p&gt;
&lt;h3 id=&quot;canvas-api&quot;&gt;Canvas API&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API&quot;&gt;HTML5 Canvas API&lt;/a&gt; should be most familiar to most modern web developers, since it’s a familiar and popular way to render 2D graphics in the browser. It’s use for video editing is limited and restricted to simple overlays, trimming, composition and animation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Complexity:&lt;/strong&gt; Canvas is the least complex of the technologies introduced below and overlaps with the WebGL feature set to some extend, it’s API is well-known to most web developers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Advantages:&lt;/strong&gt; Canvas is lightweight, compatible across all browsers, and easy to implement, making it a great choice for simple use cases that require basic effects and no timeline.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Downsides:&lt;/strong&gt; While well suited for simpler tasks Canvas lacks the GPU-acceleration of WebGL, hence it is not recommended for resource intensive operation or performance sensitive use cases.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;When to Use:&lt;/strong&gt; Choose Canvas for simple editing tasks, like trimming or basic overlays, or if you need a fallback technology that works well on legacy browsers and devices.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;webgl&quot;&gt;WebGL&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API&quot;&gt;WebGL&lt;/a&gt; opens up the power of GPU-accelerated graphics to the browser, making it the default choice for any use case requiring high performance rendering. As such modern Javascript video editing solution are well served by webGL when looking to render visual effects in real time, add transitions or facilitate multi-layer compositions by leveraging the GPU.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Complexity:&lt;/strong&gt; WebGL comes with a steep learning curve especially if you are unfamiliar with 3D graphics processing, shaders and GPU programming.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Advantages:&lt;/strong&gt; WebGL delivers high performance for processing complex video effects and can handle significant volume of data without latency. That makes it ideal for advanced, highly responsive video editing features.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Downsides:&lt;/strong&gt; It can be challenging to engineer modular and maintainable WebGL code, debugging shaders and ensuring consistent performance across devices is an art in itself. WebGL might also be overpowered for simple editing use cases that do not justify the added complexity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;When to Use:&lt;/strong&gt; Use WebGL if you’re creating a video editor with high-performance demands, particularly if real-time effects, transitions, or multi-layer compositing are needed.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;webcodecs-api&quot;&gt;WebCodecs API&lt;/h3&gt;
&lt;p&gt;Next up in our arsenal of formidable web technologies is a recent addition to modern browsers, WebCodecs, provide direct access to hardware accelerated video encoding and decoding.&lt;/p&gt;
&lt;p&gt;The WebCodecs API is a recent addition to the browser, allowing direct access to hardware-accelerated video decoding and encoding. This API makes it easier to handle high-resolution video without delays, thanks to efficient decoding directly in the browser.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Complexity:&lt;/strong&gt; WebCodecs is relatively easy to use for those familiar with media formats. However, you may need other technologies for rendering and complex editing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Advantages:&lt;/strong&gt; This API offers quick access to hardware acceleration, ideal for managing large video files. With it, you can efficiently handle high-definition video playback and streaming.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Downsides:&lt;/strong&gt; Browser support for WebCodecs is still expanding, so compatibility might be a concern. Additionally, WebCodecs alone doesn’t provide a full editing suite; it needs to be combined with rendering and compositing technologies.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;When to Use:&lt;/strong&gt; WebCodecs is perfect if you need efficient decoding and encoding, especially for handling high-definition playback or live streaming.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;webassembly-wasm&quot;&gt;WebAssembly (Wasm)&lt;/h3&gt;
&lt;p&gt;The next performance frontier browser pushed towards was enabling near-native performance by compiling languages like C++ or Rust into a format that efficiently runs in Javascript. This format is &lt;a href=&quot;https://webassembly.org/&quot;&gt;WebAssembly&lt;/a&gt;, which makes it possible to handle computationally expensive tasks like encoding, decoding or frame manipulation inside the browser.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Complexity:&lt;/strong&gt; Working with WebAssembly is significantly more complex that the technologies discussed above. Developers need knoweldge of C++ or Rust as well as experience compiling to Wasm.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Advantages:&lt;/strong&gt; WebAssembly enables browsers to handle complex video processing tasks, such as encoding and decoding, with near-native performance. Libraries such as FFmpeg build upon WebAssembly to make familiar video tools available to web developers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Downsides:&lt;/strong&gt; Development with Wasm is complex, and debugging can be a challenge. Additionally, Wasm modules may increase load times.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;When to Use:&lt;/strong&gt; Use WebAssembly when building native libraries for complex operation and expensive computations, such as encoding and decoding.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Our article o&lt;a href=&quot;https://img.ly/blog/how-to-build-a-video-editor-with-wasm-in-react/&quot;&gt;n building a video editor with React and Wasm&lt;/a&gt; gives you a real-world starting point for your own apps.&lt;/p&gt;
&lt;h3 id=&quot;mediastream-api&quot;&gt;MediaStream API&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/MediaStream&quot;&gt;MediaStream API&lt;/a&gt; is essential for gaining easy access to live video sources from within the browser, such as webcams. If your video editing app includes a feature for real-time recording or streaming the MediaStream API is an essential tool.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Complexity:&lt;/strong&gt; MediaStream exposes a fairly simple API and is relatively easy to learn for experienced web developers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Advantages:&lt;/strong&gt; This API is well-suited for video feeds with low latency such as recording or streaming and does require addition encoding or decoding.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Downsides:&lt;/strong&gt; Any use case requiring post-production video has to rely on additional technologies or frameworks, as the MediaStream API is limited to live feeds. The quality of the stream depends on the input source and can vary.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;When to Use:&lt;/strong&gt; Use MediaStream for applications with live recording or streaming functionality.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;web-audio-api&quot;&gt;Web Audio API&lt;/h3&gt;
&lt;p&gt;The final web technology essential for video editing is the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API&quot;&gt;Web Audio API&lt;/a&gt;. Whether you want to add effects or mix multiple audio tracks, this API offers sophisticated tools for audio manipulation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Complexity:&lt;/strong&gt; For developers unfamiliar with audio processing the learning curve can be stepp, however the API is well designed and there is a host of educational resources.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Advantages:&lt;/strong&gt; Web Audio API allows precise control over audio enabling your app to offer audio adjustments such as effects or reverb and multi-track editing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Downsides:&lt;/strong&gt; It can be challenging to accurately synchronize audio with video, especially if your app includes a real-time component.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;When to Use:&lt;/strong&gt; Opt for Web Audio API when audio editing is a core feature of your video editor.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;using-these-technologies-together&quot;&gt;Using These Technologies Together&lt;/h3&gt;
&lt;p&gt;Together, these technologies can be use to build a comprehensive browser based editor that is virtually indistinguishable from its desktop based counterparts. Different parts of the video editing workflow can be handled by each technology, while some choices have to made depending on the complexity and requirements of your projects, e.g. whether you’ll need resource intensive processing or an integration will real-time sources.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Video Decoding&lt;/strong&gt; - WebCodecs API (for efficient video loading and playback).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rendering&lt;/strong&gt; - WebGL (for high-performance effects) and Canvas API (for simpler editing features).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Complex Processing&lt;/strong&gt; - WebAssembly (for encoding/decoding and using native libraries like FFmpeg).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Audio Processing&lt;/strong&gt; - Web Audio API (for mixing and adding effects to soundtracks).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Live Recording&lt;/strong&gt; - MediaStream API (to capture live video from devices).&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;open-source-javascript-video-editing-libraries&quot;&gt;Open Source Javascript Video Editing Libraries&lt;/h2&gt;
&lt;p&gt;Fortunately in many cases someone has already done the heavy lifting and abstracted those browser APIs into simple to use libraries and frameworks. We’ll explore the most prominent ones distinguishing between projects that are for processing raw video and those that already provide an API for you to use. It is important to note that the libraries introduced below do not provide a video editing UI, unfortunately there are no open source video editors offering an end user interface that meet the standards for inclusion in a production grade application. None of the projects we evaluated met the demands we place on third-party libraries with respect to robustness, stability, maintenance and future development. However many can provide good starting points and references on how to build your own UI such as &lt;a href=&quot;https://github.com/mifi/reactive-video&quot;&gt;Reactive Video&lt;/a&gt; for React UIs.&lt;/p&gt;
&lt;h3 id=&quot;ffmpegjs&quot;&gt;FFmpeg.js&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ffmpegwasm/ffmpeg.wasm&quot;&gt;FFmpeg.js&lt;/a&gt; is the JavaScript port of the popular FFmpeg library compiled into WebAssembly. It enables developers to manipulate and process raw video files entirely in the browser. You can trim, convert formats, extract audio, and apply filters to videos without needing external software. However, FFmpeg just gives you the raw toolchain for building video editing features, you are still tasked with building the entire UX and editing workflows. We have an extensive guide on FFmpeg that you can consult to explore its capabilities and get started learning FFmpeg syntax.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Advantages:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Most comprehensive library for web based video and audio processing.&lt;/li&gt;
&lt;li&gt;Fully client-side, no need for server-side processing.&lt;/li&gt;
&lt;li&gt;Highly flexible, allowing fine-grained control over video workflows.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Downsides:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Fairly complex for beginners with a steep learning curve, requires familiarity with FFmpeg’s command-line syntax.&lt;/li&gt;
&lt;li&gt;FFmpeg is licensed under LGPL which makes it ill-suited for most commercial projects.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;**When to Use:**FFmpeg.js is best suited for projects with custom requirements and UI making it necessary to exert fine-grained control over video processing tasks, especially for use cases like format conversion, advanced editing pipelines, or serverless video workflows.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following two libraries allow you to programatically create and edit videos, we focus on the most stable, popular libraries here, while there might be promising up and comers we want to ensure a degree of dependability of the third-party code to be used in production systems.&lt;/p&gt;
&lt;h3 id=&quot;remotion&quot;&gt;Remotion&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.remotion.dev/&quot;&gt;Remotion&lt;/a&gt; is a React-based framework that enables developers to edit or create videos programmatically in a declarative fashion using React components. React’s declarative syntax makes it comparatively simple to manage video content and Remotion provides a convenient UI for previewing and editing videos. While its studio UI cannot be embedded directly, Remotion can serve as the graphics processing engine for custom UIs. Although it is a commercial project, it offers a generous free tier for individuals and small businesses.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Advantages:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Leverages React’s declarative model for seamless video creation.&lt;/li&gt;
&lt;li&gt;Provides robust video preview capabilities for iterative development.&lt;/li&gt;
&lt;li&gt;Flexible integration with custom-built UIs.&lt;/li&gt;
&lt;li&gt;Generous free tier for non-commercial and small-scale projects.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Downsides:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;The built-in studio UI cannot be embedded, requiring developers to create their own UI for embedding.&lt;/li&gt;
&lt;li&gt;React-specific, limiting use in non-React environments.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;**When to Use:**Use Remotion when building React-based video applications that require programmatic video generation or dynamic video content. It’s ideal for teams already familiar with React and for applications where embedding is not a core requirement.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;etrojs&quot;&gt;&lt;strong&gt;Etro.js&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Similarly to Remotion, Etro.js is a JavaScript framework for programmatic video editing, it is framework agnostic and provides an API for simple composition of layers, effects and exporting videos.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Advantages:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Includes support for advanced effects using GLSL shaders.&lt;/li&gt;
&lt;li&gt;Designed for in-browser video workflows.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Downsides:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Minimal community support compared to larger projects.&lt;/li&gt;
&lt;li&gt;Requires additional effort to create a full UI.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;When to Use:&lt;/strong&gt; Suitable for applications where programmatic control and customization are key.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;extensibility&quot;&gt;Extensibility&lt;/h2&gt;
&lt;p&gt;An important consideration when deciding to buy a prebuilt video editing solution is the degree of customization and extensibility required by your use case versus how critical speed to market is. While most SDKs provide enough flexibility by exposing cor API to build a solution that best suits your needs, this level of technical control comes at the expense of higher development and maintenance efforts. White-label solutions on the other end of the spectrum offer limited customization often relying on iFrames for embedding while providing maximum speed to market. If you are still in the phase where you need to make the business case for video editing features these might be key to allowing to quickly iterate. To learn more about weighing the pros and cons of SDK vs. White-label explore our &lt;a href=&quot;https://img.ly/blog/sdk-vs-white-label-consider-these-differences-when-you-choose-a-solution/&quot;&gt;extensive guide on the topic&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;IMG.LY’s CE.SDK achieves extensibility by providing an &lt;a href=&quot;https://img.ly/blog/img-ly-sdk-plugin-system/&quot;&gt;interface for plugins&lt;/a&gt; that allow developers to add custom features and UI elements.&lt;/p&gt;
&lt;h2 id=&quot;cross-platform-video-editing&quot;&gt;Cross Platform Video Editing&lt;/h2&gt;
&lt;p&gt;While this post is dedicated specifically to Javascript video editing an important consideration for choosing a video editing tech stack is whether there exists an intermediary output format that preserves editing operations so that videos can be edited on other devices and platforms. This is important for collaborative video editing use cases as well as use cases where videos are captured and basic edits performed on mobile and the finishing touches performed on the desktop.&lt;br&gt;
These consideration are particular pertinent for the Real Estate, Telemedicine and Productivity use cases described above, since they involve either a multi-device or collaborative component.&lt;/p&gt;
&lt;p&gt;At most common libraries or SDKs can achieve that by offering support for some form of serialization, that is exporting the edit operations along with the unedited video to then reapply edits upon import.&lt;/p&gt;
&lt;p&gt;IMG.LY’s CE.SDK, on the other hand, is the only video editing SDK that is truly cross-platform. That means it is built atop a single creative engine that is portable to any platform. Whether iOS, Android, Desktop, or the Web, every platform uses the same underlying tech and uses the same custom format for scenes which contain all assets and edits making error-prone serializations obsolete.&lt;/p&gt;
&lt;p&gt;Furthermore:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;iOS and Android make use of the same underlying API.&lt;/li&gt;
&lt;li&gt;Cross platform feature parity is baked into the cake. Since core functionality is implemented at the engine level, features are guaranteed to be available on both platform, although the timeline might differ somewhat.&lt;/li&gt;
&lt;li&gt;Designs are 100% interoperable and consistent between platforms. Exporting and importing design files across platforms works seamlessly and final renderings are guaranteed to be consistent.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;javascript-video-editing--generative-ai&quot;&gt;Javascript Video Editing &amp;#x26; Generative AI&lt;/h2&gt;
&lt;p&gt;Generative AI is impacting video editing and generation across the board. Video generation obvious application of generative AI, but AI is also changing the way we we compose, create an edit videos in more subtle ways.&lt;/p&gt;
&lt;p&gt;Features such as automated transitions, color grading, voice enhancement, voice over generation, background removal or inpainting are&lt;/p&gt;
&lt;p&gt;Currently, these capabilities are offered by multiple specialized providers, such as ElevenLabs and OpenAI’s Sora. Firstly, that means modern Javascript video editors need to be open enough to serve as integrators for various, programmatically combining voice tracks, video clips, text, audio and other media before presenting users with an editing UI. Secondly, traditional video editing needs to enable the human in the loop. AI is still imperfect and manually refining unchangeable artifacts through prompts is inefficient and tedious. Instead the output by AI must remain editable and any editor solution smoothly interface with those artifacts to allow users to add the necessary polish, swap out media and regenernate individual parts of the scene.&lt;/p&gt;
&lt;p&gt;To explore what this might look like in practice have a look at our CEO Eray Basar’s latest project building an AI video generator on top of &lt;a href=&quot;https://img.ly/products/creative-sdk&quot;&gt;CE.SDK&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;When building or integrating a JavaScript video editor, developers and PMs have to navigate a complex technology landscape and make myriad decisions along the way. This guide has covered everything from essential use cases and feature sets to the cutting-edge technologies that underly browser-based video editing. Whether your project requires basic trimming tools or advanced multimedia composition, understanding the benefits and downsides of the various solutions like Canvas, WebGL, WebCodecs, WebAssembly, and more is crucial for choosing the right stack.&lt;/p&gt;
&lt;p&gt;We’ve also explored how open-source tools like FFmpeg.js, Remotion, and Etro.js can accelerate development, while SDKs like IMG.LY’s CE.SDK offer unmatched extensibility and cross-platform compatibility. For those navigating the impact of generative AI on video editing, the need for seamless integration and user-centric design remains important.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If you’re looking for a robust, modern video editing solution for your web application, explore our showcase and start a free trial.&lt;/strong&gt;&lt;/p&gt;</content:encoded><dc:creator>Jan</dc:creator><media:content url="https://blog.img.ly/2024/12/Javascript-Editor--1-.jpg" medium="image"/><category>Video Editing</category><category>CE.SDK</category><category>Automation</category><category>Cross-Platform</category><category>JavaScript</category></item><item><title>CreativeEditor SDK Now Supports React Native on iOS &amp; Android</title><link>https://img.ly/blog/creative-sdk-react-native-support/</link><guid isPermaLink="true">https://img.ly/blog/creative-sdk-react-native-support/</guid><description>Integrate video, design, and photo editing capabilities with our new React Native package for CE.SDK.</description><pubDate>Thu, 19 Dec 2024 11:57:22 GMT</pubDate><content:encoded>&lt;p&gt;We’re thrilled to announce the release of our official &lt;strong&gt;&lt;code&gt;@imgly/editor-react-native&lt;/code&gt;&lt;/strong&gt; package, bringing the power of CreativeEditor SDK to the React Native ecosystem for iOS and Android!&lt;/p&gt;
&lt;p&gt;CreativeEditor SDK enables developers to seamlessly integrate design, video, and photo editing features into their applications. Over the past few months, we’ve been focused on enhancing mobile editor solutions—refining features and expanding to new use cases, including the Video Editor.&lt;/p&gt;
&lt;p&gt;To make CreativeEditor SDK accessible to even more developers, we’re expanding our support to include mobile cross-platform frameworks. We started with Flutter and are now adding React Native as another highly popular frameworks for building truly cross-platform apps.&lt;/p&gt;
&lt;h2 id=&quot;getting-started&quot;&gt;Getting Started&lt;/h2&gt;
&lt;p&gt;Getting started with CreativeEditor SDK in React Native is simple! First, make sure you meet the following minimum requirements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;React Native:&lt;/strong&gt; 0.73+&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;iOS:&lt;/strong&gt; 16+&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Swift:&lt;/strong&gt; 5.10 (Xcode 15.4)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Android:&lt;/strong&gt; 7+&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then, add the &lt;strong&gt;&lt;code&gt;@imgly/editor-react-native&lt;/code&gt;&lt;/strong&gt; package to your project using your favorite package manager.&lt;/p&gt;
&lt;p&gt;To launch the editor, you’ll need an instance of &lt;code&gt;EditorSettings&lt;/code&gt; - you can use &lt;code&gt;EditorSettingsModel&lt;/code&gt; for convenience. All you need to get started is a license key, which you can obtain from your IMG.LY dashboard.&lt;/p&gt;
&lt;p&gt;Here’s an example of opening the Design Editor:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; IMGLYEditor, { EditorSettingsModel } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;@imgly/editor-react-native&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; const&lt;/span&gt;&lt;span&gt; openEditor&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; async&lt;/span&gt;&lt;span&gt; ()&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Promise&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt;&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  const&lt;/span&gt;&lt;span&gt; settings&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; EditorSettingsModel&lt;/span&gt;&lt;span&gt;({ license: &lt;/span&gt;&lt;span&gt;&apos;YOUR_LICENSE_KEY&apos;&lt;/span&gt;&lt;span&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  const&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; await&lt;/span&gt;&lt;span&gt; IMGLYEditor.&lt;/span&gt;&lt;span&gt;openEditor&lt;/span&gt;&lt;span&gt;(settings);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;editor-ui-presets&quot;&gt;Editor UI Presets&lt;/h2&gt;
&lt;p&gt;The React Native plugin builds on our native editor solutions, allowing you to leverage the existing editor UI variants. At launch, you can choose from:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://img.ly/docs/cesdk/react-native/prebuilt-solutions/design-editor-9bf041/&quot;&gt;Design Editor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://img.ly/docs/cesdk/react-native/prebuilt-solutions/photo-editor-42ccb2/&quot;&gt;Photo Editor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://img.ly/docs/cesdk/react-native/prebuilt-solutions/camera-editor-5c6d08/&quot;&gt;Camera UI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://img.ly/docs/cesdk/react-native/prebuilt-solutions/t-shirt-designer-02b48f/&quot;&gt;Apparel Editor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://img.ly/docs/cesdk/react-native/prebuilt-solutions/postcard-editor-61e1f6/&quot;&gt;Postcard Editor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://img.ly/docs/cesdk/react-native/prebuilt-solutions/video-editor-9e533a/&quot;&gt;Video Editor&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Simply choose the editor solution that best suits your use case. By default, the &lt;strong&gt;Design Editor&lt;/strong&gt; opens, but &lt;a href=&quot;https://img.ly/docs/cesdk/react-native/prebuilt-solutions-d0ed07/&quot;&gt;switching to other solutions&lt;/a&gt; is straightforward.&lt;/p&gt;
&lt;h2 id=&quot;android-and-ios-setup&quot;&gt;Android and iOS Setup&lt;/h2&gt;
&lt;p&gt;To setup our module in your application, you’ll need to add the &lt;a href=&quot;https://www.npmjs.com/package/expo-build-properties&quot;&gt;expo-build-properties&lt;/a&gt; dependency which handles the necessary adjustments to your native folders.&lt;/p&gt;
&lt;h3 id=&quot;android&quot;&gt;Android&lt;/h3&gt;
&lt;p&gt;For Android, you’ll need to make a few adjustments to your &lt;code&gt;app.json&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Set the &lt;code&gt;minSdkVersion&lt;/code&gt; to 24 (Android 7) or later.&lt;/li&gt;
&lt;li&gt;Add the IMG.LY Maven repository.&lt;/li&gt;
&lt;li&gt;Ensure your Kotlin version is compatible (e.g., 1.9.10).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here’s an example configuration:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &quot;expo&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &quot;android&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      &quot;minSdkVersion&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;24&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      &quot;extraMavenRepos&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;&amp;#x3C;https://artifactory.img.ly/artifactory/maven&gt;&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      &quot;kotlinVersion&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;1.9.10&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;ios&quot;&gt;iOS&lt;/h3&gt;
&lt;p&gt;On iOS, ensure your deployment target is set to &lt;strong&gt;16.0&lt;/strong&gt;. You can configure this in your &lt;code&gt;app.json&lt;/code&gt; file:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &quot;expo&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &quot;ios&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      &quot;deploymentTarget&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;16.0&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Check out the &lt;a href=&quot;https://img.ly/docs/cesdk/react-native/get-started/overview-e18f40/&quot;&gt;Getting Started Guides&lt;/a&gt; or the examples on &lt;a href=&quot;https://github.com/imgly/cesdk-react-native-examples/tree/v1.41.1&quot;&gt;GitHub&lt;/a&gt; for a complete reference.&lt;/p&gt;
&lt;h2 id=&quot;the-only-truly-cross-platform-sdk&quot;&gt;The Only Truly Cross-Platform SDK&lt;/h2&gt;
&lt;p&gt;If you’re working with React Native, you’re likely focused on faster time to market, reduced development complexity, and feature consistency across platforms. The CreativeEditor SDK shares these goals, using a single, unified creative engine that ensures:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Consistent APIs:&lt;/strong&gt; iOS and Android share the same underlying API.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Feature Parity:&lt;/strong&gt; Core functionality is implemented at the engine level, guaranteeing feature availability across platforms.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Interoperable Designs:&lt;/strong&gt; Export and import designs seamlessly across platforms with consistent rendering.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;fully-customizable-ui&quot;&gt;Fully Customizable UI&lt;/h2&gt;
&lt;p&gt;The React Native plugin offers flexibility for theming, styling, and integrating callbacks into your editor’s workflow. Soon, we’ll introduce more advanced customization options, such as enabling or disabling features by default.&lt;/p&gt;
&lt;p&gt;Refer to our documentation for &lt;a href=&quot;https://img.ly/docs/cesdk/react-native/configuration-2c1c3d/&quot;&gt;detailed instructions on customizing the editor to match your branding and use case&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;whats-next&quot;&gt;What’s Next?&lt;/h2&gt;
&lt;p&gt;To showcase the capabilities of our React Native plugin, we’ve prepared a dedicated example application available on &lt;a href=&quot;https://github.com/imgly&quot;&gt;GitHub&lt;/a&gt;. You can explore it to see the editor in action.&lt;/p&gt;
&lt;p&gt;Additionally, our documentation provides all the details needed to get started, and you can visit the &lt;a href=&quot;https://www.npmjs.com/package/@imgly/editor-react-native&quot;&gt;@imgly/editor-react-native npm page&lt;/a&gt; to begin your integration.&lt;/p&gt;
&lt;p&gt;Remember to grab your license from your dashboard after starting a &lt;a href=&quot;https://img.ly/forms/free-trial&quot;&gt;free trial&lt;/a&gt;, and let the CreativeEditor SDK unlock your users’ creative potential.&lt;/p&gt;
&lt;p&gt;Thanks for reading!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3,000+ creative professionals gain early access to new features and updates—don’t miss out, and&lt;/strong&gt; &lt;a href=&quot;https://share.hsforms.com/1IgAOV1wASXGPnFG4ZPLejg1hk3i?ref=img.ly&quot;&gt;&lt;strong&gt;subscribe&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;to our newsletter.&lt;/strong&gt;&lt;/p&gt;</content:encoded><dc:creator>Jan</dc:creator><media:content url="https://blog.img.ly/2024/12/react-photo-video-design-editor-sdk-l.jpg" medium="image"/><category>React Native</category><category>Creative Editor</category><category>CE.SDK</category><category>Expo</category></item><item><title>Plugins Part 2: Custom Panels</title><link>https://img.ly/blog/plugins-part-2-customizable-panels/</link><guid isPermaLink="true">https://img.ly/blog/plugins-part-2-customizable-panels/</guid><description>Part 2 of our plugin release gives you the ability to add panels to the CE.SDK UI allowing you to extend the SDK with more complex functionality.</description><pubDate>Wed, 23 Oct 2024 12:53:27 GMT</pubDate><content:encoded>&lt;p&gt;In &lt;a href=&quot;https://img.ly/blog/plugin-release-part-1-customizing-the-ui-quick-actions/&quot;&gt;Part 1 of our series&lt;/a&gt;, we introduced a plugin system for customizing UI elements and quick actions within the CreativeEditor SDK.&lt;/p&gt;
&lt;p&gt;Now, in Part 2, we’re introducing Customizable Panels, a new feature that gives developers even more control over the editor. These panels can handle tasks like guiding users through complex workflows, interacting with external APIs or gathering detailed user input—allowing for anything from simple tweaks to fully custom workflows.&lt;/p&gt;
&lt;p&gt;Let’s take a quick look at where panel plugins fit within the CE.SDK Web UI. To dive in instead, consult the &lt;a href=&quot;https://img.ly/docs/cesdk/js/user-interface/ui-extensions/create-custom-panel-d87b83/?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=plugins2&quot;&gt;documentation&lt;/a&gt; or explore one of the examples below.&lt;/p&gt;
&lt;h2 id=&quot;extension-points-in-the-ui&quot;&gt;Extension Points in the UI&lt;/h2&gt;
&lt;p&gt;Before customizing the UI, it’s important to understand the user experience that makes the editor intuitive for creating and editing designs. Below are the key areas of the editor UI where your plugins can be integrated:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&amp;#39;Extension points&amp;#39; refer to the highlighted areas, where developers can add custom actions and panels.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1928px) 1928px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1928&quot; height=&quot;1098&quot; src=&quot;https://img.ly/_astro/CESDK-Editor-UI_2ly9o.webp&quot; srcset=&quot;/_astro/CESDK-Editor-UI_tCzFs.webp 640w, /_astro/CESDK-Editor-UI_zSL1G.webp 750w, /_astro/CESDK-Editor-UI_ZCee4h.webp 828w, /_astro/CESDK-Editor-UI_Z1RGjpB.webp 1080w, /_astro/CESDK-Editor-UI_Z1dvbl2.webp 1280w, /_astro/CESDK-Editor-UI_Z2fggz3.webp 1668w, /_astro/CESDK-Editor-UI_2ly9o.webp 1928w&quot;&gt;&lt;/p&gt;
&lt;p&gt;The quick actions we introduced in part one are used to implement simple one-click actions to edit canvas elements, primarily inside the inspector bar and canvas menus. This release opens up the panel as additional UI element to facilitate more involved features requiring UI interactions beyond a simple click.&lt;/p&gt;
&lt;h2 id=&quot;new-possibilities-with-panels&quot;&gt;New Possibilities with Panels&lt;/h2&gt;
&lt;p&gt;Panels serve as customizable UI elements that provide plenty of room for your plugin’s unique requirements. Here’s how developers can utilize them:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Guide Users Through Workflows&lt;/strong&gt;&lt;br&gt;
Implement panels to assist users in navigating workflows or controlling specific plugin settings, tailoring the editor experience to meet individual needs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Complex Interaction with External AI or Services&lt;/strong&gt;&lt;br&gt;
While it’s possible to connect to third-party service using quick actions, some use cases require more user interaction. To support these cases you can now create panel UIs that connect with third-party APIs to gather data or trigger processes, such as AI-driven design tools or content generation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Collect Detailed User Input&lt;/strong&gt;&lt;br&gt;
Use panels to collect more complex input from users, such as advanced export options, template customization, theming or batching design adjustments.&lt;/p&gt;
&lt;p&gt;These new capabilities round out our goal of empowering developers to shape CE.SDK themselves, tailoring the user experience to fit perfectly with their particular use case.&lt;/p&gt;
&lt;h2 id=&quot;example-plugins&quot;&gt;Example Plugins&lt;/h2&gt;
&lt;p&gt;To demonstrate the potential of panels, we’ve developed three example plugins that showcase different approaches to extending the CreativeEditor SDK’s functionality.&lt;/p&gt;
&lt;p&gt;Plugins can be grouped into two categories:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Functionality-Enhancing Plugins:&lt;/strong&gt; These integrate external services, assets, or custom code. For example, the QR embed plugin adds a feature by interacting with a third-party API.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Custom Editor Behavior Plugins:&lt;/strong&gt; These plugins interact directly with the CE.SDK Engine API, enhancing the SDK’s &lt;em&gt;existing&lt;/em&gt; functionality by introducing new modes of interaction or extending the user interface.&lt;/p&gt;
&lt;h3 id=&quot;qr-code-embed-plugin&quot;&gt;&lt;a href=&quot;https://img.ly/showcases/cesdk/qr-code-plugin/web?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=plugins2&quot;&gt;QR Code Embed Plugin&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The first category of plugins is exemplified by &lt;a href=&quot;https://img.ly/showcases/cesdk/qr-code-plugin/web?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=plugins2&quot;&gt;this QR plugin&lt;/a&gt;, which add the ability to embed a QR code directly in the canvas. The plugin interacts with a third-party QR code generator API and displays a panel where users can enter a URL and customize the color of the QR code.&lt;/p&gt;
&lt;p&gt;&lt;video src=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/plugins-ii/qr-plugin.mp4&quot; controls autoplay muted loop playsinline&gt;&lt;/video&gt;&lt;/p&gt;
&lt;p&gt;The next two examples illustrate plugins from the second category, which interface with the Engine API to enhance CE.SDK functionality:&lt;/p&gt;
&lt;h3 id=&quot;export-options-panel&quot;&gt;&lt;a href=&quot;https://img.ly/showcases/cesdk/export-options/web?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=plugins2&quot;&gt;Export Options Panel&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://img.ly/showcases/cesdk/export-options/web?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=plugins2&quot;&gt;This showcase&lt;/a&gt; provides a reference implementation for a panel that allows users to configure export options including export formats and file types, such as PNG, JPEG, or PDF, which pages to export and at what quality and resolution. A corresponding showcase is also available for &lt;a href=&quot;https://img.ly/showcases/cesdk/video-export-options/web?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=plugins2&quot;&gt;video scenes&lt;/a&gt;, allowing users to control resolution and quality of the exported video file.&lt;/p&gt;
&lt;p&gt;&lt;video src=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/plugins-ii/export.mp4&quot; controls autoplay muted loop playsinline&gt;&lt;/video&gt;&lt;/p&gt;
&lt;h3 id=&quot;template-adaptation-ui&quot;&gt;&lt;a href=&quot;https://img.ly/showcases/cesdk/form-based-template-adoption/web?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=plugins2&quot;&gt;Template Adaptation UI&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://img.ly/showcases/cesdk/form-based-template-adoption/web?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=plugins2&quot;&gt;In this example&lt;/a&gt;, we add a panel that collects user input via a form, which is then used to dynamically adapt a design template. Users can input text, select colors, or upload images, and the template is modified based on these choices. This demonstrates how panels can streamline workflows, making it easier for users to customize templates to fit their specific needs.&lt;/p&gt;
&lt;p&gt;&lt;video src=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/plugins-ii/Form-templates.mp4&quot; controls autoplay muted loop playsinline&gt;&lt;/video&gt;&lt;/p&gt;
&lt;h2 id=&quot;outlook&quot;&gt;Outlook&lt;/h2&gt;
&lt;p&gt;With the release of panels, we are advancing our mission to empower developers to fully customize and extend the CreativeEditor SDK. These new features for creating sophisticated, interactive plugins will unlock exciting opportunities for innovation, whether integrating external services, designing dynamic user interfaces, or automating complex workflows.&lt;/p&gt;
&lt;p&gt;We encourage you to explore the power of panels in your own projects. Visit our &lt;a href=&quot;https://img.ly/docs/cesdk/js/user-interface/ui-extensions-d194d1/?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=plugins2&quot;&gt;plugin documentation&lt;/a&gt; to get started, and let us know what you’re building! As always, we’re here to support your journey in redefining creative editing.&lt;/p&gt;
&lt;p&gt;Stay tuned for more updates, and feel free to &lt;a href=&quot;https://img.ly/forms/contact-sales?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=plugins2&quot;&gt;contact us&lt;/a&gt; if you have any questions or need assistance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Over 3,000 creative professionals gain early access to new features and updates—don’t miss out, and&lt;/strong&gt; &lt;a href=&quot;https://share.hsforms.com/1IgAOV1wASXGPnFG4ZPLejg1hk3i&quot;&gt;&lt;strong&gt;subscribe&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;to our newsletter.&lt;/strong&gt;&lt;/p&gt;</content:encoded><dc:creator>Jan</dc:creator><media:content url="https://blog.img.ly/2024/10/plugins_part2.jpg" medium="image"/><category>SDK</category><category>CE.SDK</category><category>Plugin</category><category>Templating</category></item><item><title>CE.SDK Video Editor Now Available on Android</title><link>https://img.ly/blog/ce-sdk-video-editor-now-available-on-android/</link><guid isPermaLink="true">https://img.ly/blog/ce-sdk-video-editor-now-available-on-android/</guid><description>Integrate a fully-customizable Video Editor into your Android App with CE.SDK.</description><pubDate>Tue, 22 Oct 2024 11:44:02 GMT</pubDate><content:encoded>&lt;p&gt;We are excited to announce the release of CE.SDK’s video editing and video content creation tools for Android!&lt;/p&gt;
&lt;p&gt;After the successful iOS launch, CE.SDK’s professional video editing capabilities are now available for Android. Whether your app focuses on social media, e-commerce, or marketing technology, CE.SDK enables users to create high-quality videos directly within your app.&lt;/p&gt;
&lt;p&gt;&lt;video src=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/1-36/uncompressed/Android-crop-split-trim.mp4&quot; controls autoplay muted loop playsinline&gt;&lt;/video&gt;&lt;/p&gt;
&lt;h2 id=&quot;getting-started&quot;&gt;Getting Started&lt;/h2&gt;
&lt;p&gt;Getting up and running with an instance of the CE.SDK video editor for Android is easy.&lt;/p&gt;
&lt;p&gt;After downloading your license (get your trial license here) from your dashboard, simply &lt;a href=&quot;https://img.ly/docs/cesdk/android/prebuilt-solutions/video-editor-9e533a/&quot;&gt;invoke &lt;code&gt;VideoEditor&lt;/code&gt; as composable function, Activity or Fragment.&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;our-video-editing-backstory&quot;&gt;Our Video Editing Backstory&lt;/h2&gt;
&lt;p&gt;Since we launched VideoEditor SDK almost ten years ago, we have seen an astounding range of creative and unique use cases of our SDK in customer projects. From Cameo connecting celebrities and their fans in new ways, over Multibrain supercharging their users marketing campaigns with editable video content, to &lt;a href=&quot;https://zigazoo.com/&quot;&gt;Zigazoo&lt;/a&gt; powering video content within their social network for kids while putting safety and parental control first.&lt;/p&gt;
&lt;p&gt;Since then, millions of users have experienced IMG.LY’s VideoEditor SDK through our customers’ products, shaping how they expect to interact with and modify videos. Continuous feedback from both our customers and their users has also influenced the way we approach video interface design, helping us refine and innovate along the way.&lt;/p&gt;
&lt;p&gt;Our goal was to combine the reliability and robustness of the VideoEditor SDK with true cross-platform compatibility and the flexibility to meet diverse needs. By applying the lessons we’ve learned, we aimed to deliver an exceptional video editing user experience straight out of the box. We described how those learnings shaped the &lt;a href=&quot;https://img.ly/blog/designing-a-timeline-for-mobile-video-editing/?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=androidvideo&quot;&gt;design of the mobile video editing interface.&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;key-capabilities&quot;&gt;Key Capabilities&lt;/h2&gt;
&lt;p&gt;With CE.SDK’s sleek timeline interface, your Android users can now take their video editing from simple transforms and adjustments to complex composition and multi-track editing:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Timeline-Based Editing&lt;/strong&gt;&lt;br&gt;
Split, trim, arrange video and audio tracks. Position elements such as images and stickers on the timeline and control their duration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Multi-Track Editing&lt;/strong&gt;&lt;br&gt;
Work with multiple video and audio tracks, allowing for complex composition.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Transform &amp;#x26; Enhance&lt;/strong&gt;&lt;br&gt;
Crop, flip, rotate, and use presets for common video formats. Add filters, effects, blur and essential adjustments.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Customizable Templates&lt;/strong&gt;&lt;br&gt;
Create and import templates using our web video editor, to jumpstart your users’ video composition and designs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Asset Integration&lt;/strong&gt;&lt;br&gt;
Integrate your own asset libraries for audio tracks, sound effects, images, and more.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cross-platform Interoperability&lt;/strong&gt;&lt;br&gt;
CE.SDK’s video capabilities extends across iOS, Android and the Web, enabling cross-platform applications to offer seamless video editing capabilities. Users can edit and save work in progress and pick up on any device.&lt;/p&gt;
&lt;p&gt;Check out the &lt;a href=&quot;https://img.ly/showcases/cesdk/video-ui/android?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=androidvideo&quot;&gt;showcase app for an interactive demo&lt;/a&gt; of these features.&lt;/p&gt;
&lt;h2 id=&quot;customization&quot;&gt;Customization&lt;/h2&gt;
&lt;p&gt;The ability to tailor the video editor to your app’s particular use case has been a front and center concern in its development.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://img.ly/docs/cesdk/android/configuration-2c1c3d/&quot;&gt;&lt;strong&gt;UI Customization&lt;/strong&gt;&lt;/a&gt;: While theming is currently limited to &lt;code&gt;dark&lt;/code&gt; and &lt;code&gt;light&lt;/code&gt; model, future releases will introduce more flexible theming, allowing you to modify the look and feel of the editor to match your app’s branding. Furthermore, we expose &lt;strong&gt;callbacks&lt;/strong&gt; that make it possible to hook into editor events and &lt;strong&gt;overlays&lt;/strong&gt; for custom dialogues.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://img.ly/docs/cesdk/android/create-video-c41a08/&quot;&gt;&lt;strong&gt;Configure Video Presets&lt;/strong&gt;&lt;/a&gt;: You can configure the editor to create video presets based on your users’ needs. For instance, you may want to fix the video’s aspect ratio or optimize for certain resolutions, depending on the target platform.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://img.ly/docs/cesdk/android/use-templates/apply-template-35c73e/&quot;&gt;&lt;strong&gt;Video Templates&lt;/strong&gt;&lt;/a&gt;: With the CE.SDK video editor web UI, you can create an unlimited number of video templates, such as collages, text designs, and animations, providing your users with professional-quality starting points for their video designs.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://img.ly/docs/cesdk/android/import-media/asset-panel/customize-c9a4de/&quot;&gt;&lt;strong&gt;Assets&lt;/strong&gt;&lt;/a&gt;: Provide custom filters, fonts, and stickers to enhance the user experience. For niche apps, this can be an excellent way to engage users by offering content that feels unique to your community.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;ideal-for-social-media-ecommerce-and-marketing-tech-apps&quot;&gt;Ideal for Social Media, Ecommerce, and Marketing Tech Apps&lt;/h2&gt;
&lt;p&gt;CE.SDK’s new Android video editing capabilities are perfect for a variety of use cases, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://img.ly/use-cases/story-reels-short-video-creation&quot;&gt;&lt;strong&gt;Social Media Applications&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;:&lt;/strong&gt; The CE.SDK video editor for Android excels at short-form video, ideal for social media applications, whether your users are publishing to other networks or you run a network yourself.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://img.ly/industries/e-commerce&quot;&gt;&lt;strong&gt;Ecommerce&lt;/strong&gt;&lt;/a&gt;: Allow your users to create engaging product showcases, ads, and promotional videos, testimonials or reviews.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://img.ly/industries/marketing-tech&quot;&gt;&lt;strong&gt;Marketing Tech Platforms&lt;/strong&gt;&lt;/a&gt;: Users can leverage our versatile templating to easily create polished social media and marketing graphics from within your app.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;whats-next&quot;&gt;What’s Next?&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;Camera UI: Record videos on Android.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1480px) 1480px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1480&quot; height=&quot;988&quot; src=&quot;https://img.ly/_astro/camera-UI-Android-1_1FyMRS.webp&quot; srcset=&quot;/_astro/camera-UI-Android-1_ZjEi38.webp 640w, /_astro/camera-UI-Android-1_Z743FA.webp 750w, /_astro/camera-UI-Android-1_ZYwhh4.webp 828w, /_astro/camera-UI-Android-1_8a3zG.webp 1080w, /_astro/camera-UI-Android-1_19mjIs.webp 1280w, /_astro/camera-UI-Android-1_1FyMRS.webp 1480w&quot;&gt;&lt;/p&gt;
&lt;p&gt;This Android release is just the beginning! We are about to launch a &lt;strong&gt;Camera UI&lt;/strong&gt; for Android and are working on more advanced template creation features. So stay tuned.&lt;br&gt;
To see some of these features in action, check out our iOS demo, where the next phase of innovation is unfolding.&lt;/p&gt;
&lt;h2 id=&quot;get-started&quot;&gt;Get Started&lt;/h2&gt;
&lt;p&gt;Explore our &lt;a href=&quot;https://img.ly/showcases/cesdk/video-ui/android?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=androidvideo&quot;&gt;Video UI Showcase&lt;/a&gt; and &lt;a href=&quot;https://img.ly/docs/cesdk/android/prebuilt-solutions/video-editor-9e533a/&quot;&gt;Documentation for Android&lt;/a&gt; to discover how CE.SDK can streamline your content creation projects and make Android video editing easier than ever.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Over 3,000 creative professionals gain early access to new features and updates—don’t miss out, and&lt;/strong&gt; &lt;a href=&quot;https://share.hsforms.com/1IgAOV1wASXGPnFG4ZPLejg1hk3i&quot;&gt;&lt;strong&gt;subscribe&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;to our newsletter.&lt;/strong&gt;&lt;/p&gt;</content:encoded><dc:creator>Jan</dc:creator><media:content url="https://blog.img.ly/2024/10/android-video-editor-sdk-imgly-creative-editor_s.jpg" medium="image"/><category>Android</category><category>Android App Development</category><category>Creative Editor</category><category>Video Editing</category><category>Video Editor</category></item><item><title>A Modern Video Editor SDK for your Flutter App</title><link>https://img.ly/blog/a-modern-video-editor-sdk-for-your-flutter-app/</link><guid isPermaLink="true">https://img.ly/blog/a-modern-video-editor-sdk-for-your-flutter-app/</guid><description>Learn how to integrate IMG.LY&apos;s video editor for Flutter into your app and how to best leverage its capabilities.</description><pubDate>Fri, 13 Sep 2024 11:26:15 GMT</pubDate><content:encoded>&lt;p&gt;Video has been the only type of content with steadily growing demand, and it will remain a staple and an expected medium for users to create and consume.&lt;/p&gt;
&lt;p&gt;With platforms such as TikTok, Instagram Reels, and YouTube Shorts dominating and shaping user habits, the ability to create and edit videos directly within your app can significantly increase engagement.&lt;/p&gt;
&lt;p&gt;In this post, we’ll show how to integrate a video editor into a Flutter app using CreativeEditor SDK and customize it for specific use cases, like creating TikTok-style short videos.&lt;/p&gt;
&lt;p&gt;You can check out the code for the default and custom &lt;a href=&quot;https://github.com/imgly/cesdk-flutter-examples/tree/main/showcases/lib/data/code_examples/video&quot;&gt;Flutter video editor on GitHub&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;why-add-a-video-editor-to-your-flutter-app&quot;&gt;Why add a Video Editor to Your Flutter App?&lt;/h3&gt;
&lt;p&gt;The last decade has made one thing clear: video content is king. Particularly, short-form dominates digital content. At the forefront of this trend are apps like TikTok, which made people more comfortable creating, editing, and sharing bite-sized clips.&lt;/p&gt;
&lt;p&gt;These apps have capitalized on their ability to let users apply filters, and add audio overlays, text, and more, empowering users at all skill levels to make professional-looking videos with minimal effort.&lt;/p&gt;
&lt;p&gt;A host of different use cases stand to profit from this trend by enhancing their user experience with video editing features, particularly marketing tech tooling and apps with a messaging or social media component.&lt;/p&gt;
&lt;p&gt;In general, video creation lowers the threshold for user-generated content and can positively impact distribution and product engagement.&lt;/p&gt;
&lt;p&gt;Flutter, Google’s UI toolkit for building apps across platforms from a single code base, is a perfect fit for &lt;a href=&quot;https://IMG.LY&quot;&gt;IMG.LY&lt;/a&gt;’s Video Editor. What often motivates the choice to use Flutter is that It ensures performance, flexibility, and a seamless user experience on iOS and Android devices. Similarly, our SDK is designed to offer a native cross-platform experience, while relying on the same underlying graphics processing engine, ensuring consistency and interoperability.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;getting-started-integrating-the-video-editor-in-flutter&quot;&gt;Getting Started: Integrating the Video Editor in Flutter&lt;/h3&gt;
&lt;p&gt;Let’s dive into how to set up a video editor in your Flutter app using CreativeEditor SDK.&lt;/p&gt;
&lt;h3 id=&quot;requirements&quot;&gt;Requirements&lt;/h3&gt;
&lt;p&gt;Before we get into the details, here’s what you’ll need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Flutter 3.16.0+&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dart 2.12.0+&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;iOS 16 or later&lt;/strong&gt; (as the video editor is currently only available for iOS, Android coming soon)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Swift 5.10 and Xcode 15.4&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;First, ensure your &lt;code&gt;pubspec.yml&lt;/code&gt; file includes the necessary dependencies:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;dependencies&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  flutter&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    sdk&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;flutter&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  imgly_editor&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1.34.0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once your environment is set up, you’re ready to start coding.&lt;/p&gt;
&lt;h3 id=&quot;setting-up-the-editor&quot;&gt;Setting Up the Editor&lt;/h3&gt;
&lt;p&gt;After adding the &lt;code&gt;imgly_editor&lt;/code&gt; dependency, import the package in your code:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;dart&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &quot;package:imgly_editor/imgly_editor.dart&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The next step is to initialize the editor by providing an instance of &lt;code&gt;EditorSettings&lt;/code&gt;. This setup requires a license key, which you can obtain from CreativeEditor SDK, and an optional &lt;code&gt;userId&lt;/code&gt; that helps track monthly active users (MAUs) across different devices.&lt;/p&gt;
&lt;p&gt;Here’s a basic example of how to open the video editor:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;dart&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; VideoEditorSolution&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  /// Opens the editor.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  void&lt;/span&gt;&lt;span&gt; openEditor&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    final&lt;/span&gt;&lt;span&gt; settings &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; EditorSettings&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        license&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;YOUR_LICENSE&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        userId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;YOUR_USER_ID&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    const&lt;/span&gt;&lt;span&gt; preset &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; EditorPreset&lt;/span&gt;&lt;span&gt;.video;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		/// Open the editor and retrieve the editing result.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    final&lt;/span&gt;&lt;span&gt; result &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; await&lt;/span&gt;&lt;span&gt; IMGLYEditor&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;openEditor&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        preset&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; preset,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        settings&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; settings&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This launches the editor with the video preset, enabling users to trim, cut, and add filters, text overlays, music, and more to their videos.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 814px) 814px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;814&quot; height=&quot;836&quot; src=&quot;https://img.ly/_astro/flutter-video-editor_Z1vXnTi.webp&quot; srcset=&quot;/_astro/flutter-video-editor_mCglm.webp 640w, /_astro/flutter-video-editor_bQizb.webp 750w, /_astro/flutter-video-editor_Z1vXnTi.webp 814w&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;use-cases-building-a-tiktok-like-experience&quot;&gt;Use Cases: Building a TikTok-Like Experience&lt;/h3&gt;
&lt;p&gt;Now that we have integrated the basic editor configuration into your Flutter app, let’s revisit some prominent use cases and how to configure the editor to support them.&lt;/p&gt;
&lt;h3 id=&quot;short-form-video-creation&quot;&gt;Short-Form Video Creation&lt;/h3&gt;
&lt;p&gt;For a short-form video, TikTok-like user experience, the most important factor is the ease of use of any video editor and content such as stickers or audio overlays.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The following SDK capabilities can help you achieve that goal:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Control Video Duration and Position in Time&lt;/strong&gt;: Users should be able to trim video clips on a timeline and position them relative to other tracks, such as audio clips.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Filters &amp;#x26; Effects&lt;/strong&gt;: Filters are essential for setting the tone of the video. Whether users want a retro, high contrast, or soft pastel look, filters provide creative control over the visual style.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Text &amp;#x26; Stickers&lt;/strong&gt;: Allow users to add text captions—especially important for content often watched on mute. Stickers and emojis can add a playful element to videos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Music &amp;#x26; Audio&lt;/strong&gt;: Like TikTok, you can allow users to add background music or sound effects. Providing a library of popular tracks or sound snippets can enhance the content creation experience.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Video Templates&lt;/strong&gt;: Give your users a head start with customizable video templates for different themes, topics, and occasions. &lt;a href=&quot;https://IMG.LY&quot;&gt;IMG.LY&lt;/a&gt;’s CE.SDK comes with a web video editor to help build and deliver these templates to your Flutter app. You can explore a range of different templates in our &lt;a href=&quot;https://img.ly/showcases/cesdk/video-ui/web?template=month-in-review&quot;&gt;video editor demo&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By integrating these features, you’ll empower users to create engaging, shareable content, elevating your app’s video creation experience to the level of consumer-grade social media apps.&lt;/p&gt;
&lt;h3 id=&quot;influencers-and-marketing&quot;&gt;Influencers and Marketing&lt;/h3&gt;
&lt;p&gt;If your app is targeting influencers or businesses, the ability to quickly create branded video content is key. You can offer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Branded Templates&lt;/strong&gt;: Pre-made templates that align with a brand’s style, allowing users to easily drop in their video footage and text while maintaining brand consistency. Again, check out the web editor demo to see how to build &lt;a href=&quot;https://img.ly/showcases/cesdk/video-ui/web?template=month-in-review&quot;&gt;video templates&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Watermarks&lt;/strong&gt;: Adding a watermark or logo as a brand signifier to videos can help with brand visibility and make sure content always points back to the creator.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This setup allows influencers and brands to create professional-looking videos that they can share across social media platforms with ease.&lt;/p&gt;
&lt;h3 id=&quot;ecommerce-and-user-generated-content&quot;&gt;eCommerce and User-Generated Content&lt;/h3&gt;
&lt;p&gt;Video is a powerful medium to showcase products, especially on marketplaces that can leverage user-generated content and enable vendors as well as customers to create product or review videos.&lt;/p&gt;
&lt;p&gt;For example, users could create unboxing videos, product reviews, or tutorials using the same trimming, filter, and music tools offered in a TikTok-style editor. These videos can then be shared on social media or used within the app to enhance the shopping experience.&lt;/p&gt;
&lt;p&gt;Likewise, showcasing products using authentic demo videos tap into familiar patterns of video consumption and can boost sales for vendors.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;customization-options-with-creativeeditor-sdk&quot;&gt;Customization Options with CreativeEditor SDK&lt;/h3&gt;
&lt;p&gt;We have designed the Flutter plugin to be adaptable to match your brand and use case-specific requirements. Soon the plugin will also support more advanced customization options such as the ability to &lt;strong&gt;activate or deactivate features by default.&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;UI Customization&lt;/strong&gt;: Modify the look and feel of the editor to match your app’s branding. We provide options for &lt;strong&gt;theming&lt;/strong&gt;, &lt;strong&gt;styling color palettes&lt;/strong&gt;, and &lt;strong&gt;callbacks&lt;/strong&gt; to hook into editor events.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Video Presets&lt;/strong&gt;: You can create custom video presets based on your users’ needs. For instance, you may want to limit video length or optimize for certain resolutions, depending on the target platform.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Video Templates&lt;/strong&gt;: You can use the CE.SDK web UI to generate any number of video templates including collages, text designs, and animations to give your users professional-looking starting points for their video designs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Assets&lt;/strong&gt;: Provide custom filters, fonts, and stickers to enhance the user experience. For niche apps, this can be an excellent way to engage users by offering content that feels unique to your community.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Integrating a video editor into your Flutter app will improve your UX, and help boost engagement, retention, and potential distribution of your product, whether you’re building a social media platform, an influencer tool, or an e-commerce app. With CreativeEditor SDK, you can create a TikTok-like video editing experience or offer specialized tools for businesses and creators.&lt;/p&gt;
&lt;p&gt;By following the steps outlined in this post, you can bring professional-level video editing features to your users. Explore CE.SDK’s video capabilities and &lt;a href=&quot;https://img.ly/docs/cesdk/flutter/prebuilt-solutions/video-editor-9e533a/&quot;&gt;dive into the docs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Stay tuned for more updates, and please &lt;a href=&quot;https://img.ly/forms/contact-sales?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=plugins1&quot;&gt;reach out&lt;/a&gt; if you have any questions. Thank you for reading.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Over 3,000 creative professionals gain early access to our new features, demos, and updates—don’t miss out, and&lt;/strong&gt; &lt;a href=&quot;https://share.hsforms.com/1IgAOV1wASXGPnFG4ZPLejg1hk3i&quot;&gt;&lt;strong&gt;subscribe&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;to our newsletter.&lt;/strong&gt;&lt;/p&gt;</content:encoded><dc:creator>Jan</dc:creator><media:content url="https://blog.img.ly/2024/09/how-to-flutter-photo-video-design-editor-sdk.png" medium="image"/><category>Video Editing</category><category>Flutter</category><category>Tutorial</category><category>Learning</category></item></channel></rss>