<?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>Vue.js – IMG.LY Blog</title><description>Posts tagged Vue.js on the IMG.LY blog.</description><link>https://img.ly/blog/tag/vue-js/</link><language>en-us</language><image><url>https://img.ly/apple-touch-icon.png</url><title>Vue.js – IMG.LY Blog</title><link>https://img.ly/blog/tag/vue-js/</link></image><atom:link href="https://img.ly/blog/tag/vue-js/rss.xml" rel="self" type="application/rss+xml"/><generator>Astro</generator><lastBuildDate>Wed, 02 Sep 2026 09:38:41 GMT</lastBuildDate><ttl>60</ttl><item><title>CE.SDK v1.59 Release Notes</title><link>https://img.ly/blog/creative-editor-sdk-v-1-59-0-release-notes/</link><guid isPermaLink="true">https://img.ly/blog/creative-editor-sdk-v-1-59-0-release-notes/</guid><description>This release brings full editors to React &amp; Vue in minutes, WebM support, and sharper image handling.</description><pubDate>Thu, 11 Sep 2025 11:09:03 GMT</pubDate><content:encoded>&lt;p&gt;This release makes building with CE.SDK smoother than ever: embed editors in minutes with React &amp;#x26; Vue wrappers, get WebM video support, and enjoy sharper visuals with improved image scaling.&lt;/p&gt;
&lt;h1 id=&quot;work-with-webm-video-files&quot;&gt;Work with WebM Video Files&lt;/h1&gt;
&lt;p&gt;&lt;img alt=&quot;&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;643&quot; src=&quot;https://img.ly/_astro/webM-support_ZLO05i.webp&quot; srcset=&quot;/_astro/webM-support_imXTn.webp 640w, /_astro/webM-support_Zxqmmw.webp 750w, /_astro/webM-support_ZE9HMd.webp 828w, /_astro/webM-support_mqEzD.webp 1080w, /_astro/webM-support_2koT9D.webp 1280w, /_astro/webM-support_ZLO05i.webp 1480w&quot;&gt;&lt;/p&gt;
&lt;p&gt;CE.SDK for Web and our Engine now support WebM videos. Supported codecs include VP8, VP9, and AV1. This allows you to handle more video formats efficiently, deliver faster-loading videos, and ensure smooth playback across browsers and platforms.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;→&lt;/em&gt; Explore all &lt;a href=&quot;https://img.ly/docs/cesdk/js/conversion/overview-44dc58/#supported-input-and-output-formats&quot;&gt;supported formats&lt;/a&gt; in our documentation.&lt;/p&gt;
&lt;h1 id=&quot;add-a-full-featured-editor-to-react-or-vue-in-minutes&quot;&gt;Add a Full-Featured Editor to React or Vue in Minutes&lt;/h1&gt;
&lt;p&gt;&lt;img alt=&quot;&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;643&quot; src=&quot;https://img.ly/_astro/1-59_wrappers_rfhRu.webp&quot; srcset=&quot;/_astro/1-59_wrappers_pKQIw.webp 640w, /_astro/1-59_wrappers_Z2v7jjD.webp 750w, /_astro/1-59_wrappers_UPXH8.webp 828w, /_astro/1-59_wrappers_ZthrrM.webp 1080w, /_astro/1-59_wrappers_2w4YBO.webp 1280w, /_astro/1-59_wrappers_rfhRu.webp 1480w&quot;&gt;&lt;/p&gt;
&lt;p&gt;CE.SDK now ships React and Vue wrappers directly in the &lt;code&gt;@cesdk/cesdk-js&lt;/code&gt; package. Just install, import, and skip lengthy setups.&lt;/p&gt;
&lt;p&gt;Get prebuilt editors and smart features out of the box. This frees your team to ship faster and focus on what makes your app unique in the market.&lt;/p&gt;
&lt;p&gt;&lt;video src=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/1-59/pre-built.mp4&quot; controls autoplay muted loop playsinline&gt;&lt;/video&gt;&lt;/p&gt;
&lt;p&gt;Browse pre-built solutions for &lt;a href=&quot;https://img.ly/docs/cesdk/react/prebuilt-solutions-d0ed07/?ref=img.ly&quot;&gt;React&lt;/a&gt; and &lt;a href=&quot;https://img.ly/docs/cesdk/vue/prebuilt-solutions-d0ed07/?ref=img.ly&quot;&gt;Vue&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;what-you-get-out-of-the-box&quot;&gt;What You Get Out of The Box&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;All-in-one integration&lt;/strong&gt;&lt;br&gt;
With wrappers included, installation is cleaner and simplified. Simply install and import the necessary components.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Prebuilt Editor Solutions&lt;/strong&gt;&lt;br&gt;
Our wrappers provide ready-to-use editor components. Perfect for rapid prototyping or embedding full-featured editing experiences.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rich Editing Features&lt;/strong&gt;&lt;br&gt;
Use built-in support for photo &amp;#x26; video editing (crop, filters, adjustments), smart AI tools, template creation, asset libraries. Customize the UI if needed.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;→&lt;/em&gt; &lt;a href=&quot;https://img.ly/docs/cesdk/react/get-started/overview-e18f40/&quot;&gt;Get started with React&lt;/a&gt;&lt;br&gt;
&lt;em&gt;→&lt;/em&gt; &lt;a href=&quot;https://img.ly/docs/cesdk/vue/get-started/overview-e18f40/&quot;&gt;Get started with Vue&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;improvements&quot;&gt;Improvements&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Keep Images Crisp Without Accidental Upscaling&lt;/strong&gt;&lt;br&gt;
When you add a bitmap image to your canvas, CE.SDK now ensures it isn’t placed larger than its original size. This prevents low-res images from being upscaled automatically and looking blurry, while still letting users enlarge them manually if they choose.&lt;/p&gt;
&lt;p&gt;Thanks for reading! Explore the complete &lt;a href=&quot;https://img.ly/docs/cesdk/changelog/v1-59-0/&quot;&gt;v1.59 Changelog&lt;/a&gt; (&lt;a href=&quot;https://img.ly/docs/cesdk/changelog/v1-59-1/&quot;&gt;1.59.1&lt;/a&gt;).&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;3,000+ creative professionals get 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>Neslihan</dc:creator><media:content url="https://blog.img.ly/2025/09/webm.jpg" medium="image"/><category>Release Notes</category><category>React</category><category>Vue.js</category><category>WebM</category><category>Design Editor</category></item><item><title>A Modern Vue.js Video Editor: Setup Guide</title><link>https://img.ly/blog/a-modern-vue-js-video-editor/</link><guid isPermaLink="true">https://img.ly/blog/a-modern-vue-js-video-editor/</guid><description>Learn how to integrate IMG.LY&apos;s video editor for Vue.js into your web app, from the first single-file component to timeline edits and MP4 export.</description><pubDate>Wed, 08 Jan 2025 11:24:43 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Discover how to integrate&lt;/em&gt; &lt;a href=&quot;https://img.ly/docs/cesdk/vue/starterkits/video-editor-e1nlor/&quot;&gt;&lt;em&gt;IMG.LY’s video editor&lt;/em&gt;&lt;/a&gt; &lt;em&gt;into your Vue.js application.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Users who trim and caption clips every day in TikTok or CapCut expect to do the same inside your product. When they cannot, they export, edit somewhere else, and upload again. That round trip is where people drop out of the workflow and where your assets stop being yours to template or version.&lt;/p&gt;
&lt;p&gt;This guide covers adding a video editor to a Vue.js app with CreativeEditor SDK (CE.SDK): the component, the timeline and export APIs underneath it, and the customization points that come up once it runs.&lt;/p&gt;
&lt;h2 id=&quot;check-browser-support-before-you-scope-the-work&quot;&gt;Check browser support before you scope the work&lt;/h2&gt;
&lt;p&gt;CE.SDK’s video mode encodes and decodes in the browser through the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/WebCodecs_API&quot;&gt;WebCodecs API&lt;/a&gt;. That is what makes client-side MP4 export possible without a render backend, and it is also the constraint. Video mode requires a recent Chromium browser: Chrome, Edge, Opera, Arc, and Brave all work. Safari and Firefox do not currently support video editing.&lt;/p&gt;
&lt;p&gt;Design and photo editing run everywhere, so this only limits the video path. If a large share of your traffic is on Safari, plan a fallback message now rather than during QA.&lt;/p&gt;
&lt;h2 id=&quot;why-put-the-editor-inside-the-app&quot;&gt;Why put the editor inside the app&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.youtube/inside-youtube/shorts-revenue-sharing-update/&quot;&gt;YouTube Shorts passes 70 billion daily views&lt;/a&gt; and TikTok reports &lt;a href=&quot;https://newsroom.tiktok.com/en-us/1-billion-people-on-tiktok&quot;&gt;more than a billion monthly active users&lt;/a&gt;. Those numbers matter here for one reason: they set the baseline for how easy people think video editing should be.&lt;/p&gt;
&lt;p&gt;Two things follow. Users expect filters, overlays, audio, and text within a few clicks, and they expect it where they already are. Vue’s single-file components suit this well, because the editor becomes one component you mount with a config object and an init hook.&lt;/p&gt;
&lt;h2 id=&quot;how-to-integrate-a-video-editor-in-vuejs&quot;&gt;How to integrate a video editor in Vue.js&lt;/h2&gt;
&lt;h3 id=&quot;requirements&quot;&gt;Requirements&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Node.js 20+ and npm 10+. &lt;a href=&quot;https://nodejs.org/download&quot;&gt;Download Node.js&lt;/a&gt; if needed.&lt;/li&gt;
&lt;li&gt;A Vue 3 project, typically scaffolded with &lt;a href=&quot;https://github.com/vuejs/create-vue&quot;&gt;create-vue&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;A CE.SDK license key. &lt;a href=&quot;https://img.ly/docs/cesdk/&quot;&gt;Start a free trial&lt;/a&gt; to get one.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you need a project, scaffold one and answer the prompts however you like. Selecting “No” throughout is fine for following along:&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; vue@latest&lt;/span&gt;&lt;span&gt; my-vue-video-editor&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; my-vue-video-editor&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;step-1-install-cesdk&quot;&gt;Step 1: Install CE.SDK&lt;/h3&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;h3 id=&quot;step-2-create-the-editor-component&quot;&gt;Step 2: Create the editor component&lt;/h3&gt;
&lt;p&gt;CE.SDK ships a Vue component, so you do not manage the editor instance or its teardown yourself. Import it from the &lt;code&gt;/vue&lt;/code&gt; entry point and give it a &lt;code&gt;config&lt;/code&gt; object and an &lt;code&gt;init&lt;/code&gt; function.&lt;/p&gt;
&lt;p&gt;Create &lt;code&gt;src/components/VideoEditor.vue&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;vue&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&amp;#x3C;!-- src/components/VideoEditor.vue --&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;template&lt;/span&gt;&lt;span&gt;&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;&quot;config&quot;&lt;/span&gt;&lt;span&gt; :init&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;init&quot;&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;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;template&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 class=&quot;line&quot;&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt; setup&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&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/vue&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: &lt;/span&gt;&lt;span&gt;&apos;YOUR_LICENSE_KEY&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;// replace with your key&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  userId: &lt;/span&gt;&lt;span&gt;&apos;YOUR_USER_ID&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;// optional, for MAU tracking across devices&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;  await&lt;/span&gt;&lt;span&gt; Promise&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;all&lt;/span&gt;&lt;span&gt;([&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&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;    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&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;createVideoScene&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;&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;&lt;code&gt;sceneMode: &apos;Video&apos;&lt;/code&gt; loads the video and audio demo libraries instead of the design ones, so the asset panel holds clips and music. In production you swap these for your own sources, whether that is your backend or a third-party library such as &lt;a href=&quot;https://img.ly/docs/cesdk/vue/import-media/from-remote-source/unsplash-8f31f0/&quot;&gt;Unsplash&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;createVideoScene()&lt;/code&gt; is what gives you the timeline. Calling &lt;code&gt;createDesignScene()&lt;/code&gt; instead produces the design editor with no time dimension, which is the usual reason a first integration loads without a timeline.&lt;/p&gt;
&lt;h3 id=&quot;step-3-use-the-component&quot;&gt;Step 3: Use the component&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;vue&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&amp;#x3C;!-- src/App.vue --&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;template&lt;/span&gt;&lt;span&gt;&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;VideoEditor&lt;/span&gt;&lt;span&gt; /&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;template&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 class=&quot;line&quot;&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt; setup&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; VideoEditor &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;./components/VideoEditor.vue&apos;&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;script&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Run &lt;code&gt;npm run dev&lt;/code&gt;. You should get a full editor with a timeline: trimming, splitting, text overlays, audio tracks, and filters.&lt;/p&gt;
&lt;p&gt;Name your wrapper something other than &lt;code&gt;CreativeEditor&lt;/code&gt;, or it will collide with the imported component.&lt;/p&gt;
&lt;h2 id=&quot;gotchas-worth-knowing-up-front&quot;&gt;Gotchas worth knowing up front&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;init&lt;/code&gt; fails silently.&lt;/strong&gt; If a line inside &lt;code&gt;init&lt;/code&gt; throws, the rest is skipped and nothing reaches the console. You get a half-built scene with no error. Wrap it while developing:&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; 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;  try&lt;/span&gt;&lt;span&gt; {&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;    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;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;[CE.SDK init] 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;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Relative asset URLs resolve against the CDN.&lt;/strong&gt; CE.SDK resolves relative URIs against &lt;code&gt;config.baseURL&lt;/code&gt;, which points at the IMG.LY CDN, so &lt;code&gt;/videos/intro.mp4&lt;/code&gt; will not hit your origin. Make local paths absolute before passing them to the engine.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Trim calls need loaded media.&lt;/strong&gt; &lt;code&gt;setTrimOffset&lt;/code&gt; and &lt;code&gt;setTrimLength&lt;/code&gt; depend on duration metadata. Call &lt;code&gt;await engine.block.forceLoadAVResource(fill)&lt;/code&gt; first or they quietly do nothing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nuxt needs a client-only boundary.&lt;/strong&gt; The editor is browser-only, so server-side rendering will break it. Wrap it in &lt;code&gt;&amp;#x3C;ClientOnly&gt;&lt;/code&gt; or use a &lt;code&gt;.client.vue&lt;/code&gt; component.&lt;/p&gt;
&lt;h2 id=&quot;let-an-agent-do-the-integration&quot;&gt;Let an agent do the integration&lt;/h2&gt;
&lt;p&gt;If you work in an AI-assisted editor, &lt;a href=&quot;https://img.ly/docs/cesdk/vue/get-started/agent-skills-f7g8h9/&quot;&gt;Agent Skills for CE.SDK&lt;/a&gt; load the current documentation and conventions into Claude Code, Cursor, and similar tools, so the generated integration matches the current API rather than a remembered one. There is also an &lt;a href=&quot;https://img.ly/docs/cesdk/vue/get-started/mcp-server-fde71c/&quot;&gt;MCP server&lt;/a&gt; for live doc lookup during a session. We wrote about the reasoning in &lt;a href=&quot;https://img.ly/blog/img-ly-agent-skills-web/&quot;&gt;Introducing IMG.LY Agent Skills&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;building-compositions-in-code&quot;&gt;Building compositions in code&lt;/h2&gt;
&lt;p&gt;The default UI handles user-facing editing. For templates, automation, or a custom interface, work through &lt;code&gt;cesdk.engine&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;create-a-scene-and-a-page&quot;&gt;Create a scene and a page&lt;/h3&gt;
&lt;p&gt;In video mode a page owns a timeline, and its duration is the duration of the export.&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; 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;
&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;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;engine.block.&lt;/span&gt;&lt;span&gt;setWidth&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;engine.block.&lt;/span&gt;&lt;span&gt;setHeight&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;setDuration&lt;/span&gt;&lt;span&gt;(page, &lt;/span&gt;&lt;span&gt;20&lt;/span&gt;&lt;span&gt;); &lt;/span&gt;&lt;span&gt;// seconds&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;add-clips&quot;&gt;Add clips&lt;/h3&gt;
&lt;p&gt;Video is not a block type of its own. You create a &lt;code&gt;graphic&lt;/code&gt; block and attach a video fill, so the same positioning and animation APIs apply to video as to anything else.&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; clip&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;(clip, 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;const&lt;/span&gt;&lt;span&gt; fill&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;  fill,&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/v3/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;(clip, fill);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;sequence-with-a-track&quot;&gt;Sequence with a track&lt;/h3&gt;
&lt;p&gt;A &lt;code&gt;track&lt;/code&gt; keeps its children playing back to back and recalculates offsets when a duration changes, so you do not position clips by hand.&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; 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, clip1);&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, clip2);&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;span class=&quot;line&quot;&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;(clip1, &lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt;); &lt;/span&gt;&lt;span&gt;// track shifts clip2 automatically&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Size the children, not the track. A track derives its dimensions from what it contains.&lt;/p&gt;
&lt;h3 id=&quot;trim-and-audio&quot;&gt;Trim and audio&lt;/h3&gt;
&lt;p&gt;Blocks default to 5 seconds. A longer clip gets cut off, a shorter one loops.&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;await&lt;/span&gt;&lt;span&gt; engine.block.&lt;/span&gt;&lt;span&gt;forceLoadAVResource&lt;/span&gt;&lt;span&gt;(fill);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.&lt;/span&gt;&lt;span&gt;setTrimOffset&lt;/span&gt;&lt;span&gt;(fill, &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;); &lt;/span&gt;&lt;span&gt;// skip the first second&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;engine.block.&lt;/span&gt;&lt;span&gt;setTrimLength&lt;/span&gt;&lt;span&gt;(fill, &lt;/span&gt;&lt;span&gt;10&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;setMuted&lt;/span&gt;&lt;span&gt;(fill, &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 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/v3/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;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.7&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;setTimeOffset&lt;/span&gt;&lt;span&gt;(audio, &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;export-to-mp4&quot;&gt;Export to MP4&lt;/h3&gt;
&lt;p&gt;Encoding runs in a background worker, so the editor stays usable. The scene freezes when the export starts, so later edits will not show up in the file.&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; page&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; engine.scene.&lt;/span&gt;&lt;span&gt;getCurrentPage&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; 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;  onProgress&lt;/span&gt;&lt;span&gt;: (&lt;/span&gt;&lt;span&gt;rendered&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;encoded&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;total&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;    progress.value &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; Math.&lt;/span&gt;&lt;span&gt;round&lt;/span&gt;&lt;span&gt;((encoded &lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt; total) &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 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;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;export.mp4&apos;&lt;/span&gt;&lt;span&gt;;&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;Bind &lt;code&gt;onProgress&lt;/code&gt; to a ref and you have a progress bar. Long compositions take a while to encode, and silence reads as a hang.&lt;/p&gt;
&lt;p&gt;You can also extract just the audio with &lt;code&gt;engine.block.exportAudio(page, { mimeType: &apos;audio/wav&apos; })&lt;/code&gt;, which is handy for transcription and caption pipelines. Speaking of which, &lt;a href=&quot;https://img.ly/docs/cesdk/vue/create-video/update-caption-presets-e9c385/&quot;&gt;caption presets&lt;/a&gt; and &lt;a href=&quot;https://img.ly/docs/cesdk/vue/create-video/apply-transitions-146026/&quot;&gt;transitions between clips&lt;/a&gt; are both worth a look once the basics work.&lt;/p&gt;
&lt;p&gt;Full reference: the &lt;a href=&quot;https://img.ly/docs/cesdk/vue/create-video/overview-b06512/&quot;&gt;create and edit videos guide&lt;/a&gt; and the &lt;a href=&quot;https://img.ly/docs/cesdk/vue/create-video/timeline-editor-912252/&quot;&gt;timeline editor docs&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;customizing-the-editor&quot;&gt;Customizing the editor&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Component order.&lt;/strong&gt; Add, remove, and reorder UI elements with &lt;code&gt;setComponentOrder({ in: location }, order)&lt;/code&gt; across locations like &lt;code&gt;&apos;ly.img.dock&apos;&lt;/code&gt;, &lt;code&gt;&apos;ly.img.canvas.menu&apos;&lt;/code&gt;, and &lt;code&gt;&apos;ly.img.inspector.bar&apos;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Theming.&lt;/strong&gt; &lt;code&gt;cesdk.ui.setTheme()&lt;/code&gt; for light, dark, or system, or build one with the &lt;a href=&quot;https://img.ly/docs/cesdk/vue/user-interface/appearance/theming-4b0938/&quot;&gt;theme generator&lt;/a&gt;. See the &lt;a href=&quot;https://img.ly/demos/theming/web/&quot;&gt;theming demo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Asset libraries.&lt;/strong&gt; Serve media from your own backend or connect third-party sources. Users can browse and search both from inside the editor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Feature API.&lt;/strong&gt; Show and hide functionality by context, which is how you reflect backend permissions in the UI.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Localization.&lt;/strong&gt; Override and extend every string with &lt;a href=&quot;https://img.ly/docs/cesdk/vue/user-interface/localization-508e20/&quot;&gt;full i18n support&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Reusable customizations belong in a &lt;a href=&quot;https://img.ly/docs/cesdk/vue/user-interface/ui-extensions-d194d1/&quot;&gt;plugin&lt;/a&gt;. Background removal and vectorization ship that way.&lt;/p&gt;
&lt;h2 id=&quot;where-a-vue-video-editor-pays-off&quot;&gt;Where a Vue video editor pays off&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Marketing automation.&lt;/strong&gt; Generate campaign variants from one template with &lt;a href=&quot;https://img.ly/docs/cesdk/vue/create-templates/add-dynamic-content/text-variables-7ecb50/&quot;&gt;text variables&lt;/a&gt;, and push template edits across every asset built on it. Bulk import of PSD files turns existing design work into editable scenes. This is mostly an engine job rather than a UI one.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;E-learning.&lt;/strong&gt; Instructors record, trim, and caption in the browser and build a template library instead of one-off files. &lt;a href=&quot;https://img.ly/docs/cesdk/vue/user-interface/ui-extensions-d194d1/&quot;&gt;Plugins&lt;/a&gt; can add quizzes and polls.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sales outreach.&lt;/strong&gt; Personalized video at volume, with &lt;a href=&quot;https://img.ly/demos/language/web/&quot;&gt;localization&lt;/a&gt; for teams selling into several markets.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Social publishing.&lt;/strong&gt; Templates, an audio library, and &lt;a href=&quot;https://img.ly/docs/cesdk/vue/animation/overview-6a2ef2/&quot;&gt;configurable animations&lt;/a&gt;, then export per platform aspect ratio.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Digital asset management.&lt;/strong&gt; Teams adapt approved footage centrally. CE.SDK has no built-in role model, so permissions live in your backend and surface through the Feature API.&lt;/p&gt;
&lt;h2 id=&quot;next-steps&quot;&gt;Next steps&lt;/h2&gt;
&lt;p&gt;Start from the &lt;a href=&quot;https://img.ly/docs/cesdk/vue/starterkits/video-editor-e1nlor/&quot;&gt;Vue video editor starter kit&lt;/a&gt;, which is a working project rather than a snippet, or try the &lt;a href=&quot;https://img.ly/demos/video-ui/web/&quot;&gt;demo&lt;/a&gt; first.&lt;/p&gt;
&lt;p&gt;On a different framework? We have the same guide for &lt;a href=&quot;https://img.ly/blog/a-modern-react-video-editor/&quot;&gt;React&lt;/a&gt; and &lt;a href=&quot;https://img.ly/blog/a-modern-angular-video-editor/&quot;&gt;Angular&lt;/a&gt;, plus a broader &lt;a href=&quot;https://img.ly/blog/javascript-video-editing-guide/&quot;&gt;JavaScript video editing guide&lt;/a&gt; on the underlying browser tech. Still comparing vendors? See our breakdown of the &lt;a href=&quot;https://img.ly/blog/top-7-video-editing-sdks-in-2025/&quot;&gt;leading video editing SDKs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Questions about your use case? &lt;a href=&quot;https://img.ly/forms/contact-sales/&quot;&gt;Talk to us&lt;/a&gt;.&lt;/p&gt;</content:encoded><dc:creator>Antonello</dc:creator><media:content url="https://blog.img.ly/2025/01/video-editor-vue_js.jpg" medium="image"/><category>Vue.js</category><category>Video Editor</category><category>Video Editing</category><category>How-To</category></item></channel></rss>