<?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>Design Editor – IMG.LY Blog</title><description>Posts tagged Design Editor on the IMG.LY blog.</description><link>https://img.ly/blog/tag/design-editor/</link><language>en-us</language><image><url>https://img.ly/apple-touch-icon.png</url><title>Design Editor – IMG.LY Blog</title><link>https://img.ly/blog/tag/design-editor/</link></image><atom:link href="https://img.ly/blog/tag/design-editor/rss.xml" rel="self" type="application/rss+xml"/><generator>Astro</generator><lastBuildDate>Fri, 12 Jun 2026 10:11:03 GMT</lastBuildDate><ttl>60</ttl><item><title>Open-Source Design Editor SDKs: A Developer&apos;s Guide to Choosing the Right Solution</title><link>https://img.ly/blog/open-source-design-editor-sdks-a-developers-guide-to-choosing-the-right-solution/</link><guid isPermaLink="true">https://img.ly/blog/open-source-design-editor-sdks-a-developers-guide-to-choosing-the-right-solution/</guid><description>Most open-source libraries offer canvas, SVG, or rendering tools - but none provide a full, production-ready design editor. This guide explains what these libraries actually deliver, the pros, cons, and how IMG.LY CE.SDK compares.</description><pubDate>Tue, 25 Nov 2025 08:56:18 GMT</pubDate><content:encoded>&lt;p&gt;If you’re implementing design or editing capabilities, you’ve probably wondered whether to use an open-source library or go with a commercial SDK. It’s a fair question—especially when there are established libraries like Fabric.js and Konva.js that offer powerful canvas manipulation tools without licensing costs.&lt;/p&gt;
&lt;p&gt;Here’s the reality: &lt;strong&gt;there’s no single open-source SDK that delivers a complete, production-ready design editor out of the box.&lt;/strong&gt; Instead, developers typically piece together solutions from canvas libraries, rendering engines, and SVG tools—each requiring custom UI development, editor logic, and ongoing maintenance.&lt;/p&gt;
&lt;p&gt;In this guide, we’ll walk through the most popular open-source options for building design editors, organized by what they actually do: canvas manipulation, high-performance rendering, or SVG control. We’ll cover what each library excels at, where you’ll hit roadblocks, and how much development effort you’re really signing up for. Then we’ll show how IMG.LY CE.SDK approaches the same challenges with a different philosophy: providing a complete, enterprise-ready editor that works across platforms from day one.&lt;/p&gt;
&lt;h2 id=&quot;the-open-source-landscape-what-youre-actually-choosing&quot;&gt;The Open-Source Landscape: What You’re Actually Choosing&lt;/h2&gt;
&lt;p&gt;When you choose an open-source approach to building a design editor, you’re typically selecting from three categories of tools. Each solves part of the puzzle, but none deliver a complete editor experience without significant custom development.&lt;/p&gt;
&lt;h3 id=&quot;1-canvas-and-drawing-libraries&quot;&gt;1. Canvas and Drawing Libraries&lt;/h3&gt;
&lt;p&gt;These libraries handle core canvas drawing and object manipulation—layers, transformations, text, images—but they don’t include prebuilt editor UI or workflows. Think of them as powerful toolkits that give you the building blocks, but you’re responsible for assembling the actual editor experience.&lt;/p&gt;
&lt;h3 id=&quot;2-rendering-engines&quot;&gt;2. Rendering Engines&lt;/h3&gt;
&lt;p&gt;Optimized for high-performance graphics and WebGL-powered rendering, these engines excel at drawing complex scenes quickly. However, they’re focused purely on rendering—no editing workflows, no UI components, no editor logic. Great for graphics-heavy applications, but you’ll need to build everything else yourself.&lt;/p&gt;
&lt;h3 id=&quot;3-svg-manipulation-libraries&quot;&gt;3. SVG Manipulation Libraries&lt;/h3&gt;
&lt;p&gt;Lightweight tools for creating, transforming, and animating SVG elements with precision. Perfect for SVG-based graphics projects, but like the others, they require you to build the editor UI and interaction logic from scratch.&lt;/p&gt;
&lt;p&gt;Let’s dive into each category and see what these tools actually offer.&lt;/p&gt;
&lt;h2 id=&quot;canvas-and-drawing-libraries-flexible-foundations-without-the-editor-ui&quot;&gt;Canvas and Drawing Libraries: Flexible Foundations Without the Editor UI&lt;/h2&gt;
&lt;p&gt;Canvas libraries provide rich object manipulation capabilities—layers, transformations, events, custom controls—but they stop short of delivering ready-made editor interfaces. You get the power and flexibility to build exactly what you want, but you’re taking on the responsibility of creating polished, user-friendly editing experiences.&lt;/p&gt;
&lt;h3 id=&quot;fabricjs&quot;&gt;Fabric.js&lt;/h3&gt;
&lt;p&gt;Fabric.js is one of the most popular HTML5 canvas libraries for interactive object editing. It’s been around for years and has a large community, extensive documentation, and plenty of examples showing how to manipulate canvas objects programmatically.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Features &amp;#x26; Capabilities:&lt;/strong&gt;&lt;br&gt;
Fabric.js gives you layers, object manipulation (resize, rotate, drag), text rendering, image handling, custom controls, and event systems. It’s feature-rich and handles most of what you’d need at the object level for a design editor.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Platforms:&lt;/strong&gt;&lt;br&gt;
Web only—Fabric.js runs on the HTML5 Canvas API, so it’s browser-based.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Difficulty Building a Full Editor:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Medium&lt;/strong&gt;. Fabric.js provides the canvas toolkit, but building a polished, production-ready editor means developing the entire UI layer: toolbars, property panels, layer management, undo/redo, export controls, and more. You’ll also need to handle performance optimizations for complex designs and manage state across the editor experience.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Potential Roadblocks:&lt;/strong&gt;&lt;br&gt;
No ready-made editor UI means substantial frontend development work. Scaling can become an issue with very large or complex designs—you’ll need to implement custom optimizations. Managing collaborative editing, version control, or template systems requires building those features from scratch.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use Cases:&lt;/strong&gt;&lt;br&gt;
Product customizers (t-shirts, mugs, promotional items), custom design tools for SaaS platforms, marketing asset creators, and interactive whiteboards.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Future-Proofing:&lt;/strong&gt;&lt;br&gt;
Fabric.js is mature, stable, and actively maintained by its community. It’s a safe bet for long-term projects, though you’re responsible for keeping up with web standards and browser changes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Support:&lt;/strong&gt;&lt;br&gt;
Community-driven through GitHub issues, Stack Overflow, and forums. No SLAs or dedicated support—you’re relying on the open-source community and your own team’s expertise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt;&lt;br&gt;
Free and open-source (MIT license).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Who It’s For:&lt;/strong&gt;&lt;br&gt;
Developers who need a flexible, powerful canvas toolkit and have the resources to build a custom editor UI and workflows on top of it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comparison to IMG.LY CE.SDK:&lt;/strong&gt;&lt;br&gt;
Fabric.js gives you raw canvas power and control, but you’re building the editor from the ground up. IMG.LY CE.SDK provides a polished, enterprise-grade design editor with prebuilt UI, templates, AI-powered enhancements, cross-platform SDKs (web, iOS, Android, React Native, Flutter, server), and automation workflows—ready for production integration in hours instead of months.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Learn more:&lt;/strong&gt; &lt;a href=&quot;https://img.ly/fabricjs-alternative&quot;&gt;How Fabric.js compares to IMG.LY&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://img.ly/blog/build-vs-buy-is-fabric-js-right-for-you/&quot;&gt;Build vs. Buy: Is Fabric.js Right for You?&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;konvajs&quot;&gt;Konva.js&lt;/h3&gt;
&lt;p&gt;Konva.js is a 2D canvas library focused on interactive shapes, layers, and animations. It’s slightly more opinionated than Fabric.js about how you structure your canvas scenes, which can make certain tasks simpler but also less flexible.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Features &amp;#x26; Capabilities:&lt;/strong&gt;&lt;br&gt;
Shapes (rectangles, circles, paths), layers with hierarchical grouping, transformations, animations, filters (blur, color effects), and robust event handling. Konva.js excels at interactive graphics with smooth animations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Platforms:&lt;/strong&gt;&lt;br&gt;
Web primarily, with Node.js support via node-canvas for server-side rendering.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Difficulty Building a Full Editor:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Medium&lt;/strong&gt;. Konva.js simplifies working with shapes and layers compared to lower-level canvas APIs, but you still need to build the entire editor UI—toolbars, controls, asset management, export logic, and workflows.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Potential Roadblocks:&lt;/strong&gt;&lt;br&gt;
Limited to 2D graphics—no built-in support for advanced design features like typography fine-tuning, CMYK color spaces, or print-ready exports. Complex editor UIs and collaboration features must be custom-built.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use Cases:&lt;/strong&gt;&lt;br&gt;
Data visualization tools, custom 2D design editors, interactive whiteboards, educational apps with drawing capabilities, and diagram builders.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Future-Proofing:&lt;/strong&gt;&lt;br&gt;
Stable and actively maintained with regular updates. The library has a solid foundation and community support.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Support:&lt;/strong&gt;&lt;br&gt;
GitHub issues, community forums, and documentation. No commercial support or SLAs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt;&lt;br&gt;
Free and open-source (MIT license).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Who It’s For:&lt;/strong&gt;&lt;br&gt;
Developers who want to build interactive graphics applications without reinventing low-level canvas logic, and who have time to develop a complete editor interface.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comparison to IMG.LY CE.SDK:&lt;/strong&gt;&lt;br&gt;
Konva.js is excellent for interactive graphics and shape manipulation, but it’s still just the canvas layer. IMG.LY CE.SDK adds complete design workflows, templating systems, brand controls, AI-powered editing, and cross-platform support—turning interactive graphics into full-featured, production-ready design editors.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Learn more:&lt;/strong&gt; &lt;a href=&quot;https://img.ly/konvajs-alternative&quot;&gt;IMG.LY as a Konva.js Alternative&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;easeljs&quot;&gt;EaselJS&lt;/h3&gt;
&lt;p&gt;EaselJS is part of the CreateJS suite and provides low-level canvas graphics and animation capabilities. It was originally built for interactive media and game development, with a focus on sprites, timelines, and animation control.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Features &amp;#x26; Capabilities:&lt;/strong&gt;&lt;br&gt;
Canvas drawing, vector graphics, sprite handling, timeline-based animations, bitmap manipulation, and basic shape rendering. It’s designed for developers who need precise control over animation and drawing operations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Platforms:&lt;/strong&gt;&lt;br&gt;
Web (HTML5 Canvas API).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Difficulty Building a Full Editor:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Medium-high&lt;/strong&gt;. EaselJS gives you low-level drawing primitives, but building a design editor requires significant work: UI development, editor logic, object management systems, and export workflows. It’s more suited to animation and game-like applications than traditional design editors.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Potential Roadblocks:&lt;/strong&gt;&lt;br&gt;
No editor abstractions or prebuilt UI components. The API is lower-level, so you’ll spend more time building foundational features. EaselJS is also an older library compared to newer canvas tools, and it’s not as actively developed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use Cases:&lt;/strong&gt;&lt;br&gt;
Canvas-based games, interactive media projects, custom animation tools, and educational applications with drawing features.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Future-Proofing:&lt;/strong&gt;&lt;br&gt;
Stable but older. The CreateJS suite is still maintained, but the pace of updates has slowed compared to more actively developed libraries.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Support:&lt;/strong&gt;&lt;br&gt;
Community-driven through forums and GitHub. No commercial support.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt;&lt;br&gt;
Free and open-source (MIT license).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Who It’s For:&lt;/strong&gt;&lt;br&gt;
Developers building custom canvas animations, games, or editors from scratch who need low-level control and are comfortable with older API patterns.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comparison to IMG.LY CE.SDK:&lt;/strong&gt;&lt;br&gt;
EaselJS provides low-level graphics primitives for custom applications. IMG.LY CE.SDK delivers full-featured design editors with UI, workflows, templates, automation, and cross-platform support—eliminating the need to build editing infrastructure from the ground up.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Learn more:&lt;/strong&gt; &lt;a href=&quot;https://img.ly/createjs-alternative&quot;&gt;IMG.LY as a CreateJS Alternative&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;summary-canvas-and-drawing-libraries&quot;&gt;Summary: Canvas and Drawing Libraries&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;br&gt;
These libraries offer powerful, flexible control over canvas objects and manipulation. They provide rich feature sets for transformations, animations, and interactive graphics—perfect for developers who want to build highly customized editing experiences.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;br&gt;
No prebuilt editor UI or workflows. You’re responsible for building the entire user-facing editor: toolbars, property panels, layer management, export controls, undo/redo systems, and more. That’s months of development work for a polished product.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Challenges:&lt;/strong&gt;&lt;br&gt;
Managing performance and scaling for large, complex designs; implementing intuitive, user-friendly editor interfaces; building robust export pipelines (especially for print); and maintaining feature parity across evolving web standards.&lt;/p&gt;
&lt;h2 id=&quot;rendering-engines-high-performance-zero-editor-features&quot;&gt;Rendering Engines: High Performance, Zero Editor Features&lt;/h2&gt;
&lt;p&gt;Rendering engines are built for one thing: drawing complex graphics fast. They leverage WebGL and optimized rendering pipelines to handle thousands of objects, animations, and effects smoothly. But they’re focused purely on rendering—they don’t include editing workflows, UI elements, or editor logic. If you need a design editor, you’ll be building it entirely from scratch on top of these engines.&lt;/p&gt;
&lt;h3 id=&quot;pixijs&quot;&gt;PixiJS&lt;/h3&gt;
&lt;p&gt;PixiJS is a WebGL-powered 2D rendering engine known for its exceptional performance. It’s widely used in browser-based games, data visualization, and graphics-intensive applications that need to render large numbers of objects at high frame rates.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Features &amp;#x26; Capabilities:&lt;/strong&gt;&lt;br&gt;
High-performance rendering with WebGL acceleration, sprite management, filters and effects, texture atlases, and advanced graphics pipelines. PixiJS is built for speed and can handle complex scenes that would choke traditional canvas libraries.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Platforms:&lt;/strong&gt;&lt;br&gt;
Web (WebGL, with fallback to Canvas API).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Difficulty Building a Full Editor:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Medium-high&lt;/strong&gt;. PixiJS is not designed as an editor—it’s a rendering engine. Building a design editor means creating all the editing logic, UI, object manipulation systems, selection tools, layer management, and export functionality yourself. That’s a massive undertaking.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Potential Roadblocks:&lt;/strong&gt;&lt;br&gt;
No editor abstractions or UI components. PixiJS is focused on rendering performance, so you’ll need to build everything related to editing and user interaction from scratch. The learning curve can be steep if you’re optimizing for WebGL performance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use Cases:&lt;/strong&gt;&lt;br&gt;
Browser games, interactive data visualizations, graphics-heavy web applications, particle systems, and custom animation tools.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Future-Proofing:&lt;/strong&gt;&lt;br&gt;
PixiJS has a large, active community and is regularly updated with performance improvements and new features. It’s a solid choice for long-term graphics projects.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Support:&lt;/strong&gt;&lt;br&gt;
Community-driven through GitHub, forums, and Discord. No commercial support or SLAs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt;&lt;br&gt;
Free and open-source (MIT license).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Who It’s For:&lt;/strong&gt;&lt;br&gt;
Developers building high-performance graphics applications—especially games or data visualization tools—who need rendering power but are prepared to build editing features from the ground up.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comparison to IMG.LY CE.SDK:&lt;/strong&gt;&lt;br&gt;
PixiJS is a rendering engine for graphics-intensive applications. IMG.LY CE.SDK is a complete design editor with ready-made workflows, UI, templates, and automation—built for teams that need production-ready editing experiences, not just rendering capabilities.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://img.ly/pixijs-alternative&quot;&gt;See how IMG.LY compares to PixiJs&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;react-canvas&quot;&gt;React Canvas&lt;/h3&gt;
&lt;p&gt;React Canvas is a React renderer for the HTML5 Canvas API. It allows you to use React components and paradigms to build canvas-based applications, treating canvas elements like React components with props and state.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Features &amp;#x26; Capabilities:&lt;/strong&gt;&lt;br&gt;
High-performance drawing, text rendering, image handling, and layout via React components. React Canvas is designed for React developers who want to leverage familiar patterns for canvas-based applications.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Platforms:&lt;/strong&gt;&lt;br&gt;
Web (React).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Difficulty Building a Full Editor:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Medium&lt;/strong&gt;. If you’re already building with React, React Canvas simplifies canvas rendering by using React’s component model. But it’s still just a rendering layer—you’ll need to build the entire editor UI, state management, object manipulation, and export workflows yourself.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Potential Roadblocks:&lt;/strong&gt;&lt;br&gt;
React Canvas is a niche library with a smaller ecosystem compared to mainstream canvas tools. Limited community support and examples mean you’ll be on your own for many use cases. Not actively maintained at the same pace as React itself.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use Cases:&lt;/strong&gt;&lt;br&gt;
React-based applications that need custom canvas rendering, such as dashboards, data visualizations, or lightweight drawing tools.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Future-Proofing:&lt;/strong&gt;&lt;br&gt;
Small community and slower update cadence compared to more popular canvas libraries. While stable, it’s not heavily maintained.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Support:&lt;/strong&gt;&lt;br&gt;
Community-driven via GitHub. Minimal documentation and examples.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt;&lt;br&gt;
Free and open-source.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Who It’s For:&lt;/strong&gt;&lt;br&gt;
React developers who need canvas rendering and prefer working within React’s component model, with resources to build editing features from scratch.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comparison to IMG.LY CE.SDK:&lt;/strong&gt;&lt;br&gt;
React Canvas provides rendering primitives for React developers. IMG.LY CE.SDK delivers a complete, cross-platform editor SDK with ready-made UI, workflows, templates, and automation—turning rendering capabilities into full-featured design products.&lt;/p&gt;
&lt;h3 id=&quot;summary-rendering-engines&quot;&gt;Summary: Rendering Engines&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;br&gt;
Highly efficient and performant, leveraging WebGL and modern rendering techniques. Excellent for graphics-heavy applications that need to render complex scenes smoothly. React Canvas provides React-friendly patterns for canvas rendering.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;br&gt;
Focused purely on rendering—no editor logic, UI components, or workflows included. Building a design editor on top of these engines requires extensive custom development across every aspect of the editing experience.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Challenges:&lt;/strong&gt;&lt;br&gt;
Extremely high custom development overhead to implement editing features, object manipulation, and user interfaces. Steep learning curves for WebGL optimization and rendering pipelines. Limited community support for editor-specific use cases.&lt;/p&gt;
&lt;h2 id=&quot;svg-manipulation-lightweight-control-custom-ui-required&quot;&gt;SVG Manipulation: Lightweight Control, Custom UI Required&lt;/h2&gt;
&lt;p&gt;SVG libraries give you precise control over vector graphics—shapes, transformations, animations, filters—without the overhead of canvas rendering. They’re lightweight, performant for moderate-scale graphics, and ideal for projects where SVG’s scalability and precision matter. But like canvas libraries, they provide no editor UI or workflows—you’re building those yourself.&lt;/p&gt;
&lt;h3 id=&quot;svgjs&quot;&gt;SVG.js&lt;/h3&gt;
&lt;p&gt;SVG.js is a lightweight library for creating, manipulating, and animating SVG elements. It’s simple, fast, and focused exclusively on SVG—no canvas, no WebGL, just vector graphics.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Features &amp;#x26; Capabilities:&lt;/strong&gt;&lt;br&gt;
SVG shape creation (rectangles, circles, paths, polygons), transformations (rotate, scale, translate), event handling, filters and effects, animations, and group management. SVG.js gives you direct, low-level control over SVG elements.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Platforms:&lt;/strong&gt;&lt;br&gt;
Web (SVG).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Difficulty Building a Full Editor:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Medium&lt;/strong&gt;. SVG.js handles SVG manipulation well, but building a design editor requires creating the entire UI layer: toolbars, property panels, object selection, layer management, undo/redo, and export controls. You’re also responsible for managing complex interactions and maintaining performance with large SVG documents.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Potential Roadblocks:&lt;/strong&gt;&lt;br&gt;
Not an editor—just SVG primitives. You’ll need to build all editor logic and UI yourself. SVG.js is lightweight, but scaling to very complex designs may require custom optimizations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use Cases:&lt;/strong&gt;&lt;br&gt;
Interactive vector graphics, SVG-based design tools, data visualization, icon editors, and illustration applications.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Future-Proofing:&lt;/strong&gt;&lt;br&gt;
Stable, actively maintained, and lightweight. SVG.js has a solid community and regular updates.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Support:&lt;/strong&gt;&lt;br&gt;
Community-driven through GitHub and documentation. No commercial support or SLAs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt;&lt;br&gt;
Free and open-source (MIT license).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Who It’s For:&lt;/strong&gt;&lt;br&gt;
Developers who need precise SVG control for custom vector graphics applications and have the resources to build a complete editor interface on top.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comparison to IMG.LY CE.SDK:&lt;/strong&gt;&lt;br&gt;
SVG.js provides SVG manipulation primitives for custom projects. IMG.LY CE.SDK delivers a full-featured design editor with prebuilt UI, templates, brand controls, AI-powered enhancements, and cross-platform support—eliminating the need to build editing infrastructure from scratch.&lt;/p&gt;
&lt;h3 id=&quot;summary-svg-manipulation&quot;&gt;Summary: SVG Manipulation&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;br&gt;
Precise control over vector graphics with a lightweight, performant library. Excellent for SVG-based projects that need scalability and fine-tuned control.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;br&gt;
Not an editor—no ready-made UI or editing workflows. Requires building the entire editor experience from scratch, including UI components, interaction logic, and export systems.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Challenges:&lt;/strong&gt;&lt;br&gt;
Developing user-friendly, scalable editors requires substantial frontend work. Managing complex SVG documents and maintaining performance with large designs demands custom optimizations.&lt;/p&gt;
&lt;h2 id=&quot;commercial-alternative-imgly-cesdk&quot;&gt;Commercial Alternative: IMG.LY CE.SDK&lt;/h2&gt;
&lt;p&gt;After looking at open-source libraries, you might notice a pattern: they’re all excellent at what they do—canvas manipulation, rendering, SVG control—but none of them give you a complete editor. That’s where we come in.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Overview:&lt;/strong&gt;&lt;br&gt;
IMG.LY CE.SDK is an enterprise-grade design and editing SDK built for companies that need production-ready editing experiences without months of custom development. We provide a complete, polished editor with prebuilt UI, workflows, templates, and automation—ready to integrate across web, iOS, Android, React Native, and Flutter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Features &amp;#x26; Capabilities:&lt;/strong&gt;&lt;br&gt;
Multi-layer editing with full object manipulation, drag-and-drop UI, template libraries, brand controls (fonts, colors, logo enforcement), AI-powered enhancements (background removal, smart cropping, style transfer), print-ready exports (CMYK, bleed, trim marks), and server-side automation for batch processing and design generation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Platforms:&lt;/strong&gt;&lt;br&gt;
Web, iOS, Android, React Native, Flutter—one SDK, all platforms.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Difficulty Building a Full Editor:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Low&lt;/strong&gt;. Our SDK provides prebuilt, customizable UI and editor logic. You’re integrating, not building from scratch. Most teams go from integration to production in days, not months.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Potential Roadblocks:&lt;/strong&gt;&lt;br&gt;
Minimal—mainly workflow decisions and enterprise integration points. We’re a paid, enterprise-focused solution, so it’s not free like open-source alternatives. But you’re trading licensing costs for time-to-market, scalability, and dedicated support.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use Cases:&lt;/strong&gt;&lt;br&gt;
SaaS applications with design features, e-commerce personalization (custom products, print-on-demand), marketing automation tools, digital asset management (DAM) systems, and enterprise content creation platforms.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Future-Proofing:&lt;/strong&gt;&lt;br&gt;
We’re actively developing AI-powered features, expanding cross-platform capabilities, and maintaining a scalable engine built for enterprise workloads. Our roadmap is driven by customer needs and evolving market demands.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Support:&lt;/strong&gt;&lt;br&gt;
Enterprise SLAs, dedicated onboarding, engineering support, and ongoing updates. You’re not relying on community forums—you have a direct line to our team.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt;&lt;br&gt;
Custom enterprise pricing based on usage and features. Contact us for a quote and demo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Who It’s For:&lt;/strong&gt;&lt;br&gt;
Companies and product teams that need full-featured, cross-platform design editors with templates, automation, and AI enhancements—without the time and cost of building and maintaining custom solutions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Differentiator:&lt;/strong&gt;&lt;br&gt;
We combine an embeddable, white-label editor with automation workflows across all major platforms. You get a complete design stack—editor, templates, APIs, and automation—in one SDK, ready for production from day one.&lt;/p&gt;
&lt;h2 id=&quot;side-by-side-comparison-open-source-vs-imgly-cesdk&quot;&gt;Side-by-Side Comparison: Open-Source vs. IMG.LY CE.SDK&lt;/h2&gt;
&lt;p&gt;Here’s how these solutions stack up across key criteria for building a design editor:&lt;/p&gt;









































































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Use Case / Solution&lt;/th&gt;&lt;th&gt;&lt;strong&gt;Fabric.js&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;Konva.js&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;EaselJS&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;PixiJS&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;React Canvas&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;SVG.js&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;IMG.LY CE.SDK&lt;/strong&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Ease of integration&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;⚠️ Flexible canvas library; requires building UI and controls from scratch&lt;/td&gt;&lt;td&gt;⚠️ Good for interactive shapes and layers; UI must be custom-built&lt;/td&gt;&lt;td&gt;⚠️ Low-level canvas graphics; more work to build editors&lt;/td&gt;&lt;td&gt;⚠️ Rendering engine; requires custom app development&lt;/td&gt;&lt;td&gt;⚠️ React-based canvas renderer; dev effort required&lt;/td&gt;&lt;td&gt;⚠️ Lightweight SVG manipulation; requires UI assembly&lt;/td&gt;&lt;td&gt;✅ Prebuilt SDK with polished, enterprise-ready editor UI and APIs&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Features &amp;#x26; Capabilities&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;✅ Layers, object manipulation, text, images, transformations&lt;/td&gt;&lt;td&gt;✅ Shapes, animations, filters, event handling&lt;/td&gt;&lt;td&gt;⚠️ Canvas drawing, sprites, animations, timeline&lt;/td&gt;&lt;td&gt;⚠️ High-performance WebGL rendering, sprites, filters&lt;/td&gt;&lt;td&gt;⚠️ Canvas drawing via React components&lt;/td&gt;&lt;td&gt;✅ SVG shapes, transformations, filters, animations&lt;/td&gt;&lt;td&gt;✅ Multi-layer editing, templates, brand controls, AI enhancements, print-ready exports&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Cross-platform support&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;❌ Web only&lt;/td&gt;&lt;td&gt;❌ Web only&lt;/td&gt;&lt;td&gt;❌ Web only&lt;/td&gt;&lt;td&gt;❌ Web only&lt;/td&gt;&lt;td&gt;❌ Web only&lt;/td&gt;&lt;td&gt;❌ Web only&lt;/td&gt;&lt;td&gt;✅ Web, iOS, Android, React Native, Flutter&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Scalability&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;⚠️ Suitable for moderate-sized web apps; may struggle with very complex scenes&lt;/td&gt;&lt;td&gt;⚠️ Medium; optimized for interactive web graphics&lt;/td&gt;&lt;td&gt;⚠️ Limited; desktop/web apps with graphics&lt;/td&gt;&lt;td&gt;✅ High-performance rendering for complex scenes&lt;/td&gt;&lt;td&gt;⚠️ Moderate; suitable for React-based canvas apps&lt;/td&gt;&lt;td&gt;⚠️ Moderate; suitable for medium-sized interactive graphics&lt;/td&gt;&lt;td&gt;✅ Enterprise-grade; cloud-ready, scalable multi-platform workflows&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Difficulty building / integration&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Medium — needs custom UI, but feature-rich&lt;/td&gt;&lt;td&gt;Medium — shapes &amp;#x26; layers are simple, full editor requires work&lt;/td&gt;&lt;td&gt;Medium-high — low-level API, manual UI building&lt;/td&gt;&lt;td&gt;Medium-high — engine-level, no editor features&lt;/td&gt;&lt;td&gt;Medium — React integration required&lt;/td&gt;&lt;td&gt;Medium — must assemble SVG components&lt;/td&gt;&lt;td&gt;Low — SDK provides prebuilt editor and APIs for production apps&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Potential roadblocks&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Dev must implement UI and editor logic&lt;/td&gt;&lt;td&gt;Must implement full editor UI for production&lt;/td&gt;&lt;td&gt;Older library; UI building is manual&lt;/td&gt;&lt;td&gt;Not an editor; requires substantial dev work&lt;/td&gt;&lt;td&gt;Niche use case; React dependency&lt;/td&gt;&lt;td&gt;Only works with SVG; UI must be built&lt;/td&gt;&lt;td&gt;Minimal; mainly workflow decisions and enterprise integration&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;AI / Automation&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;❌ None&lt;/td&gt;&lt;td&gt;❌ None&lt;/td&gt;&lt;td&gt;❌ None&lt;/td&gt;&lt;td&gt;❌ None&lt;/td&gt;&lt;td&gt;❌ None&lt;/td&gt;&lt;td&gt;❌ None&lt;/td&gt;&lt;td&gt;✅ AI-assisted editing, automation workflows, multi-layer design&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Free, OSS&lt;/td&gt;&lt;td&gt;Free, OSS&lt;/td&gt;&lt;td&gt;Free, OSS&lt;/td&gt;&lt;td&gt;Free, OSS&lt;/td&gt;&lt;td&gt;Free, OSS&lt;/td&gt;&lt;td&gt;Free, OSS&lt;/td&gt;&lt;td&gt;Custom enterprise pricing&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Who it’s for&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Developers needing a flexible canvas toolkit to build custom editors&lt;/td&gt;&lt;td&gt;Developers needing interactive 2D graphics and layer manipulation&lt;/td&gt;&lt;td&gt;Developers creating canvas-based animations or games&lt;/td&gt;&lt;td&gt;Developers needing high-performance 2D rendering&lt;/td&gt;&lt;td&gt;React developers building canvas apps&lt;/td&gt;&lt;td&gt;Developers building interactive SVG-based apps&lt;/td&gt;&lt;td&gt;Companies needing a full-featured, cross-platform design editor with templates, AI, and automation&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;final-thoughts-open-source-flexibility-vs-enterprise-ready-solutions&quot;&gt;Final Thoughts: Open-Source Flexibility vs. Enterprise-Ready Solutions&lt;/h2&gt;
&lt;p&gt;There’s no single “wrong” choice here—it depends on what you’re building, what resources you have, and how quickly you need to get to market.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Choose open-source canvas and drawing libraries (Fabric.js, Konva.js, EaselJS)&lt;/strong&gt; if you’re building highly custom editors and have the development resources to create polished UI, workflows, and editor logic from scratch. These libraries offer flexibility and rich graphics capabilities, but expect months of development work to reach production quality.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Choose rendering engines (PixiJS, React Canvas)&lt;/strong&gt; if you’re building graphics-heavy or game-like applications where rendering performance is the primary concern, and you’re prepared to build all editing features and workflows yourself. These engines excel at drawing complex scenes efficiently but provide no editor abstractions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Choose SVG manipulation libraries (SVG.js)&lt;/strong&gt; if you’re working on SVG-based projects that require lightweight, precise vector control, and you have the resources to develop the entire editor UI and interaction logic.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Choose IMG.LY CE.SDK&lt;/strong&gt; if you need a complete, production-ready design editor that works across web, iOS, Android, React Native, and Flutter—with templates, AI-powered enhancements, automation workflows, and enterprise support. We’re the only option that combines an enterprise-grade editor with cross-platform SDKs, eliminating the need to build and maintain custom editing infrastructure. You get fast time-to-market, scalability, and dedicated support, all in one integrated stack.&lt;/p&gt;
&lt;p&gt;Whether you’re evaluating build-versus-buy or comparing commercial SDKs, the key is understanding what you’re actually signing up for. Open-source libraries give you building blocks—powerful, flexible, and free—but you’re responsible for assembling the editor experience. We give you the complete editor, ready to integrate and scale.&lt;/p&gt;
&lt;p&gt;Want to see how IMG.LY CE.SDK compares in action? &lt;a href=&quot;https://img.ly/showcases/cesdk&quot;&gt;Explore our demos&lt;/a&gt; or &lt;a href=&quot;https://img.ly/forms/contact-sales&quot;&gt;talk to our team&lt;/a&gt; about your specific use case. We’re here to help you build better editing experiences, faster.&lt;/p&gt;</content:encoded><dc:creator>Klaudia</dc:creator><media:content url="https://blog.img.ly/2025/11/open-source-design-editor-sdk-whitelabel-best-comparison-2.jpg" medium="image"/><category>Design Editor</category><category>OpenSource</category><category>Insights</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>Comparing the 7 Best Design Editor SDKs: Which is the Right Choice for You?</title><link>https://img.ly/blog/compare-best-design-editor-sdks/</link><guid isPermaLink="true">https://img.ly/blog/compare-best-design-editor-sdks/</guid><description>Compare seven of the best design editor SDKs: IMG.LY CreativeEditor SDK, Canva Connect API, Placid Editor SDK, Design Huddle, DesignCombo SDK, Creatomate, and Rendley.</description><pubDate>Mon, 29 Sep 2025 13:28:10 GMT</pubDate><content:encoded>&lt;p&gt;Choosing the right design editor SDK can define how your product handles content creation. The wrong choice may limit your growth, while the right one can unlock scalable workflows, better user experience, and faster time to market.&lt;/p&gt;
&lt;p&gt;We’ll look at their strengths, limitations, and best-fit scenarios, and explain why IMG.LY stands out as the best cross-platform design editor SDK for enterprises.&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;CE.SDK is built for companies that need more than just basic image or video filters. It’s designed as an enterprise-grade editing platform covering both creative UI for end users and backend automation workflows. It supports photo, video, and template-based editing, so it can adapt as your product’s creative demands grow.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Features &amp;#x26; capabilities:&lt;/strong&gt; With CE.SDK you get multi-layer editing, template systems you can feed dynamic content into, AI-powered tools like background removal or generative design, and a plugin ecosystem to extend what comes out of the box.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Platforms &amp;#x26; customization:&lt;/strong&gt; CE.SDK runs on every platform: Web, iOS, Android, React Native, Flutter, Node.js, and Electron. This means whether you’re building a mobile app, a desktop dashboard, or a hybrid setup, the editor behaves consistently. On the customization side, everything is fully white-label. You can theme the UI, adapt workflows, and build custom plugins. It’s designed so your users feel like they’re interacting with your brand, not a third-party tool.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Implementation:&lt;/strong&gt; Implementation is designed to scale. You can get going quickly with default editors, then ramp up to more custom UX as needed. Because CE.SDK handles both the frontend editing tools and has engine APIs for automation (e.g., templating, rendering), teams don’t need to piece together separate tools for UI and backend workflows.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use cases:&lt;/strong&gt; Some of the use cases include: E-commerce personalization, allowing customers to design or customize products, packaging, or visuals. For MarTech platforms, you can create campaign graphics, video ads, and templates. It’s also perfect for social platforms, Digital Asset Management (DAM) systems, and SaaS apps that want rich media editing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Future‑proofing, support &amp;#x26; pricing:&lt;/strong&gt; &lt;a href=&quot;https://img.ly/whats-new&quot;&gt;IMG.LY ships frequent releases&lt;/a&gt; with cross‑platform parity and a clear AI roadmap. Support includes enterprise service-level agreements, onboarding support, and assistance for scaling. Pricing is custom, based on enterprise licensing. That means you pay for what you need.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Who it’s for:&lt;/strong&gt; CE.SDK is ideal for organizations that need high customization and a white-label editor across platforms. Or companies that want both interactive user editing and automated creative workflows.&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 sets itself apart by combining an interactive editor UX with a powerful automation stack in one SDK. It also brings AI features and cross‑platform coverage, making it the benchmark for enterprise‑grade design editing. If your company is expected to scale, CE.SDK will scale with you. And it’s perfect if you care about brand consistency, UX polish, and want to avoid “bolting on” tools later.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://img.ly/case-studies&quot;&gt;Explore our case studies&lt;/a&gt; to see how companies in e‑commerce, MarTech, and SaaS have already adopted CE.SDK to scale their creative workflows.&lt;/p&gt;
&lt;h2 id=&quot;2-canva-connect-api&quot;&gt;&lt;strong&gt;2. Canva Connect API&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Canva Connect API brings Canva’s editor and templates into other apps. It provides an integration layer that allows third-party platforms to embed Canva’s design environment without investing in building a native editor from scratch. This makes it an appealing choice for teams who want to add familiar design tools quickly, but it also means that the editing experience remains tied to Canva’s infrastructure and branding.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Features &amp;#x26; capabilities:&lt;/strong&gt; With Canva Connect, your users get Canva’s large library of templates and assets, plus Canva’s editing tools and export options. This often means access to well-designed template content, background assets, and photo editing tools.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Platforms &amp;#x26; customization:&lt;/strong&gt; It’s primarily a web-based API, and the actual editing experience is tied to the Canva ecosystem and branding. While this allows stability and ease of maintenance, it reduces the ability for organizations to adapt the editor to their own branding or workflows.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Implementation &amp;#x26; use cases:&lt;/strong&gt; Implementation is relatively simple: connect via API and embed or redirect to Canva’s editor. It’s beneficial for SaaS apps that want to allow users to design graphics without building an editor from scratch.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Future-proofing, support &amp;#x26; pricing:&lt;/strong&gt; The API is tied to Canva’s roadmap, so the feature availability depends on how Canva evolves. Support is offered via documentation and community. The pricing is usage-based SaaS; you pay according to usage and the features you enable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Who it’s for:&lt;/strong&gt; Canva Connect API is most suitable for teams that want to provide template‑driven design capabilities with minimal development effort. It works well for organizations that are comfortable adopting Canva’s ecosystem and can accept the trade‑offs in branding and customization.&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;Compared to IMG.LY, Canva Connect provides significantly less control. With IMG.LY, you gain access to a fully white-label solution that allows you to theme and brand the interface, deploy across multiple platforms, and integrate advanced AI tools.&lt;/p&gt;
&lt;p&gt;Canva Connect offers speed and convenience, but at the cost of design ownership, UI flexibility, and long-term control. For organizations prioritizing consistent user experience, platform coverage, and automation, IMG.LY remains the stronger choice.&lt;/p&gt;
&lt;p&gt;Read more about how &lt;a href=&quot;https://img.ly/canva-alternative&quot;&gt;IMG.LY is a great alternative to Canva Connect&lt;/a&gt; here.&lt;/p&gt;
&lt;h2 id=&quot;3-placid-editor-sdk&quot;&gt;&lt;strong&gt;3. Placid Editor SDK&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;The Placid Editor allows you to embed a customizable editing experience of your templates directly into your application. Its primary strength lies in enabling organizations to deliver consistent, template-driven content creation without requiring significant development resources. By restricting edits to predefined fields and layouts it helps maintain brand integrity while still giving end users the flexibility to customize outputs.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Features &amp;#x26; capabilities:&lt;/strong&gt; Placid provides a curated template system. You define branded templates and control which elements are editable. Users create consistent assets without risking layout integrity. Exports cover common image formats and simple video formats.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Platforms &amp;#x26; customization:&lt;/strong&gt; Placid runs on the Web (JavaScript SDK). Customization centers on template configuration rather than deep UI theming or plugins. The tool is less about deep custom UI themes or plugins and more about giving non-designers safe, branded content creation workflows.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Implementation &amp;#x26; use cases:&lt;/strong&gt; This SDK offers easy integration via CDN, and the setup tends to be fast. Some of the common use cases include marketing automation tools, campaign content creation, branded content platforms where consistency matters, and cases where development bandwidth is limited but design control is important.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Future‑Proofing, support &amp;#x26; pricing:&lt;/strong&gt; Placid’s roadmap is largely centered on enhancing template management, expanding export options, and simplifying collaboration. Support is vendor‑driven and through documentation. Pricing follows a subscription model, usually linked to template volumes or usage tiers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Who it’s for:&lt;/strong&gt; Teams who need branded, template-driven editing, but don’t need advanced customization or deep video timelines. Placid is good for smaller teams, marketing departments, content creators, or SaaS tools focused on content campaigns rather than video editors.&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;To summarize, Placid is simpler and lighter. If you just need templates, safe editing, and minimal dev effort, Placid could get you up and running fast.&lt;/p&gt;
&lt;p&gt;But compared to IMG.LY, you lose: multi-platform coverage, full white-label UI control, advanced video editing capability, deep automation, and AI features. If you expect your editing requirements to grow over time, IMG.LY gives more headroom to do so.&lt;/p&gt;
&lt;h2 id=&quot;4-design-huddle&quot;&gt;&lt;strong&gt;4. Design Huddle&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Design Huddle is an embeddable, white-label editor SDK equipped with automation features. It intends to deliver the capabilities of a Canva‑style editor, but within an organization’s own environment and with greater control over content workflows and branding.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Features &amp;#x26; capabilities&lt;/strong&gt;: Design Huddle offers template editing, asset libraries and management, and dynamic content insertion (for example, personalize templates with user or data inputs). It may also support some automation in rendering or exporting, depending on your use case.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Platforms &amp;#x26; customization:&lt;/strong&gt; It is web-based, using JavaScript and iframe embedding. The tool offers themeable UI, configurable workflows, and ability to white-label so end users see your brand. There may be limitations in deeper customization compared to a plugin-based system.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Implementation &amp;#x26; use cases:&lt;/strong&gt; You embed the editor into your app or site (often via iframe or JS widget), configure which template sets/assets are available, define edit permissions, then let users create content within this controlled environment. These features are great for MarTech platforms, product personalization workflows, and branded content creation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Future‑proofing, support &amp;#x26; pricing:&lt;/strong&gt; Design Huddle maintains an enterprise‑focused roadmap. Vendor support is available to assist with integration, onboarding, and ongoing operations, ensuring that large organizations can adopt the editor with confidence. Pricing typically follows an enterprise licensing model, reflecting its positioning toward organizations with higher demands.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Who it’s for:&lt;/strong&gt; Companies that require a white‑label Canva‑style editor but do not want to invest in building a solution from the ground up. It is best suited for organizations that prioritize branded content workflows, product personalization, and marketing automation use cases, where ease of deployment and controlled editing environments are more important than extensive customization or cross‑platform reach.&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;Design Huddle and IMG.LY overlap quite a bit for use cases like branded content, template workflows, and marketing automation.&lt;/p&gt;
&lt;p&gt;However, IMG.LY extends its offering by supporting mobile SDKs, advanced video tooling, AI‑powered features, plugin extensibility, and a deeper automation stack. This combination makes it better suited for organizations that need to manage complex, multi‑platform deployments while maintaining consistent user experiences and future‑ready capabilities.&lt;/p&gt;
&lt;h2 id=&quot;5-designcombo-sdk&quot;&gt;&lt;strong&gt;5. DesignCombo SDK&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;DesignCombo is a React and Remotion-based SDK. It is designed for teams that want to build custom, browser‑based video and graphic editors where detailed control and performance are priorities.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Features &amp;#x26; capabilities:&lt;/strong&gt; DesignCombo includes timeline editing, visual effects, and filters, along with AI‑supported tools such as smart crop and background removal. Since it is component‑driven, development teams can assemble the editor experience in a highly tailored way, adding or removing features to suit their product requirements.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Platforms &amp;#x26; customization:&lt;/strong&gt; The SDK is built around Web (React). This provides a high degree of customization but also requires more engineering effort to create a cohesive user experience. Unlike pre‑packaged editors, DesignCombo expects development teams to invest time in shaping the interface and workflows to match their needs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Implementation &amp;#x26; use cases:&lt;/strong&gt; Implementation generally demands skilled React developers who can integrate the SDK’s components effectively. It is well-suited to SaaS tools where video timelines and browser performance are central. Common applications include online video‑creation platforms, social video editing tools, and advertising solutions that need precise control over video assets.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Future‑proofing, support &amp;#x26; pricing:&lt;/strong&gt; Their roadmap includes expanding AI integrations and improvements in browser performance. Support is available through community channels and vendor documentation, though it may be lighter than enterprise‑grade offerings. Pricing typically follows a subscription model.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Who it’s for:&lt;/strong&gt; To sum it up, DesignCombo is most appropriate for teams comfortable with developer‑heavy builds who want full control over how a video editor operates in the browser. It fits organizations where customization, flexibility, and a video‑first focus outweigh the need for fast setup.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;How it compares to IMG.LY&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;DesignCombo performs strongly for web‑based video timelines. On the other hand, IMG.LY provides a broader solution, covering images, video, templates, and automation with support for native mobile and desktop platforms. This reduces the need for organizations to maintain separate technology stacks as they expand their creative workflows.&lt;/p&gt;
&lt;h2 id=&quot;6-creatomate&quot;&gt;&lt;strong&gt;6. Creatomate&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Creatomate is an API‑first solution with a strong focus on automation. Rather than offering an embedded, in‑app editor, it generates images and videos directly from templates and structured data. This makes it well-suited for platforms that prioritize large‑scale, programmatic asset creation over interactive editing.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Features &amp;#x26; capabilities:&lt;/strong&gt; Creatomate excels at dynamic rendering. It supports text overlays, data‑driven compositions, and bulk generation, making it effective for producing marketing visuals, personalized campaigns, and video variations at scale.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Platforms &amp;#x26; customization:&lt;/strong&gt; Because it is API‑based, Creatomate can be integrated with almost any environment: web, mobile, or server. But unlike a full SDK, it does not provide an in‑app editor UX. Instead, customization is handled within the templates and the payloads you define. This gives developers strong control over output, but it also limits end‑user flexibility inside applications.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Implementation &amp;#x26; use cases:&lt;/strong&gt; Creatomate offers simple REST integration. You define templates, supply data, and retrieve rendered media files. It is commonly used for automated marketing videos, social content production at scale, and personalized campaigns where assets need to be generated automatically.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Future‑proofing, support &amp;#x26; pricing:&lt;/strong&gt; The roadmap emphasizes improvements focused on automation. Support is vendor‑led, with documentation designed to help developers set up workflows efficiently. Pricing follows a usage‑based model, aligning costs with the volume of rendered assets.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Who it’s for:&lt;/strong&gt; Creatomate is best suited for teams that require automation‑only workflows and do not need a user‑facing editor. It is valuable for businesses building large‑scale personalization engines, content factories, or data‑driven marketing systems.&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;Creatomate is strong for backend rendering and bulk content generation. IMG.LY extends beyond this by combining a front‑end editing experience with automation and AI. This allows organizations to support both interactive content creation for end users and programmatic asset generation within a single stack.&lt;/p&gt;
&lt;p&gt;Read our detailed &lt;a href=&quot;https://img.ly/creatomate-alternative&quot;&gt;comparison of IMG.LY and Creatomate&lt;/a&gt; for more information.&lt;/p&gt;
&lt;h2 id=&quot;7-rendley&quot;&gt;&lt;strong&gt;7. Rendley&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Rendley is a creative automation API designed for images and templates. It is an API‑first solution built to support asset generation at scale, making it well-suited for automation‑driven content pipelines.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Features &amp;#x26; capabilities:&lt;/strong&gt; Rendley focuses on server‑side image generation and template rendering. Developers can define templates and logic to generate large volumes of assets quickly and consistently. It does not provide an in‑app editor, but instead acts as a backend service for automated content creation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Platforms &amp;#x26; customization:&lt;/strong&gt; As an API‑first platform, Rendley can be integrated with almost any environment. Customization is high, since developers control how templates are structured and how the API processes them. This gives flexibility in automation workflows, though it also means less emphasis on user‑facing editing interfaces.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Implementation &amp;#x26; use cases:&lt;/strong&gt; Implementation is straightforward through simple API integration. Typical use cases include marketing automation, large‑scale asset generation, and creative workflows where automation is prioritized over manual editing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Future‑proofing, support &amp;#x26; pricing:&lt;/strong&gt; Rendley follows a developer‑first roadmap as a SaaS platform. The focus is on improving automation performance and scalability. Support is available from the vendor for developers, and pricing is usage‑based, aligning cost with the scale of asset generation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Who it’s for:&lt;/strong&gt; Rendley is intended for teams building automation‑driven creative pipelines. It is most relevant for organizations that need to generate large volumes of assets programmatically and do not require an embedded editor.&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 is backend‑only and provides automation for image and template generation. IMG.LY, on the other hand, combines backend automation with user‑facing editing tools, cross‑platform SDKs, and AI features, making it a more complete solution for enterprises that need both automation and interactive design experiences.&lt;/p&gt;
&lt;p&gt;Read more about &lt;a href=&quot;https://img.ly/rendley-alternative&quot;&gt;IMG.LY vs Rendley&lt;/a&gt; here to make the right choice.&lt;/p&gt;
&lt;h2 id=&quot;overview-table&quot;&gt;Overview Table&lt;/h2&gt;
&lt;p&gt;Here’s a quick overview of the tools we’ve discussed.&lt;/p&gt;
&lt;h2 id=&quot;selecting-the-best-fit-why-imgly-stands-out&quot;&gt;&lt;strong&gt;Selecting the best fit: Why IMG.LY stands out&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Choosing a design editor SDK or API starts with a clear view of what your teams’ priorities are. Here’s a quick summary to help you choose.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Canva API, Placid, Design Huddle:&lt;/strong&gt; These tools are great for teams wanting Canva-like workflows at different levels of control.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DesignCombo, Creatomate, Rendley:&lt;/strong&gt; Ideal for teams focused on video-first web editors, or are geared toward automation-only scenarios.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But if you want an interactive editor with automation, cross‑platform coverage, AI features, and enterprise support, IMG.LY CreativeEditor SDK is the most complete option.&lt;/p&gt;
&lt;p&gt;Beyond offering a polished, white‑label editor, our tool provides a plugin ecosystem, native SDKs for web and mobile, and a strong roadmap for AI features that ensure long‑term relevance. Our enterprise‑grade support model with SLAs and onboarding engineers also makes IMG.LY a reliable choice for organizations with complex requirements.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;We already empowered over 600 innovative startups, government entities, and Fortune 500 companies to streamline their design, video, and photo editing workflows. &lt;a href=&quot;https://img.ly/forms/contact-sales&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>Vatsala</dc:creator><media:content url="https://blog.img.ly/2025/09/best-design-sdk.jpg" medium="image"/><category>Developer Tools</category><category>SDK</category><category>Design Editor</category></item><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_Z22U300.webp&quot; srcset=&quot;/_astro/webM-support_eGJro.webp 640w, /_astro/webM-support_ZANqfO.webp 750w, /_astro/webM-support_ietFc.webp 828w, /_astro/webM-support_Z20fGFJ.webp 1080w, /_astro/webM-support_vvc46.webp 1280w, /_astro/webM-support_Z22U300.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_1VKX77.webp&quot; srcset=&quot;/_astro/1-59_wrappers_Z1rbttX.webp 640w, /_astro/1-59_wrappers_QlPT9.webp 750w, /_astro/1-59_wrappers_5Wree.webp 828w, /_astro/1-59_wrappers_2gaoux.webp 1080w, /_astro/1-59_wrappers_26sFNk.webp 1280w, /_astro/1-59_wrappers_1VKX77.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 React Design Editor: Integration Guide</title><link>https://img.ly/blog/modern-react-design-editor/</link><guid isPermaLink="true">https://img.ly/blog/modern-react-design-editor/</guid><description>Learn how to integrate IMG.LY&apos;s design editor for React into your web app and how to best leverage its capabilities.</description><pubDate>Thu, 16 Jan 2025 14:38:04 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Learn how to integrate&lt;/em&gt; &lt;a href=&quot;https://img.ly/docs/cesdk/react/starterkits/design-editor-8unj9u/&quot;&gt;&lt;em&gt;IMG.LY’s design editor for React&lt;/em&gt;&lt;/a&gt; &lt;em&gt;into your web app and explore various use cases and customization options.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;It is no surprise that content asset generation is a key for businesses in marketing and promotion, as well as for users on social media. Whether it is images or videos, these are the types of posts we engage with and relate to the most as human beings—much more than plain text.&lt;/p&gt;
&lt;p&gt;Most content that resonates with an audience is not created from scratch. Instead, it often comes from pre-designed designs that are reused, repurposed, and adapted to fit different content or goals. That is why adding a design editor to your React application is so valuable.&lt;/p&gt;
&lt;p&gt;In this guide, you will learn how to build a React design editor using the CreativeEditor SDK (also known as &lt;em&gt;CE.SDK&lt;/em&gt;). We will also cover when this is useful and the customization options the editor supports.&lt;/p&gt;
&lt;p&gt;For a quick start, check out the &lt;a href=&quot;https://github.com/imgly/cesdk-web-examples/tree/main/integrate-with-react&quot;&gt;GitHub repository&lt;/a&gt; with the full code integration.&lt;/p&gt;
&lt;p&gt;Let’s dive in!&lt;/p&gt;
&lt;h2 id=&quot;why-add-a-design-editor-to-your-react-app&quot;&gt;Why Add a Design Editor to Your React App?&lt;/h2&gt;
&lt;p&gt;Before answering the question, you must understand what a design is and how helpful it can be. In this context, a design can be defined as a set of predefined assets, text overlays, placeholders, and other elements arranged in a specific layout.&lt;/p&gt;
&lt;p&gt;Users can use designs to create images or videos with a particular structure and for specific use cases at scale. Thus, a &lt;a href=&quot;https://img.ly/blog/what-is-a-design-editor-sdk/&quot;&gt;design editor&lt;/a&gt; would enable your users to create personalized assets—and in the case of a React application, directly within the browser.&lt;/p&gt;
&lt;p&gt;Building such a platform is not a piece of cake. A robust design editor requires numerous features, such as intuitive drag-and-drop functionality, template management, image manipulation tools, and more. It also generally requires integrations with third-party services and dependencies to enhance its capabilities.&lt;/p&gt;
&lt;p&gt;Fortunately, an all-in-one solution like &lt;a href=&quot;https://img.ly/products/creative-sdk&quot;&gt;CreativeEditor SDK&lt;/a&gt; from IMG.LY makes it easy to embed this powerful design editor into your application. It supports various programming languages and technologies, including React. With extensive features and customization options, CE.SDK has no limits on the types of designs users can generate.&lt;/p&gt;
&lt;p&gt;CE.SDK features adaptable design tools for &lt;a href=&quot;https://img.ly/case-studies&quot;&gt;diverse industries and use cases&lt;/a&gt;, such as social media post creation, digital asset management, and AI-assisted content personalization. That is why it is used by &lt;a href=&quot;https://img.ly/customers&quot;&gt;hundreds of customers&lt;/a&gt;, including governments, Fortune 500 companies, and dozens of startups.&lt;/p&gt;
&lt;p&gt;CreativeEditor SDK is trusted by companies like Swiss Post, Brother, &lt;a href=&quot;https://img.ly/case-studies/optimizely&quot;&gt;Optimizely&lt;/a&gt;, HP, and many more.&lt;/p&gt;
&lt;h2 id=&quot;how-to-integrate-a-design-editor-in-react&quot;&gt;How to Integrate a Design Editor in React&lt;/h2&gt;
&lt;p&gt;Follow this step-by-step tutorial to see how to quickly set up a React design editor in your web app using CreativeEditor SDK. For a complete guide, read our tutorial on &lt;a href=&quot;https://img.ly/blog/how-to-build-a-canva-clone-with-ce-sdk/&quot;&gt;building a Canva alternative in React using CE.SDK&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Integrate CE.SDK into your React app using the instructions below!&lt;/p&gt;
&lt;h3 id=&quot;requirements&quot;&gt;&lt;strong&gt;Requirements&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Before getting started, ensure that you meet the following prerequisites:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The latest LTS version of Node.js&lt;/strong&gt;: If you do not have it installed, &lt;a href=&quot;https://nodejs.org/en/download&quot;&gt;download it from the official site&lt;/a&gt; and follow the installation instructions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A React 18+ application&lt;/strong&gt;: If you do not have one set up, follow the instructions below to create it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A CreativeEditor SDK license&lt;/strong&gt;: In case you do not have a license, &lt;a href=&quot;https://img.ly/forms/free-trial&quot;&gt;sign up for a free trial&lt;/a&gt; or &lt;a href=&quot;https://img.ly/pricing&quot;&gt;buy a license&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you do not have a React project set up yet, create a new one using &lt;a href=&quot;https://vite.dev/guide/&quot;&gt;Vite&lt;/a&gt;:&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; my-react-video-editor-app&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;/code&gt;&lt;/pre&gt;
&lt;p&gt;Open your project in a JavaScript IDE, and you are all set to start coding!&lt;/p&gt;
&lt;h3 id=&quot;install-cesdk&quot;&gt;&lt;strong&gt;Install CE.SDK&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Install CE.SDK by adding the &lt;a href=&quot;https://www.npmjs.com/package/@cesdk/cesdk-js&quot;&gt;@cesdk/cesdk-js&lt;/a&gt; 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;Your package.json file will now list it as a dependency:&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 class=&quot;line&quot;&gt;&lt;span&gt;&quot;dependencies&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &quot;@cesdk/cesdk-js&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;^1.41.1&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &quot;react&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;^18.3.1&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &quot;react-dom&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;^18.3.1&quot;&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;create-the-design-editor-component&quot;&gt;&lt;strong&gt;Create the Design Editor Component&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;In the src folder of your React project, create a DesignEditor.jsx file. This will house your CE.SDK-based React design editor component.&lt;/p&gt;
&lt;p&gt;Inside it, import &lt;code&gt;CreativeEditorSDK&lt;/code&gt; from &lt;code&gt;@cesdk/cesdk-js&lt;/code&gt;:&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; CreativeEditorSDK &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;@cesdk/cesdk-js&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next, initialize your video editor React component with the following logic:&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/DesignEditor.jsx&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; CreativeEditorSDK &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;@cesdk/cesdk-js&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; { useEffect, useRef, useState } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;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;// 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;  userId: &lt;/span&gt;&lt;span&gt;&apos;&amp;#x3C;YOUR_USER_ID&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;export&lt;/span&gt;&lt;span&gt; default&lt;/span&gt;&lt;span&gt; function&lt;/span&gt;&lt;span&gt; DesignEditor&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; cesdk_container&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; useRef&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; [&lt;/span&gt;&lt;span&gt;cesdk&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;setCesdk&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; useState&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;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  useEffect&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 the CE.SDK container has already been initialized&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;cesdk_container.current) {&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;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; cleanedUp &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; false&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;    // initialize a CE.SDK instance&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; instance;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    CreativeEditorSDK.&lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt;(cesdk_container.current, config).&lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      async&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;_instance&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;        instance &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; _instance;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        if&lt;/span&gt;&lt;span&gt; (cleanedUp) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          instance.&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;          return&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;        // customize the design editor behavior...&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;        setCesdk&lt;/span&gt;&lt;span&gt;(instance);&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;    // clean up the CE.SDK instance&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    const&lt;/span&gt;&lt;span&gt; cleanup&lt;/span&gt;&lt;span&gt; =&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;      cleanedUp &lt;/span&gt;&lt;span&gt;=&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;      instance?.&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;      setCesdk&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;    };&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;    return&lt;/span&gt;&lt;span&gt; cleanup;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  }, [cesdk_container]);&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;  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;div&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      ref&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{cesdk_container}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      style&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{{ width: &lt;/span&gt;&lt;span&gt;&apos;100vw&apos;&lt;/span&gt;&lt;span&gt;, height: &lt;/span&gt;&lt;span&gt;&apos;100vh&apos;&lt;/span&gt;&lt;span&gt; }}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&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;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;Replace &lt;code&gt;&amp;#x3C;YOUR_LICENSE&gt;&lt;/code&gt; with the license key from CreativeEditor SDK, and &lt;code&gt;&amp;#x3C;YOUR_USER_ID&gt;&lt;/code&gt; with your user ID to optionally track monthly active users (MAUs) across different devices.&lt;/p&gt;
&lt;p&gt;The component defined above embeds CreativeEditor SDK into an HTML &lt;code&gt;&amp;#x3C;div&gt;&lt;/code&gt; element. &lt;a href=&quot;https://img.ly/docs/cesdk/react/user-interface/customization/dock-cb916c/&quot;&gt;See how to customize and use it in the docs&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;use-the-component&quot;&gt;&lt;strong&gt;Use the Component&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;You can now import the DesignEditor component as below:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;import DesignEditor from &quot;./DesignEditor&quot;;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Then, add it to the DOM as follows:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;#x3C;DesignEditor /&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This will open the design editor with the preset, enabling users to place assets, set constraints, and perform other tasks to create their final designs.&lt;/p&gt;
&lt;h2 id=&quot;react-design-editor-use-cases&quot;&gt;React Design Editor Use Cases&lt;/h2&gt;
&lt;p&gt;Now that you are familiar with integrating a React design editor into your web app. It is time to explore key use cases and see how CreativeEditorSDK can cover many scenarios.&lt;/p&gt;
&lt;h3 id=&quot;social-media-publishing&quot;&gt;&lt;strong&gt;Social Media Publishing&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;CreativeEditorSDK offers a wide suite of tools to help users easily create high-quality, personalized, on-brand social media assets in your React application.&lt;/p&gt;
&lt;p&gt;With a vast library of professionally designed templates, it streamlines the design process and ensures consistency across multiple platforms. Users can efficiently produce engaging content tailored for&lt;/p&gt;
&lt;p&gt;Key features include customizable dimensions, filters, placeholders, and text overlays. These give users what they need to craft content optimized for various social networks, such as Instagram, X, LinkedIn, and more. That is possible thanks to platform-specific export options to produce ready-to-upload assets.&lt;/p&gt;
&lt;p&gt;The SDK’s capabilities extend beyond static images, supporting the creation of dynamic &lt;a href=&quot;https://img.ly/use-cases/story-reels-short-video-creation&quot;&gt;short videos, stories, and reels&lt;/a&gt;. Do not forget that CE.SDK can also function as a &lt;a href=&quot;https://img.ly/blog/modern-react-design-editor/&quot;&gt;modern React video editor&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;digital-asset-management&quot;&gt;&lt;strong&gt;Digital Asset Management&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;DAM, short for &lt;a href=&quot;https://business.adobe.com/blog/basics/digital-asset-management&quot;&gt;Digital Asset Management&lt;/a&gt;, is the process of organizing, storing, and efficiently retrieving a wide range of digital files.&lt;/p&gt;
&lt;p&gt;CreativeEditorSDK supports DAM by helping teams centralize asset creation and editing directly within an embeddable React design editor—eliminating the need for external tools. This is achieved through features like pre-defining and locking branding elements—including logos, fonts, and color schemes—to ensure brand consistency across all generated content.&lt;/p&gt;
&lt;p&gt;Additionally, CE.SDK offers :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://img.ly/showcases/cesdk/design-validation/web&quot;&gt;Design validation tools&lt;/a&gt; to prevent the creation of misaligned assets.&lt;/li&gt;
&lt;li&gt;Automatic asset generation to streamline content variations.&lt;/li&gt;
&lt;li&gt;Robust asset management features for handling both generated content and external assets retrieved via &lt;a href=&quot;https://support.img.ly/do-you-offer-third-party-integrations-such-as-unsplash&quot;&gt;third-party APIs&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;marketing-automation&quot;&gt;&lt;strong&gt;Marketing Automation&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Businesses can use CreativeEditor SDK to scale marketing campaigns through &lt;a href=&quot;https://img.ly/templates&quot;&gt;dynamic, unique, customizable design templates&lt;/a&gt;. In detail, this design editor allows you to generate campaign materials—like personalized flyers, ads, or banners—quickly and at scale.&lt;/p&gt;
&lt;p&gt;Key features for marketing automation include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Automation&lt;/strong&gt;: Integrate with CRM or marketing tools to auto-populate templates.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dynamic Templates&lt;/strong&gt;: Easily create content with placeholders or &lt;a href=&quot;https://img.ly/docs/cesdk/react/create-templates/add-dynamic-content/text-variables-7ecb50/&quot;&gt;custom text variables&lt;/a&gt; for personalized outputs and A/B testing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Brand Compliance&lt;/strong&gt;: Lock assets like logos and fonts for consistent messaging and branding.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;ai-powered-applications&quot;&gt;&lt;strong&gt;AI-Powered Applications&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;AI is rapidly becoming a key component of more and more applications, with many integrating it in some form. Still, a critical step is often overlooked: manual editing and supervision.&lt;/p&gt;
&lt;p&gt;CreativeEditorSDK bridges that gap by seamlessly integrating with AI-powered workflows while guaranteeing users the ability to &lt;a href=&quot;https://img.ly/docs/cesdk/react/create-templates/add-dynamic-content/placeholders-d9ba8a/&quot;&gt;manually define constraints, placeholders, and rules&lt;/a&gt; that the AI-driven automation process must follow.&lt;/p&gt;
&lt;p&gt;Example of how a CE.SDK-powered React design editor could work with AI includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Automated template suggestions based on industry or use case.&lt;/li&gt;
&lt;li&gt;Prompt-based content generation where users describe their needs, and the app delivers a draft design.&lt;/li&gt;
&lt;li&gt;Automated content optimization, where the AI evaluates design elements and suggests improvements for readability and visual appeal.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AI-generated content is impressive, but it is essential to find the right balance between automation and manual control in the content generation process for the best results.&lt;/p&gt;
&lt;h3 id=&quot;product-mockups&quot;&gt;&lt;strong&gt;Product Mockups&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;CreativeEditorSDK simplifies the creation of product mockups, packaging designs, and marketing materials, including &lt;a href=&quot;https://img.ly/use-cases/print-personalization&quot;&gt;printable brochures and business cards&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;CE.SDK features powerful customization tools and flexible capabilities, including alignment guides and snap tools to ensure perfect positioning. Additionally, color pickers and vector shape editors enable you to explore and create professional design concepts.&lt;/p&gt;
&lt;h3 id=&quot;e-learning-materials&quot;&gt;&lt;strong&gt;E-Learning Materials&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Thanks to CreativeEditorSDK, you can integrate a design editor into your React e-learning application.&lt;/p&gt;
&lt;p&gt;The embeddable design editor supports the entire process of creating e-learning materials, including custom graphics like annotations, diagrams, and visual explanations, or &lt;a href=&quot;https://img.ly/products/camera-sdk&quot;&gt;videos recorded directly from the camera&lt;/a&gt; by the teachers/educators/coaches. The component also allows for the creation of unique and customized student certificates.&lt;/p&gt;
&lt;p&gt;Those features empower educators and content creators in the education sector to craft visually engaging and impactful learning materials.&lt;/p&gt;
&lt;h2 id=&quot;customization-options-with-creativeeditor-sdk&quot;&gt;Customization Options With CreativeEditor SDK&lt;/h2&gt;
&lt;p&gt;CreativeEditor SDK does not provide a static React design design experience. Instead, it offers extensive customization options to align with your application’s branding and workflow. Key customization options are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Theming&lt;/strong&gt;: Adjust the editor’s theme to match your app’s design. Choose from built-in themes, generate new ones using the &lt;a href=&quot;https://img.ly/docs/cesdk/react/user-interface/appearance/theming-4b0938/&quot;&gt;theme generator&lt;/a&gt;, or create a custom theme manually. Test themes in the &lt;a href=&quot;https://img.ly/showcases/cesdk/theming/web&quot;&gt;demo page&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom UI Plugins&lt;/strong&gt;: Add custom UI components to fit your design style through &lt;a href=&quot;https://img.ly/docs/cesdk/react/user-interface/ui-extensions-d194d1/&quot;&gt;custom plugins&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enabling/Disabling Features&lt;/strong&gt;: Tailor the editor by enabling or disabling features like specific fonts, templates, or tools.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Toolbar Customization&lt;/strong&gt;: Reposition toolbar elements, change icons, or rename tools to suit your needs, creating a unique editing experience.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom Templates, Assets, Themes&lt;/strong&gt;: Add your own templates, assets, or themes for a more personalized user experience.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Media Libraries&lt;/strong&gt;: Set up customizable, sortable media libraries. CE.SDK supports integration with third-party libraries, allowing easy access to external media assets.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom Integrations via Events&lt;/strong&gt;: Hook into the editor’s events to trigger workflows, save progress, or integrate with external systems.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Internationalization&lt;/strong&gt;: Adapt the design editor component for different languages and regions with &lt;a href=&quot;https://img.ly/docs/cesdk/react/user-interface/localization-508e20/&quot;&gt;full i18n support&lt;/a&gt;. Overwrite and extend text strings in any language.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;CreativeEditor SDK’s compatibility with React’s component-based architecture and large set of features ensures simple integration into any project, making it ideal for a wide range of industries—from marketing and e-learning to e-commerce and social media.&lt;/p&gt;
&lt;p&gt;A CE.SDK-based design editor offers UI customization and unique feature options to adapt to any use case. Additionally, its support for AI workflows ensures your application remains future-proof and ready to meet evolving user needs.&lt;/p&gt;
&lt;p&gt;By following the steps outlined in this blog post, you can bring professional-level design editing features to your web users. Explore CE.SDK’s capabilities and &lt;a href=&quot;https://img.ly/docs/cesdk/&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;</content:encoded><dc:creator>Antonello</dc:creator><media:content url="https://blog.img.ly/2025/01/react-web-design-editor.jpg" medium="image"/><category>React</category><category>Design Editor</category><category>CE.SDK</category></item><item><title>CE.SDK v1.33 Release Notes</title><link>https://img.ly/blog/creative-editor-sdk-v-1-33-0-release-notes/</link><guid isPermaLink="true">https://img.ly/blog/creative-editor-sdk-v-1-33-0-release-notes/</guid><description>Explore new mobile design and photo editor configurations, plugins for UI customization, voiceover capabilities, and more.</description><pubDate>Thu, 29 Aug 2024 12:08:57 GMT</pubDate><content:encoded>&lt;p&gt;Welcome to the latest update of CE.SDK! We are bringing you new features that enhance your app’s creative capabilities and user experience. This release includes Configurations for a Design Editor or Photo Editor on iOS and Android, Plugins, Voiceover Capabilities, and more.&lt;/p&gt;
&lt;p&gt;With this release, you can:&lt;/p&gt;
&lt;h2 id=&quot;integrate-a-design-editor-on-ios-and-android&quot;&gt;Integrate a Design Editor on iOS and Android&lt;/h2&gt;
&lt;p&gt;&lt;video src=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/1-33/page-management-cesdk.mp4&quot; controls autoplay muted loop playsinline&gt;&lt;/video&gt;&lt;/p&gt;
&lt;p&gt;Get started with our new Design Editor configuration for iOS and Android. The out-of-the-box package is designed for easy creation and management of multipage designs.&lt;/p&gt;
&lt;p&gt;Users can switch between editing and the page overview mode to review and adjust their work.&lt;/p&gt;
&lt;p&gt;Keep the design process straightforward and efficient: the editor features a dock at the bottom, offering convenient access to essential tools like adding text, images, stickers, and uploading new assets. Additionally, you can insert a photo directly from your camera.&lt;/p&gt;
&lt;h3 id=&quot;key-features&quot;&gt;&lt;strong&gt;Key Features&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Page Management&lt;/strong&gt;&lt;br&gt;
Create and manage your design pages within a template. It’s easy to create fun carousel posts, as seen on Instagram and LinkedIn, or create a series. Head to the ‘Pages’ icon on the top right bar. In the page overview, you can create, duplicate, and edit a page. Lastly, you can change the order of pages by moving them up and down.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Image Settings&lt;/strong&gt;&lt;br&gt;
Selecting an image lets you fine-tune adjustment settings, and add filters, effects, or blur. Easily crop, straighten, rotate, or flip images.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://apps.apple.com/us/app/img-ly-design-editor/id1672991141&quot;&gt;Try the Design Editor Configuration on iOS&lt;/a&gt; and &lt;a href=&quot;https://play.google.com/store/apps/details?id=ly.img.cesdk.catalog&amp;#x26;pli=1&quot;&gt;Android&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;use-plugins-to-customize-ui-and-add-quick-actions&quot;&gt;Use Plugins to Customize UI and Add Quick Actions&lt;/h2&gt;
&lt;p&gt;We’re excited to introduce the first part of our plugin release for CE.SDK on the web: with this release, you can tailor the editor’s UI elements, reorder components, and add quick actions like &lt;strong&gt;background removal.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;grafik.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1886px) 1886px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1886&quot; height=&quot;1289&quot; src=&quot;https://img.ly/_astro/plugins-customize-UI_Z1V1dcA.webp&quot; srcset=&quot;/_astro/plugins-customize-UI_Z1VSlKa.webp 640w, /_astro/plugins-customize-UI_1qIha2.webp 750w, /_astro/plugins-customize-UI_XGkYN.webp 828w, /_astro/plugins-customize-UI_ZBDlJC.webp 1080w, /_astro/plugins-customize-UI_Z1fvfbb.webp 1280w, /_astro/plugins-customize-UI_Z1uBYIU.webp 1668w, /_astro/plugins-customize-UI_Z1V1dcA.webp 1886w&quot;&gt;&lt;/p&gt;
&lt;p&gt;We’ve enabled extension points within key areas of the UI: the Canvas, Navigation bar, Inspector Bar, Dock, and Canvas Menu. Modify the appearance of existing features, register new components, and integrate quick actions. For example, you can add a “Background Removal” button directly in the Canvas Menu or create complex interactions like custom cut-out lines.&lt;/p&gt;
&lt;p&gt;For more details on this first batch release and the upcoming plugins, please read our dedicated &lt;a href=&quot;https://img.ly/blog/plugin-release-part-1-customizing-the-ui-quick-actions/?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=releasenotes&quot;&gt;article&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;add-voiceovers-to-videos-on-ios&quot;&gt;Add Voiceovers to Videos on iOS&lt;/h2&gt;
&lt;p&gt;&lt;video src=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/1-33/voice-over.mp4&quot; controls autoplay muted loop playsinline&gt;&lt;/video&gt;&lt;/p&gt;
&lt;p&gt;Add voiceover tracks directly within your mobile app, making your projects more dynamic and engaging. Whether creating a tutorial, narrating a slideshow, or adding commentary to a video, this feature allows you to seamlessly record, edit, and integrate voiceovers.&lt;/p&gt;
&lt;p&gt;The popular feature, as enjoyed on TikTok and Instagram, is a staple for content creation and adds a personal touch to video creations.&lt;/p&gt;
&lt;p&gt;To get started, navigate to “Add Audio”, select “Voiceover” section and start recording. You can preview the recording, re-record it, and add more audio, such as music. Adjust the audio levels for a balanced background track.&lt;/p&gt;
&lt;p&gt;Try recording a voiceover with our Demo App for &lt;a href=&quot;https://apps.apple.com/us/app/img-ly-design-editor/id1672991141&quot;&gt;iOS&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;integrate-a-photo-editor-for-ios-and-android&quot;&gt;Integrate a Photo Editor for iOS and Android&lt;/h2&gt;
&lt;p&gt;Our new &lt;strong&gt;Photo Editor Configuration&lt;/strong&gt; is designed to offer an intuitive, out-of-the-box solution that bundles a range of key photo editing capabilities. Enhance individual photos, add text and shapes, or apply filters—this configuration is a kick-start to provide high-quality photo editing for iOS and Android with CE.SDK.&lt;/p&gt;
&lt;p&gt;&lt;video src=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/1-33/photo-editor-cesdk.mp4&quot; controls autoplay muted loop playsinline&gt;&lt;/video&gt;&lt;/p&gt;
&lt;h3 id=&quot;key-features-1&quot;&gt;Key Features&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Crop, Resize&lt;/strong&gt;&lt;br&gt;
Crop, straighten, flip, resize, and rotate your photos.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adjustments&lt;/strong&gt;&lt;br&gt;
Fine-tune your photos by adjusting brightness, contrast, and other key settings, ensuring your images look their best.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Text, Shapes, and Stickers&lt;/strong&gt;&lt;br&gt;
Enhance your photos by adding and customizing text, shapes, and stickers. Whether you’re creating eye-catching titles, intricate shapes, or playful stickers—our configuration gives you the flexibility to adjust fonts, font colors, sizes, and positions to perfectly match your vision.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Effects, Filters, Blur, Blending Modes&lt;/strong&gt;&lt;br&gt;
Transform your images with fun effects, blur, and filters. Apply overlays to add depth and texture to your photos by adjusting blend modes and opacity to achieve the perfect effect.&lt;/p&gt;
&lt;p&gt;Additionally, use our range of photo filters to set the mood, from warm and nostalgic tones to vibrant, modern effects, giving your images a distinctive and professional look.&lt;/p&gt;
&lt;p&gt;Check our &lt;a href=&quot;https://img.ly/docs/cesdk/ios/prebuilt-solutions/photo-editor-42ccb2/?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=releasenotes&quot;&gt;documentation&lt;/a&gt; to get started with our photo editor configuration, or &lt;a href=&quot;https://apps.apple.com/us/app/img-ly-design-editor/id1672991141&quot;&gt;try the photo editor on iOS&lt;/a&gt; and &lt;a href=&quot;https://play.google.com/store/apps/details?id=ly.img.cesdk.catalog&amp;#x26;pli=1&quot;&gt;Android&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;improvements&quot;&gt;Improvements&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Preview Audio on iOS and Android&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;video src=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/1-33/prev-audio.mp4&quot; controls autoplay muted loop playsinline&gt;&lt;/video&gt;&lt;/p&gt;
&lt;p&gt;We’ve made it easier to select the perfect audio clip for your projects. Listen to audio tracks directly within the interface before adding them to your video. Tap the play button of an audio clip in the asset library to preview it, and adjust your audio clip within the timeline.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Resize Pages&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;video src=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/1-33/resizable-pages-short.mp4&quot; controls autoplay muted loop playsinline&gt;&lt;/video&gt;&lt;/p&gt;
&lt;p&gt;Resize pages in your web editor by simply grabbing corners and side handles, moving beyond the limitations of input fields or preset format sizes. This intuitive resizing integrates seamlessly with other adjustments, such as image cropping, ensuring a smooth workflow. Enable or disable this behavior as needed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Create Rounded Corners&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;video src=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/1-33/rounded-corners-short.mp4&quot; controls autoplay muted loop playsinline&gt;&lt;/video&gt;&lt;/p&gt;
&lt;p&gt;You can now easily create rounded corners for images on the web, iOS and Android. Within your designs, you can add a sleek and modern touch to your projects.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Drag and Select Multiple Elements&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;video src=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/1-33/drag-select.mp4&quot; controls autoplay muted loop playsinline&gt;&lt;/video&gt;&lt;/p&gt;
&lt;p&gt;You can now click and drag with your mouse to draw a selection rectangle, instantly selecting all blocks within the covered area. This feature saves you time and effort, working with complex templates.&lt;/p&gt;
&lt;p&gt;Thanks for reading! 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=releasenotes&quot;&gt;reach out&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 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;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Please note that these release notes also include improvements from previous versions.&lt;/em&gt;&lt;/p&gt;</content:encoded><dc:creator>Neslihan</dc:creator><media:content url="https://blog.img.ly/2024/08/cesdk-1-32-133-imgly.png" medium="image"/><category>Release Notes</category><category>App Development</category><category>iOS App Development</category><category>Android App Development</category><category>Design Editor</category></item><item><title>IMG.LY Research: AI-based Generative Design Editing</title><link>https://img.ly/blog/img-ly-research-ai-based-generative-editing/</link><guid isPermaLink="true">https://img.ly/blog/img-ly-research-ai-based-generative-editing/</guid><description>Combine Large Language Models (LLMs) with CE.SDK for design edits and automated creative workflows.</description><pubDate>Tue, 16 Jul 2024 10:44:05 GMT</pubDate><content:encoded>&lt;p&gt;Generative AI is transforming the tech landscape, finding applications in virtually every field. At &lt;a href=&quot;https://img.ly/?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=generative-editing&quot;&gt;IMG.LY&lt;/a&gt;, we’re exploring how these advancements can revolutionize creative workflows. This article presents a research project, where we integrate Large Language Models (LLMs) with our flagship product, CreativeEditor SDK (CE.SDK), to enable natural language-driven design edits.&lt;/p&gt;
&lt;p&gt;Our flagship product, CreativeEditor SDK (CE.SDK) allows for advanced creative workflows for countless use cases in industries ranging from &lt;a href=&quot;https://img.ly/industries/print&quot;&gt;print&lt;/a&gt; to &lt;a href=&quot;https://img.ly/industries/marketing-tech&quot;&gt;marketing tech&lt;/a&gt;. Most use cases can be realized with the out-of-the-box feature set, but it also exposes a best-in-class API, called Engine API, to build complex custom workflows with designs and videos.&lt;/p&gt;
&lt;p&gt;In this article, we will showcase how to combine our CE.SDK Engine API with LLMs to edit designs with natural language.&lt;/p&gt;
&lt;p&gt;&lt;video src=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/imgly-research/imgly-ai-template-editor-demo.mp4&quot; controls autoplay muted loop playsinline&gt;&lt;/video&gt;&lt;/p&gt;
&lt;h2 id=&quot;introduction-to-llms&quot;&gt;Introduction to LLMs&lt;/h2&gt;
&lt;p&gt;Generative AI is often associated with chatbots, but its capabilities stretch further. It is a versatile text processor that can transform any textual input into various structured outputs. This adaptability is due to its training on diverse textual patterns, allowing it to support a wide range of text-to-text applications beyond just generating conversational prose.&lt;/p&gt;
&lt;p&gt;Carefully crafting an input text (prompt) in a way that instructs the LLM to output a specific structured output format allows us to use LLMs to solve almost any arbitrary text-based task.&lt;/p&gt;
&lt;p&gt;Crafting prompts is an art in itself. When ensuring that we receive the required output we need to adhere to the following steps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Consider what type of data our model was trained on to ensure the correct formatting of our input text. The most basic example is using English as our “main prompt language” since most LLMs are mainly trained on English text samples.&lt;/li&gt;
&lt;li&gt;All necessary problem-specific information to solve the task needs to be included in the prompt. While LLMs often possess an inherent understanding of the world inferred from the vast amount of text they are trained on, they may not know much about our specific problem. Furthermore, LLMs have the notorious tendency to hallucinate, that is fill in missing context with incoherent or incorrect information. To ensure the best performance, the input to the LLM must provide as much context as possible.&lt;/li&gt;
&lt;li&gt;Finally, we need to instruct the LLM well enough to output text-based data in a format we can then parse and process.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;human-vs-ai-workflows-for-executing-design-tasks&quot;&gt;Human vs. AI Workflows for Executing Design Tasks&lt;/h2&gt;
&lt;p&gt;We started this project with the vision to use generative AI to magically handle requests like these (in increasing order of complexity):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Make the logo bigger&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Translate this design into German&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Adopt this template to our brand colors and brand assets&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Transform this Instagram story portrait design into a landscape YouTube thumbnail&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When trying to delegate a task to an AI, it’s best to start by thinking about how these tasks are currently solved by humans.&lt;/p&gt;
&lt;p&gt;Let’s walk through how a human would complete a task such as&lt;br&gt;
&lt;code&gt;Make the logo bigger&lt;/code&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Humans would visually scan the design and automatically segment it by its elements such as objects, backgrounds, or text.&lt;/li&gt;
&lt;li&gt;Humans would then read and comprehend the task “Make the logo bigger”&lt;/li&gt;
&lt;li&gt;Finally, users would use their existing knowledge of how to move and interact with design software to fulfill the task by manipulating the individual elements in the design.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Based on these considerations we can extract the implicit knowledge necessary to fulfill a task and make it explicit for the benefit of our LLM.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Design Representation:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To enable the LLM to understand and manipulate a design, it is essential to provide a representation of the design. This can be either textual or a mix of textual and visual (if the LLM has vision capabilities) data. While supplying the current design as a raster image to the LLM is trivial, serializing a CE.SDK design into a textual format requires a custom serialization process. The textual representation is important since it allows the LLM to identify, address, and comprehend the different components of the design effectively.&lt;/p&gt;
&lt;p&gt;Refer to &lt;code&gt;Appendix: Use-Case dependent serialization of CE.SDK Designs&lt;/code&gt; for a more in-depth explanation of how to accomplish this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Editing Protocol:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;LLMs do not interact with design software using traditional human interfaces like a mouse, keyboard, or visual feedback. Therefore, we need a specific protocol for the LLM to propose changes to the design. We have developed a method where we pass a textual representation of the design to the LLM as part of the prompt so that the LLM can indicate changes to the design by returning a modification of this representation.&lt;/p&gt;
&lt;p&gt;Practically, this means that if we pass in an element such as &lt;code&gt;&amp;#x3C;Image id=&quot;1337&quot; x=”100” y=&quot;100&quot; .../&gt;&lt;/code&gt;, the LLM can change those x and y attributes by simply returning &lt;code&gt;&amp;#x3C;Image id=&quot;1337&quot; x=&quot;0&quot; y=&quot;0&quot; .. /&gt;&lt;/code&gt; inside its output text. Since we can identify the design element that was changed using the ID attribute, we can then calculate the programmatic changes that need to be applied to the design, like in this case &lt;code&gt;engine.block.setPositionX(1337, 0)&lt;/code&gt; and &lt;code&gt;engine.block.setPositionY(1337, 0)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Refer to &lt;code&gt;Appendix: Parsing and transforming LLM response&lt;/code&gt; for a deeper look into this topic.&lt;/p&gt;
&lt;h2 id=&quot;using-generative-ai-to-execute-design-related-tasks&quot;&gt;Using Generative AI to Execute Design-Related Tasks&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;Employ LLMs to modify and improve CE.SDK design templates.&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;879&quot; src=&quot;https://img.ly/_astro/ai-generated-design-templates-LLM_1BWRFe.webp&quot; srcset=&quot;/_astro/ai-generated-design-templates-LLM_1etJt1.webp 640w, /_astro/ai-generated-design-templates-LLM_Z2amSOe.webp 750w, /_astro/ai-generated-design-templates-LLM_2jWNYV.webp 828w, /_astro/ai-generated-design-templates-LLM_Lp5Ga.webp 1080w, /_astro/ai-generated-design-templates-LLM_2qLpKx.webp 1280w, /_astro/ai-generated-design-templates-LLM_Z1OfXUH.webp 1668w, /_astro/ai-generated-design-templates-LLM_1BWRFe.webp 2000w&quot;&gt;&lt;/p&gt;
&lt;p&gt;Based on what we have learned, we assemble a workflow, with the LLM as the center point that allows the LLM to execute design-related tasks on any of our CE.SDK designs. This workflow can be divided into two sub-tasks: Composing an input text (prompt) with all necessary context and parsing and applying the output of the LLM to the CE.SDK design.&lt;/p&gt;
&lt;h3 id=&quot;composing-the-input-text&quot;&gt;Composing the Input Text&lt;/h3&gt;
&lt;p&gt;As seen in the graphic above we first compose the input text based on different components to provide the model with all necessary context to fulfill the user’s editing request: This includes a general text to “instruct” the model, the actual request that the user entered, an exemplary design representation to explain our output format to the model and a representation of the currently edited design.&lt;/p&gt;
&lt;p&gt;The general, static text to “instruct” the model is composed of the following three parts.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;What we are trying to achieve in general:&lt;br&gt;
&lt;code&gt;&quot;You are an AI with expertise in design, specifically focused on XML representations of designs&quot;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Output format instructions:&lt;br&gt;
&lt;em&gt;Your responses should only contain one XML document. Ensure that you do not introduce new attributes to any XML elements. You can change image elements by setting the alt attribute, which then will be used to search Unsplash for a fitting image. A sample alt text is “A mechanic changing tires with a pair of beautiful work gloves on”.&lt;br&gt;
Additionally, pay close attention to the layout: verify that no elements in the XML document extend beyond the page boundaries. This constraint is critical for maintaining consistency and accuracy in XML formatting. Always double-check your XML output for these requirements.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;The actual user request:&lt;br&gt;
e.g., &lt;code&gt;&quot;Make the logo bigger&quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;By including a textual representation of a comprehensive example design we can show the model which layer types are available as well as which properties of those layers can be manipulated.&lt;/p&gt;
&lt;p&gt;The model now has all the necessary context and building blocks to respond to user requests in a format that we can process downstream.&lt;/p&gt;
&lt;h3 id=&quot;applying-the-output-text&quot;&gt;Applying the Output Text&lt;/h3&gt;
&lt;p&gt;In the first step, we scan the output text for an XML-like document and if we find one, attempt to parse it.&lt;/p&gt;
&lt;p&gt;This will yield a structured data object we can compare to the one we passed in and calculate which elements have been modified, added, or removed.&lt;/p&gt;
&lt;p&gt;The resulting change set can then be translated into specific calls to the &lt;a href=&quot;https://img.ly/docs/cesdk/js/user-interface/ui-extensions-d194d1/&quot;&gt;CE.SDK Engine API&lt;/a&gt; to change the current design.&lt;/p&gt;
&lt;h2 id=&quot;issues-faced&quot;&gt;Issues faced&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Latency&lt;/strong&gt;: One issue with state-of-the-art models is their big latency: Each LLM response contains approximately 1000 tokens. That means each request takes 7-45 seconds (depending on the model) to complete. This long delay may be unacceptable for some user experiences. However, we see this issue as transitory and expect upcoming models to have much smaller latency while maintaining their capabilities.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pricing&lt;/strong&gt;: Each request/response with GPT-4 turbo as a backing model costs around 5 cents and restricts some use cases. We also expect the pricing to drop significantly. The new GPT-4o model for example reduces the price by half.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hallucinations&lt;/strong&gt;: LLMs do not always follow the instructions properly and, e.g., produce output that is not parsable. Hallucinations directly correlate with the capabilities of the model and this issue is not apparent at current state-of-the-art LLMs like e.g GPT-4/GPT-4o.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;We present a novel and adaptable approach to use Generative AI and LLMs specifically to interact with IMG.LY’s CreativeEditor SDK. We showcase how this technology can be used to execute common design requests on arbitrary CE.SDK Designs. The proposition that LLMs can understand textual representations of visual elements was by no means obvious. This research project has revealed that it is very well within the scope of LLMs to translate instructions from a visual semantic context to its textual representation and back. This invites more inquiries into LLMs as assistants for tasks with a heavy visual component such as design.&lt;/p&gt;
&lt;p&gt;While further research is needed to make this technology available in production environments, we are confident that Generative AI-based editing will play a big role in the future of Graphics and Video editing.&lt;/p&gt;
&lt;h2 id=&quot;appendix-use-case-dependent-serialization-of-cesdk-designs&quot;&gt;Appendix: Use-case Dependent Serialization of CE.SDK Designs&lt;/h2&gt;
&lt;p&gt;LLMs work based on “tokens” which are equal to words. However, a design, like e.g a poster design or a social media graphic, is highly visual. That means that we need a way to convert a design into text, a way to serialize it. Our CE.SDK engine can serialize an existing scene using our &lt;code&gt;engine.block.saveToString&lt;/code&gt; method. However, this serialization contains a huge pile of information that is not necessary to do edits inside the file. LLMs are priced by token and their speed is also relative to the number of tokens the input and output have. Thus, the number of tokens should be reduced.&lt;/p&gt;
&lt;p&gt;We looked at several ways to convert the current state of the design into a textual representation. Since GenAI is trained on a lot of (X)HTML which has an XML-like format, we decided to serialize any designs into a tag-based XML-like format.&lt;/p&gt;
&lt;p&gt;The IMG.LY editor internally refers to design elements like images or texts as “blocks”. These blocks are uniquely identifiable and addressable using a numeric ID. We use this ID to be able to identify a serialized design block in the input and output of the LLM. Example: &lt;code&gt;&amp;#x3C;Image id=&quot;12582927&quot; x=&quot;0&quot; y=&quot;0&quot; width=&quot;800&quot; height=&quot;399&quot; /&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;For each of the CE.SDK block types like e.g “Text” or “Graphics” (representing images or vector shapes), we will the CE.SDK Engine API to query very specific data from the block. That means that for example we only have a text attribute for Text blocks.&lt;/p&gt;
&lt;p&gt;This rather specific mapping of only certain properties from the CE.SDK design into the text serialization allows us to optimize the design serialization for different use cases. A use-case where we e.g. want to automatically name each layer does maybe not require fine-grained information about e.g the font size.&lt;/p&gt;
&lt;h2 id=&quot;appendix-parsing-and-transforming-llm-response&quot;&gt;Appendix: Parsing and transforming LLM response&lt;/h2&gt;
&lt;p&gt;The LLM answers with arbitrary tokens. It’s not possible to restrict the response to a certain syntax. By settling on a well-defined and widely used format we instruct the model to also reply with an XML-like document, similar to the one we passed in as “current state”.&lt;/p&gt;
&lt;p&gt;After receiving the LLM’s Response we first make sure that only a single XML document is present inside the response. We then compare the retrieved XML document with the state of the Design that we passed into the LLM and generate a change set. This change set contains entries like “Color of block with ID=123 has changed”. These change set entries are then converted into programmatic commands, like e.g &lt;code&gt;engine.block.setColor(123)&lt;/code&gt; and executed on the current design.&lt;/p&gt;
&lt;p&gt;One challenges when working with an LLM is the inability to restrict the output space. Thus, we are never guaranteed that the LLM did not add e.g new XML node names or that it even replies with a proper, valid XML-like document. The only lever to influence the probability of a proper XML-like document is to use strong prompting and LLM that are good at following those instructions.&lt;/p&gt;
&lt;p&gt;In our tests, state-of-the-art models like GPT-4 can follow those instructions without any further tooling.&lt;/p&gt;
&lt;h2 id=&quot;further-research-topics&quot;&gt;Further Research Topics&lt;/h2&gt;
&lt;p&gt;It’s also worth exploring fine-tuning an LLM specifically for this task which could improve the performance of the LLM for the specific tasks.&lt;/p&gt;
&lt;p&gt;It would also be possible to use more advanced libraries like &lt;a href=&quot;https://github.com/guidance-ai/guidance&quot;&gt;Guidance&lt;/a&gt;, which allows to define a grammar for the LLM response thus making sure that the output of the LLM is always parseable.&lt;/p&gt;
&lt;p&gt;Another way to improve the performance would be to methodically test different prompt templates and find a way to measure and compare the output quality.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Thank you for reading!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3,000+ creative professionals gain exclusive access and hear of our releases first—&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 and never miss out.&lt;/strong&gt;&lt;/p&gt;</content:encoded><dc:creator>Mirko</dc:creator><media:content url="https://blog.img.ly/2024/07/0_AI-Template-generator.jpg" medium="image"/><category>AI</category><category>Automation</category><category>Design Editor</category><category>Machine Learning</category></item><item><title>Unleash Creativity with CE.SDK’s New Plugin System</title><link>https://img.ly/blog/img-ly-sdk-plugin-system/</link><guid isPermaLink="true">https://img.ly/blog/img-ly-sdk-plugin-system/</guid><description>Teaser: Our new Plugin System empowers customization and creativity with one-click features, smart design tools, and generative AI.</description><pubDate>Mon, 03 Jun 2024 08:42:25 GMT</pubDate><content:encoded>&lt;p&gt;At IMG.LY, we have always believed that a superb design editor should be effortlessly customizable and extensible. We are thrilled to roll out a brand-new Plugin system for CE.SDK in the upcoming months—to take creative editing and feature development to the next level.&lt;/p&gt;
&lt;p&gt;Starting with one-click features like background removal or vectorizers, smart design tools like QR codes or subtitle generators, and deeply interactive features like generative AI for text and images; all these tools can be used or built by customers soon.&lt;/p&gt;
&lt;p&gt;Additionally, our upcoming Plugin system will bring you unparalleled autonomy by making feature development for our SDK accessible and offering extensive options to reconfigure our editor’s UI.&lt;/p&gt;
&lt;p&gt;Start exploring our Plugin System rollout now to immediately benefit from upcoming features.&lt;/p&gt;
&lt;h2 id=&quot;built-for-modification&quot;&gt;Built for Modification&lt;/h2&gt;
&lt;p&gt;Let’s dive deep into some of the opportunities CE.SDK plugins help unlock.&lt;/p&gt;
&lt;h3 id=&quot;unlocking-the-ai-revolution&quot;&gt;Unlocking the AI Revolution&lt;/h3&gt;
&lt;p&gt;While the AI transformation is already fully underway, much of the tech is still not very accessible to product builders, often requiring deep technical knowledge to get started. At the same time, AI features become significantly more valuable when integrated with other editing functionalities in workflows or automation. With our plugins, we aim to make it effortless to leverage innovation and put it to use.&lt;/p&gt;
&lt;h3 id=&quot;boosting-customer-autonomy&quot;&gt;Boosting Customer Autonomy&lt;/h3&gt;
&lt;p&gt;Key to our success is providing maximum flexibility and autonomy to our customers about product decisions. Ultimately, you shouldn’t depend on our product roadmap; rather, you should be able to add features when you like. While our SDKs are already highly configurable, plugins allow tailoring the whole user experience not only on a look &amp;#x26; feel level but through custom functionalities and editing experiences.&lt;/p&gt;
&lt;h3 id=&quot;accelerate-product-expansion&quot;&gt;Accelerate Product Expansion&lt;/h3&gt;
&lt;p&gt;Many ecosystems witnessed explosive growth in added value to the user after releasing plugin mechanisms. Currently, only IMG.LY core developers can contribute to the SDK. We have started to extend this to solution engineers and even designers on our team who don’t have much knowledge of the inner workings of the SDK. Ultimately, we will push this more and more into a community of contributors, making the community’s innovation accessible to everyone.&lt;/p&gt;
&lt;h2 id=&quot;key-concepts&quot;&gt;Key Concepts&lt;/h2&gt;
&lt;p&gt;Three important concepts have driven the development of our Plugins:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Customizable Menu Bars&lt;/strong&gt;&lt;br&gt;
We are extending our API so that it allows easy hooking into various parts of the UI. Our editor has key components like the inspector, toolbar, and on-canvas menu. These are now all accessible through an API, so you can hook your feature anywhere in the editor.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Easily hook your features anywhere in the editor.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1920px) 1920px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1920&quot; height=&quot;1080&quot; src=&quot;https://img.ly/_astro/key-concept-plugins-sdk-1_Z7C57k.webp&quot; srcset=&quot;/_astro/key-concept-plugins-sdk-1_Z1cMp6H.webp 640w, /_astro/key-concept-plugins-sdk-1_1mLpHS.webp 750w, /_astro/key-concept-plugins-sdk-1_1vy6cU.webp 828w, /_astro/key-concept-plugins-sdk-1_Z2cAeFG.webp 1080w, /_astro/key-concept-plugins-sdk-1_Z13AeBp.webp 1280w, /_astro/key-concept-plugins-sdk-1_2dEjpa.webp 1668w, /_astro/key-concept-plugins-sdk-1_Z7C57k.webp 1920w&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UI Building Blocks to Provide Consistency&lt;/strong&gt;&lt;br&gt;
To reach a high level of consistency and speed up time for development, we will be providing out-of-the-box UI components such as buttons, sliders, text inputs, etc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Escape Hatches&lt;/strong&gt;&lt;br&gt;
From experience, we know that sometimes unique functionality needs unique solutions, so we have added escape hatches to add custom elements via HTML whenever needed.&lt;/p&gt;
&lt;h2 id=&quot;what-can-you-build-with-our-plugin-system&quot;&gt;What Can You Build with our Plugin System?&lt;/h2&gt;
&lt;p&gt;Let’s explore some potential use cases of the plugin system.&lt;/p&gt;
&lt;h3 id=&quot;custom-actions&quot;&gt;Custom Actions&lt;/h3&gt;
&lt;p&gt;Adding custom actions is a great option to make simple third-party APIs accessible within the editor. This can be &lt;strong&gt;one-click edits&lt;/strong&gt; such as background removal, vectorizers, or auto-enhancement for images. You can also add custom actions for text in combination with Large Language Models (LLM) to provide features like autocorrection and improved writing, etc.&lt;/p&gt;
&lt;p&gt;&lt;video src=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/plugin-release/background-removal-plugin-sdk.mp4&quot; controls autoplay muted loop playsinline&gt;&lt;/video&gt;&lt;/p&gt;
&lt;h3 id=&quot;custom-tools&quot;&gt;Custom Tools&lt;/h3&gt;
&lt;p&gt;Some custom functionality will require more than just a single button, e.g., to &lt;strong&gt;generate AI images&lt;/strong&gt;, background patterns, QR codes, or maps. In these cases, you’ll require sliders, text input, drop-downs, and many other UI elements. With plugins, you can easily create panels with your own UI to bring any custom tool to life.&lt;/p&gt;
&lt;p&gt;&lt;video src=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/plugin-release/ai-generator-plugin-sdk.mp4&quot; controls autoplay muted loop playsinline&gt;&lt;/video&gt;&lt;/p&gt;
&lt;h3 id=&quot;custom-assets--presets&quot;&gt;Custom Assets &amp;#x26; Presets&lt;/h3&gt;
&lt;p&gt;Apart from building custom tools, you can also bundle and group effects into presets and make them accessible in a custom panel. This is especially useful to simplify the design process or create standard design components: for example, providing beautiful text presets will enable your users to create instantly great text designs without any design knowledge.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Bundle presets or sticker packs for a stylish, simple design process.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1920px) 1920px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1920&quot; height=&quot;1080&quot; src=&quot;https://img.ly/_astro/custom-bundles-sdk-s_Z2eX5Wk.webp&quot; srcset=&quot;/_astro/custom-bundles-sdk-s_wWPTG.webp 640w, /_astro/custom-bundles-sdk-s_WbFjy.webp 750w, /_astro/custom-bundles-sdk-s_Zx5C9.webp 828w, /_astro/custom-bundles-sdk-s_Z1MpguG.webp 1080w, /_astro/custom-bundles-sdk-s_1RCU0T.webp 1280w, /_astro/custom-bundles-sdk-s_Z1MVQn1.webp 1668w, /_astro/custom-bundles-sdk-s_Z2eX5Wk.webp 1920w&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;custom-libraries&quot;&gt;&lt;strong&gt;Custom Libraries&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Integrate third-party libraries, such as Unsplash, Getty Images, Pexels, or your own.&lt;/p&gt;
&lt;p&gt;&lt;video src=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/plugin-release/photo-library-sdk-unsplash.mp4&quot; controls autoplay muted loop playsinline&gt;&lt;/video&gt;&lt;/p&gt;
&lt;h3 id=&quot;custom-editor-behavior&quot;&gt;Custom Editor Behavior&lt;/h3&gt;
&lt;p&gt;Some of our customers asked us how they could move a functionality from one place in the editor to another. Let’s say you wish to move the function ‘move to front’ from the inspector to the canvas menu. This is not a problem! You can do this by using the internal API endpoints of our editor.&lt;/p&gt;
&lt;p&gt;As for custom editor behavior, you can do far more than just move functionality. Here is a demo of layer lists we built as a plugin.&lt;/p&gt;
&lt;p&gt;&lt;video src=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/plugin-release/layer-list-editor-sdk.mp4&quot; controls autoplay muted loop playsinline&gt;&lt;/video&gt;&lt;/p&gt;
&lt;h3 id=&quot;custom-user-feedback&quot;&gt;Custom User Feedback&lt;/h3&gt;
&lt;p&gt;Additionally, you can enhance the canvas with overlays, which are useful for providing alerts, instructions, or feedback directly on the canvas.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Provide instant design feedback to users, such as cut-off text or images.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1920px) 1920px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1920&quot; height=&quot;1080&quot; src=&quot;https://img.ly/_astro/custom-user-notification-design-feedback-1_Z1dtpGM.webp&quot; srcset=&quot;/_astro/custom-user-notification-design-feedback-1_1qQrVb.webp 640w, /_astro/custom-user-notification-design-feedback-1_yfu3B.webp 750w, /_astro/custom-user-notification-design-feedback-1_Z2ctvGd.webp 828w, /_astro/custom-user-notification-design-feedback-1_1CxUVl.webp 1080w, /_astro/custom-user-notification-design-feedback-1_29zsPe.webp 1280w, /_astro/custom-user-notification-design-feedback-1_Z81FNb.webp 1668w, /_astro/custom-user-notification-design-feedback-1_Z1dtpGM.webp 1920w&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;whats-next&quot;&gt;What’s Next&lt;/h2&gt;
&lt;p&gt;We are now rolling out Plugins and building an initial set of features through Plugins ourselves—available for the web first, and mobile SDKs will follow. Keep your eyes peeled for our next releases and don’t hesitate to &lt;a href=&quot;https://img.ly/forms/contact-sales&quot;&gt;get in touch&lt;/a&gt; with us to learn more about plugins, and how your product benefits from integration without losing time and resources.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Thank you for reading. Join 3,000+ creative professionals—&lt;a href=&quot;https://share.hsforms.com/1IgAOV1wASXGPnFG4ZPLejg1hk3i&quot;&gt;subscribe&lt;/a&gt; to our newsletter for updates on new features, plugins, early access, and more!&lt;/strong&gt;&lt;/p&gt;</content:encoded><dc:creator>Daniel</dc:creator><dc:creator>Eray</dc:creator><media:content url="https://blog.img.ly/2024/05/plugin-sdk-design-img-ly-s.jpg" medium="image"/><category>Plugin</category><category>App Development</category><category>Design Editor</category><category>Company</category></item><item><title>CE.SDK v1.25 Release Notes</title><link>https://img.ly/blog/creative-editor-sdk-v-1-25-0-release-notes/</link><guid isPermaLink="true">https://img.ly/blog/creative-editor-sdk-v-1-25-0-release-notes/</guid><description>Recolor images, such as T-shirt mockups, remove green screen backgrounds, and preview audio directly in your app. </description><pubDate>Tue, 07 May 2024 11:43:59 GMT</pubDate><content:encoded>&lt;p&gt;Welcome to the latest update from our team! Since our &lt;a href=&quot;https://img.ly/blog/creative-editor-sdk-v-1-23-0-release-notes/&quot;&gt;last release&lt;/a&gt;, we have been working to bring more creative capabilities to your app and improve user experience. With this release, you can:&lt;/p&gt;
&lt;h2 id=&quot;recolor-images-like-t-shirt-mockups&quot;&gt;Recolor Images like T-shirt Mockups&lt;/h2&gt;
&lt;p&gt;&lt;video src=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/1-25/recolor-images-editor-sdk.mp4&quot; controls autoplay muted loop playsinline&gt;&lt;/video&gt;&lt;/p&gt;
&lt;p&gt;Replace colors in any image with our new recoloring feature. Select a color you want to change, choose its replacement, and apply the changes. Recoloring is ideal for tasks like altering the color of specific elements, such as t-shirts in product photos.&lt;/p&gt;
&lt;p&gt;Simply choose your image, navigate to Effects, and select “Recolor”. Choose the color you want to change (Source Color), and the color you want to replace it with (Target Color). For a more refined result, adjust “Smoothness”, “Color Match”, and “Brightness Match”.&lt;/p&gt;
&lt;p&gt;&lt;video src=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/1-25/recoloring_androids.mp4&quot; controls autoplay muted loop playsinline&gt;&lt;/video&gt;&lt;/p&gt;
&lt;p&gt;This feature is available on &lt;strong&gt;Web&lt;/strong&gt;, &lt;strong&gt;Android&lt;/strong&gt;, and &lt;strong&gt;iOS&lt;/strong&gt; platforms.&lt;/p&gt;
&lt;p&gt;Check our &lt;a href=&quot;https://img.ly/docs/cesdk/js/filters-and-effects/add-c796ba/&quot;&gt;documentation&lt;/a&gt; on filters and effects to learn more.&lt;/p&gt;
&lt;h2 id=&quot;create-transparency-with-a-green-screen&quot;&gt;Create Transparency with a Green Screen&lt;/h2&gt;
&lt;p&gt;&lt;video src=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/1-25/green-screen-video-sdk.mp4&quot; controls autoplay muted loop playsinline&gt;&lt;/video&gt;&lt;/p&gt;
&lt;p&gt;Easily make green screen backgrounds transparent in your &lt;strong&gt;images&lt;/strong&gt; and &lt;strong&gt;videos on the Web,&lt;/strong&gt; and for images on &lt;strong&gt;Android and iOS&lt;/strong&gt;. Our Green Screen Effect is tailored to identify and eliminate green backdrops—or any other color you specify. Perfect for content creators and videographers who need to isolate subjects without manually editing backgrounds.&lt;/p&gt;
&lt;p&gt;Select an image or video clip with a color background you wish to remove. Then choose “Green Screen” in the Effects, and our effect handles the rest. Fine-tune the effect to your liking.&lt;/p&gt;
&lt;p&gt;&lt;video src=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/1-25/greenscreen_android.mp4&quot; controls autoplay muted loop playsinline&gt;&lt;/video&gt;&lt;/p&gt;
&lt;h2 id=&quot;user-interface-improvements&quot;&gt;User Interface Improvements&lt;/h2&gt;
&lt;p&gt;In our latest update, we’ve focused on enhancing the usability and functionality of our interface. Here’s what’s new:&lt;/p&gt;
&lt;h3 id=&quot;audio-preview&quot;&gt;Audio Preview&lt;/h3&gt;
&lt;p&gt;&lt;video src=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/1-25/audio-preview-web-video-sdk.mp4&quot; controls autoplay muted loop playsinline&gt;&lt;/video&gt;&lt;/p&gt;
&lt;p&gt;Choosing the right audio clip is now easier with our new Audio Preview feature. Preview audio clips directly within the interface and make the perfect selection for your projects.&lt;/p&gt;
&lt;h3 id=&quot;selection-frame-improvements&quot;&gt;Selection Frame Improvements&lt;/h3&gt;
&lt;p&gt;We’ve upgraded our selection frames with new icons, hover effects, enhanced drag functionality, and shadow rendering. These improvements make manipulating elements within our platform more intuitive and visually appealing. Whether you’re rearranging components or resizing elements, our refined handling ensures a smoother interaction.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Please note that these release notes also include improvements from v1.24.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Thanks for reading. Join over 3000 specialists with powerful apps, 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. We keep you in the loop with brand-new features, early access, and updates.&lt;/strong&gt;&lt;/p&gt;</content:encoded><dc:creator>Neslihan</dc:creator><media:content url="https://blog.img.ly/2024/05/creative-sdk-1-25.jpg" medium="image"/><category>Release Notes</category><category>CE.SDK</category><category>Video Editing</category><category>Design Editor</category><category>App Development</category></item><item><title>CE.SDK v1.20 Release Notes</title><link>https://img.ly/blog/creative-editor-sdk-v_1_20_0-release-notes/</link><guid isPermaLink="true">https://img.ly/blog/creative-editor-sdk-v_1_20_0-release-notes/</guid><description>Merge photos, videos or text into fantastic shapes. Or bring image adjustments to your iOS app with CE.SDK v1.20!</description><pubDate>Mon, 29 Jan 2024 10:37:42 GMT</pubDate><content:encoded>&lt;p&gt;Since our &lt;a href=&quot;https://img.ly/blog/creative-editor-sdk-v1-19-release-notes/&quot;&gt;last release&lt;/a&gt;, we’ve been crafting new features to empower your users’ creative journey. Today, we are happy to introduce CE.SDK v1.20!&lt;/p&gt;
&lt;p&gt;With this release, you can:&lt;/p&gt;
&lt;h3 id=&quot;create-unique-element-combinations&quot;&gt;Create Unique Element Combinations&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Platforms:&lt;/strong&gt; iOS, Android, Web, API&lt;/p&gt;
&lt;p&gt;&lt;video src=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/1-20/boolean-1-20.mp4&quot; controls autoplay muted loop playsinline&gt;&lt;/video&gt;&lt;/p&gt;
&lt;p&gt;Forge &lt;strong&gt;limitless combinations&lt;/strong&gt; of photos, videos, texts, and shapes with our new boolean operations feature. This dynamic suite includes operations such as Combine, Subtract, Intersect, and Exclude.&lt;/p&gt;
&lt;p&gt;Subtract text from a shape, or seamlessly merge a distinctive shape with a lively &lt;strong&gt;video clip.&lt;/strong&gt; With these powerful tools, your creativity knows no bounds, offering the freedom to craft truly unique design elements.&lt;/p&gt;
&lt;p&gt;&lt;video src=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/1-20/boolean-1-20_2.mp4&quot; controls autoplay muted playsinline&gt;&lt;/video&gt;&lt;/p&gt;
&lt;h3 id=&quot;refine-images-with-ios-appearance-settings&quot;&gt;Refine Images with iOS Appearance Settings&lt;/h3&gt;
&lt;p&gt;&lt;video src=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/1-20/720/m_ios-design-editor-sdk.mp4&quot; controls autoplay muted loop playsinline&gt;&lt;/video&gt;&lt;/p&gt;
&lt;p&gt;Breathe life into your content and set the ambiance! We’ve recently updated the user interface on iOS to include Appearance Settings. Now, users can enhance their visual content with advanced improvements. This includes &lt;strong&gt;precise adjustments&lt;/strong&gt;, creative &lt;strong&gt;filters&lt;/strong&gt;, effects, and blur options.&lt;br&gt;
Experience our new features by using the free Demo Design Editor, now live on the &lt;a href=&quot;https://apps.apple.com/us/app/img-ly-design-editor/id1672991141&quot;&gt;App Store&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;optimize-high-quality-asset-imports&quot;&gt;Optimize High-Quality Asset Imports&lt;/h3&gt;
&lt;p&gt;&lt;img alt=&quot;image-source-sets.jpg&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/image-source-sets_2pbluf.webp&quot; srcset=&quot;/_astro/image-source-sets_GfGVV.webp 640w, /_astro/image-source-sets_hvpDV.webp 750w, /_astro/image-source-sets_LVopW.webp 828w, /_astro/image-source-sets_2yxwN.webp 1080w, /_astro/image-source-sets_Z1jdBSr.webp 1280w, /_astro/image-source-sets_2pbluf.webp 1480w&quot;&gt;&lt;/p&gt;
&lt;p&gt;Importing high-quality assets, like photos, can strain your device and impact your editor performance. Imagine editing on your phone and just importing a 5k pixels stock photo. Our smart engine steps in, creating an image source set with different resolutions: The intelligent engine selects the &lt;strong&gt;optimal target resolution&lt;/strong&gt; for your asset and seamlessly switches to it.&lt;/p&gt;
&lt;p&gt;The technical scoop? This update &lt;strong&gt;minimizes network bandwidth&lt;/strong&gt;, &lt;strong&gt;loading times&lt;/strong&gt;, and runtime &lt;strong&gt;memory usage&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;keep-designs-in-focus-on-android&quot;&gt;Keep Designs in Focus on Android&lt;/h3&gt;
&lt;p&gt;&lt;video src=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/1-20/720/m_android-zoom-limits.mp4&quot; controls autoplay muted loop playsinline&gt;&lt;/video&gt;&lt;/p&gt;
&lt;p&gt;With our new Camera Zoom Limits, editing a design is simpler. Your page remains in focus to prevent accidental scrolling outside the design. The zoom level is set within a minimum and maximum range for a sensible, usable view at all times. Lastly, when you select an element in your design, it will remain in focus when opening adjustments or any other inspectors. This allows you to instantly view changes made to the selected element.&lt;br&gt;
Try our live Demo Design Editor for free, on &lt;a href=&quot;https://play.google.com/store/apps/details?id=ly.img.cesdk.catalog&quot;&gt;Google Play&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;exclusive-access-integrate-short-form-video-creation&quot;&gt;Exclusive Access: Integrate Short-Form Video Creation&lt;/h3&gt;
&lt;p&gt;&lt;img alt=&quot;integrate-video-editor-SDK.jpg&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/integrate-video-editor-SDK_Z8qrxx.webp&quot; srcset=&quot;/_astro/integrate-video-editor-SDK_ZfoU81.webp 640w, /_astro/integrate-video-editor-SDK_1ST2CK.webp 750w, /_astro/integrate-video-editor-SDK_fFbPA.webp 828w, /_astro/integrate-video-editor-SDK_Z13XbRO.webp 1080w, /_astro/integrate-video-editor-SDK_1VofbM.webp 1280w, /_astro/integrate-video-editor-SDK_Z8qrxx.webp 1480w&quot;&gt;&lt;/p&gt;
&lt;p&gt;Video continues to be the most effective method for attracting and retaining your audience. However, creating a video editor from scratch can be challenging. We’re excited to announce the upcoming release: your &lt;strong&gt;out-of-the-box&lt;/strong&gt; solution for &lt;strong&gt;video content creation&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://2498814.fs1.hubspotusercontent-na1.net/hubfs/2498814/Newsletter-Digest/nov-2023/IMGLY_VIDEO_SDK.pdf?utm_campaign=Video%20Content%20Creation&amp;#x26;utm_medium=releasenotes&amp;#x26;_hsmi=2&amp;#x26;utm_content=2&amp;#x26;utm_source=blog&quot;&gt;Download Feature Exposé (PDF)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Give your users the ability to arrange video, audio, text, and graphics seamlessly on a sleek video timeline with our new &lt;strong&gt;Camera&lt;/strong&gt;. This includes popular features like &lt;strong&gt;Voiceover&lt;/strong&gt;, &lt;strong&gt;Zoom&lt;/strong&gt;, &lt;strong&gt;Tap to Record&lt;/strong&gt;, and more.&lt;/p&gt;
&lt;p&gt;Additionally, we include the beloved &lt;strong&gt;Split Screen Modes&lt;/strong&gt; for Reactions and Duets, similar to those on &lt;strong&gt;TikTok&lt;/strong&gt; and &lt;strong&gt;Instagram&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://share.hsforms.com/1mrIXiBbURn6sMqYgZG9c6A1hk3i&quot;&gt;Gain exclusive early access&lt;/a&gt; to our Video Content Creation Release.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Thanks for reading! Join over 3000 app specialists, and &lt;a href=&quot;https://share.hsforms.com/1IgAOV1wASXGPnFG4ZPLejg1hk3i&quot;&gt;subscribe&lt;/a&gt; to our newsletter. We keep you in the loop with brand-new features and updates.&lt;/strong&gt;&lt;/p&gt;</content:encoded><dc:creator>Neslihan</dc:creator><media:content url="https://blog.img.ly/2024/01/creative-editor-sdk-img_ly-v120-2.jpg" medium="image"/><category>Release Notes</category><category>Design Editor</category><category>iOS App Development</category><category>Android</category><category>Photo Editing</category></item><item><title>CE.SDK v1.19 Release Notes</title><link>https://img.ly/blog/creative-editor-sdk-v1-19-release-notes/</link><guid isPermaLink="true">https://img.ly/blog/creative-editor-sdk-v1-19-release-notes/</guid><description>Explore unified editing of your graphic blocks, new showcases, and an exciting announcement for video!</description><pubDate>Fri, 22 Dec 2023 14:26:48 GMT</pubDate><content:encoded>&lt;p&gt;Since our last release, we’ve been crafting new features to empower your users’ creative journey. Today, we’re thrilled to introduce CE.SDK v1.19! With this release, you can:&lt;/p&gt;
&lt;h3 id=&quot;unify-design-power-with-block-unification&quot;&gt;Unify Design Power with Block Unification&lt;/h3&gt;
&lt;p&gt;&lt;video src=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/1-19/block-unification_1-19-videofills.mp4&quot; controls muted playsinline&gt;&lt;/video&gt;&lt;/p&gt;
&lt;p&gt;Introducing Block Unification for CE.SDK on Mobile and Web—a feature that simplifies design versatility. Videos, images, shapes, and stickers now seamlessly come together as one Graphic Block, easily modified within a unified inspector. All supported settings for your selected block, including strokes, filters, and adjustments, are conveniently displayed in a single, user-friendly space.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Unified Graphic Block&lt;/strong&gt;&lt;br&gt;
Experience a singular Graphic Block supporting diverse fills (images, videos, colors, gradients) and shapes. Switch fill types (video, image, color) effortlessly, enabling dynamic designs in one place.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Easy Fine-Tuning&lt;/strong&gt;&lt;br&gt;
Block Unification integrates effects, filters, adjustments, and blur uniformly across all design elements. Elevate your designs with precision and consistency.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A Treat for Users and Developers&lt;/strong&gt;&lt;br&gt;
For developers, Block Unification means streamlined code maintenance. The consolidation of design blocks into one Graphic Block simplifies development, allowing more focus on crafting exceptional design experiences with IMG.LY.&lt;/p&gt;
&lt;h3 id=&quot;enhance-interaction-with-mouse-wheel-support&quot;&gt;Enhance Interaction with Mouse Wheel Support&lt;/h3&gt;
&lt;p&gt;&lt;img alt=&quot;mousewheel.jpg&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/mousewheel_ZdLdi7.webp&quot; srcset=&quot;/_astro/mousewheel_2evOYG.webp 640w, /_astro/mousewheel_1btqKu.webp 750w, /_astro/mousewheel_Z1mpLwI.webp 828w, /_astro/mousewheel_1aUQbe.webp 1080w, /_astro/mousewheel_t4NVy.webp 1280w, /_astro/mousewheel_ZdLdi7.webp 1480w&quot;&gt;&lt;/p&gt;
&lt;p&gt;In our latest update, our engine now directly registers mouse wheel events on the canvas, eliminating the need for manual camera manipulation. This seamless integration brings a host of new features, including smooth zooming, centered around the cursor, and support for pinch gestures on multitouch trackpads. Enjoy a more intuitive and unified interaction experience across various inputs, simplifying and enriching your design process.&lt;/p&gt;
&lt;h3 id=&quot;migrate-to-cesdk-v119&quot;&gt;Migrate to CE.SDK v1.19&lt;/h3&gt;
&lt;p&gt;The structural changes of CE.SDK v1.19 bring a more composable and powerful editing experience. To benefit from our new features, and to attain to licensing changes, head to our &lt;a href=&quot;https://img.ly/docs/cesdk/js/upgrade-4f8715/&quot;&gt;documentation on migrating to v.1.19&lt;/a&gt; for an easy transition.&lt;/p&gt;
&lt;p&gt;Wait. There’s more. As we explore the extensive capabilities of our SDK, we’re unveiling new showcases to demonstrate your possibilities. Plus, stick around until the end for an exciting announcement that will elevate your video creation experience!&lt;/p&gt;
&lt;h3 id=&quot;new-showcase-automated-resizing&quot;&gt;New Showcase: Automated Resizing&lt;/h3&gt;
&lt;p&gt;&lt;img alt=&quot;Scale your marketing materials across all platforms with automated sizes.&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/automated_Z1or62o.webp&quot; srcset=&quot;/_astro/automated_1UVbIY.webp 640w, /_astro/automated_1iPdUS.webp 750w, /_astro/automated_1uk67P.webp 828w, /_astro/automated_DqpQ8.webp 1080w, /_astro/automated_2a5INP.webp 1280w, /_astro/automated_Z1or62o.webp 1480w&quot;&gt;&lt;/p&gt;
&lt;p&gt;In our new live &lt;a href=&quot;https://img.ly/showcases/cesdk/automated-resizing/web&quot;&gt;showcase&lt;/a&gt; for web, effortlessly generate size variations of your designs and seamlessly &lt;strong&gt;scale your&lt;/strong&gt; &lt;strong&gt;marketing materials across platforms&lt;/strong&gt;. The automated resizing feature empowers you to easily leverage marketing materials without requiring the involvement of a design team, ensuring efficiency and adaptability.&lt;/p&gt;
&lt;h3 id=&quot;new-showcase-version-history&quot;&gt;New Showcase: Version History&lt;/h3&gt;
&lt;p&gt;&lt;img alt=&quot;Keep track! Version History monitors changes made to your design.&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/history_Z1I9vf0.webp&quot; srcset=&quot;/_astro/history_1suucg.webp 640w, /_astro/history_ZuG7lP.webp 750w, /_astro/history_1T8alE.webp 828w, /_astro/history_Z1gpSmo.webp 1080w, /_astro/history_Z1uhGNc.webp 1280w, /_astro/history_Z1I9vf0.webp 1480w&quot;&gt;&lt;/p&gt;
&lt;p&gt;Discover the convenience of Version History, enabling you to monitor changes made to each design and seamlessly restore past versions when needed. Explore our straightforward &lt;a href=&quot;https://img.ly/showcases/cesdk/version-history/web&quot;&gt;Version History&lt;/a&gt; showcase for a practical design experience.&lt;/p&gt;
&lt;h3 id=&quot;outlook-offer-tiktok-inspired-video-editing&quot;&gt;Outlook: Offer TikTok-Inspired Video Editing&lt;/h3&gt;
&lt;p&gt;Video remains the reigning champion for attracting and retaining your audience. Yet, building a video editor from the ground up is a pain.&lt;/p&gt;
&lt;p&gt;&lt;video src=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/1-19/HD_IMGLY-SDK_141223-0.mp4&quot; controls playsinline poster=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/1-19/thumb-vcc.jpg&quot;&gt;&lt;/video&gt;&lt;/p&gt;
&lt;p&gt;To simplify your journey and save valuable time and resources, we are excited to unveil a groundbreaking SDK for creating captivating short-form videos in January 2024!&lt;/p&gt;
&lt;p&gt;Empower your users to arrange video, audio, text, and graphics seamlessly on a sleek video timeline. Our new camera introduces popular features like Voiceover, Zoom, Tap to Record, and more. Plus, bring the beloved Split Screen Modes for Reactions and Duets, akin to TikTok and Instagram!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://share.hsforms.com/1mrIXiBbURn6sMqYgZG9c6A1hk3i&quot;&gt;Be the first to access our new IMG.LY SDK—join our waitlist now!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Thanks for reading!&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 to stay in the loop with the latest news and updates.&lt;/strong&gt;&lt;/p&gt;</content:encoded><dc:creator>Neslihan</dc:creator><media:content url="https://blog.img.ly/2023/12/v119.jpg" medium="image"/><category>Release Notes</category><category>CE.SDK</category><category>Video Editing</category><category>Design Editor</category><category>App Development</category><category>Mobile App Development</category></item><item><title>CE.SDK v1.16 Release Notes</title><link>https://img.ly/blog/creative-editor-sdk-v_1_16_0-release-notes/</link><guid isPermaLink="true">https://img.ly/blog/creative-editor-sdk-v_1_16_0-release-notes/</guid><description>Keep it colorful! This release brings CMYK and color library support. We also enhanced web touch gestures. Find out more.</description><pubDate>Tue, 26 Sep 2023 14:26:37 GMT</pubDate><content:encoded>&lt;p&gt;It’s getting colorful! Since &lt;a href=&quot;https://img.ly/blog/creative-editor-sdk-v_1_15_0-release-notes/&quot;&gt;our last release&lt;/a&gt;, we’ve been busy crafting new features and enhancements to empower your user’s creative journey. We are excited to announce that CE.SDK v1.16 is now available.&lt;/p&gt;
&lt;p&gt;With this release, you can:&lt;/p&gt;
&lt;h2 id=&quot;maintain-color-consistency-with-cmyk--libraries&quot;&gt;Maintain Color Consistency with CMYK &amp;#x26; Libraries&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Interfaces:&lt;/strong&gt; Engine, Editor&lt;br&gt;
&lt;strong&gt;Platforms:&lt;/strong&gt; Web&lt;/p&gt;
&lt;p&gt;&lt;video src=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/1-16/color-cmyk-pantone-naptone.mp4&quot; controls autoplay muted loop playsinline&gt;&lt;/video&gt;&lt;/p&gt;
&lt;p&gt;We understand the importance of precise color reproduction and the need for brand consistency. That’s why we’re enhancing your editing experience with greater color control.&lt;/p&gt;
&lt;p&gt;You can now seamlessly integrate &lt;strong&gt;CMYK and Pantone color spaces,&lt;/strong&gt; along with other customized color libraries, including &lt;strong&gt;your brand’s unique colors&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This ensures that your designs not only meet but exceed expectations across all mediums, delivering a consistent and visually engaging experience. It also helps eliminate color inconsistencies and product returns, while ensuring color accuracy.&lt;/p&gt;
&lt;p&gt;Learn more about adding color libraries to CE.SDK in our &lt;a href=&quot;https://img.ly/docs/cesdk/js/colors/create-color-palette-7012e0/&quot;&gt;documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;improve-web-interaction-with-touch-gestures&quot;&gt;Improve Web Interaction with Touch Gestures&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;Offer enhanced cross-device editor interaction, including multitouch gestures like pinching and zooming.&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/web-gestures-multitouch_ZmKIw4.webp&quot; srcset=&quot;/_astro/web-gestures-multitouch_Qxp6d.webp 640w, /_astro/web-gestures-multitouch_iwaoR.webp 750w, /_astro/web-gestures-multitouch_15RP4N.webp 828w, /_astro/web-gestures-multitouch_2aoYLz.webp 1080w, /_astro/web-gestures-multitouch_Z1DgVhd.webp 1280w, /_astro/web-gestures-multitouch_ZmKIw4.webp 1480w&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Interfaces:&lt;/strong&gt; Engine, Editor&lt;br&gt;
&lt;strong&gt;Platforms:&lt;/strong&gt; Web&lt;/p&gt;
&lt;p&gt;With this update, we’re bringing a more interactive and responsive experience to our web applications. Let your users experience seamless &lt;strong&gt;multitouch interactions&lt;/strong&gt;, even on mobile web. This ensures that the content and functionality of our web applications remain accessible and user-friendly across various devices.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Thank you for reading! Never miss out on updates 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>Neslihan</dc:creator><media:content url="https://blog.img.ly/2023/10/1-16.jpg" medium="image"/><category>Release Notes</category><category>Creative Editing</category><category>CMYK</category><category>Print</category><category>Design Editor</category><category>Cross-Platform</category><category>App Development</category></item><item><title>CE.SDK v1.11 Release</title><link>https://img.ly/blog/creative-editor-sdk-v_1_11_0-release-notes/</link><guid isPermaLink="true">https://img.ly/blog/creative-editor-sdk-v_1_11_0-release-notes/</guid><description>Elevate your editing game with new features: Cutout Lines for Stickers and Shapes, Advanced Text Settings, and more. Discover the possibilities now!</description><pubDate>Tue, 16 May 2023 15:37:49 GMT</pubDate><content:encoded>&lt;p&gt;We are introducing CE.SDK v1.11! Elevate your editing game with new features like Cutout Lines, Advanced Text Styling, HEVC/H.265 codec, and transparent video support. We’ve also improved asset resource management, and added user interfaces to enhance your template creation and editing workflow. See how CE.SDK v1.11 can bring your creative vision to life.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;With this release, you can:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create Cutout Stickers and Shapes&lt;/li&gt;
&lt;li&gt;Choose Letter Cases&lt;/li&gt;
&lt;li&gt;Keep Font Size Consistent in Templates&lt;/li&gt;
&lt;li&gt;Enhance and Highlight Text&lt;/li&gt;
&lt;li&gt;Ensure Effortless Layouting with Alignment Options&lt;/li&gt;
&lt;li&gt;Support More Video Codecs&lt;/li&gt;
&lt;li&gt;Use Less Memory&lt;/li&gt;
&lt;li&gt;Enjoy Smoother Editing&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;create-cutout-stickers-and-shapes&quot;&gt;Create Cutout Stickers and Shapes&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Interfaces&lt;/strong&gt;: API, Default UI, Advanced UI&lt;br&gt;
&lt;strong&gt;Platforms:&lt;/strong&gt; Web, Server, iOS, Android&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;CutOuts_UI.jpg&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/CutOuts_UI-1_Z1tfgS5.webp&quot; srcset=&quot;/_astro/CutOuts_UI-1_Z2cgTFN.webp 640w, /_astro/CutOuts_UI-1_22p3pU.webp 750w, /_astro/CutOuts_UI-1_Z28Jas0.webp 828w, /_astro/CutOuts_UI-1_Z1qzUyO.webp 1080w, /_astro/CutOuts_UI-1_15aXb1.webp 1280w, /_astro/CutOuts_UI-1_Z1tfgS5.webp 1480w&quot;&gt;&lt;/p&gt;
&lt;p&gt;We are excited to announce that CE.SDK now supports &lt;strong&gt;cutout lines&lt;/strong&gt;, which includes a new type of block that enables users to create these lines and perform cutout line combinations. A future update will allow dynamic generation of such lines for existing blocks. This feature is based on the technology used for named/spot colors and is available for use with a range of printers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Create Cutout and Adjust Offset&lt;/strong&gt;&lt;br&gt;
By providing precise control over the offset, we enable print businesses to ensure accurate and high-quality output for their users. Empower your users to create designs with exceptional precision, perfect for applications like stickers.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Effortlessly create cutout lines, and adjust their offset as seen here in our Default UI.&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/cutout_01-1_Z2aVFxS.webp&quot; srcset=&quot;/_astro/cutout_01-1_Z1GlzAz.webp 640w, /_astro/cutout_01-1_ZEXXD1.webp 750w, /_astro/cutout_01-1_Z1PJwlq.webp 828w, /_astro/cutout_01-1_ZkJWAo.webp 1080w, /_astro/cutout_01-1_1hffkk.webp 1280w, /_astro/cutout_01-1_Z2aVFxS.webp 1480w&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Combine Cutout Shapes (Boolean Operations)&lt;/strong&gt;&lt;br&gt;
These boolean operations provide designers with the ability to manipulate and combine Cutout shapes in various ways, enabling the creation of complex designs and precise control over the final output.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Union: Combines two or more shapes into a single shape, creating a merged outline of the combined areas.&lt;/li&gt;
&lt;li&gt;Subtract: Removes one shape from another, resulting in a new shape formed by subtracting the overlapping region.&lt;/li&gt;
&lt;li&gt;Intersect: Creates a new shape that represents the overlapping area between two or more shapes.&lt;/li&gt;
&lt;li&gt;Exclude: Achieve artistic flair by excluding the overlapping area between shapes, resulting in a unique and captivating composition.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&quot;Combine cutout lines, perfect for custom shapes like stickers.&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/cutout_02-1_Z12u8CF.webp&quot; srcset=&quot;/_astro/cutout_02-1_Z1E6Ub9.webp 640w, /_astro/cutout_02-1_ZCJjdA.webp 750w, /_astro/cutout_02-1_Z1NuQV0.webp 828w, /_astro/cutout_02-1_MGzjO.webp 1080w, /_astro/cutout_02-1_2pGMfx.webp 1280w, /_astro/cutout_02-1_Z12u8CF.webp 1480w&quot;&gt;&lt;/p&gt;
&lt;p&gt;Visit our documentation on &lt;a href=&quot;https://img.ly/docs/cesdk/js/stickers-and-shapes/create-cutout-384be3/&quot;&gt;using cutouts&lt;/a&gt; to get started.&lt;/p&gt;
&lt;h3 id=&quot;choose-letter-cases&quot;&gt;Choose Letter Cases&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Interfaces&lt;/strong&gt;: API, Advanced UI, Default UI&lt;br&gt;
&lt;strong&gt;Platforms:&lt;/strong&gt; Web, iOS, Android, Server&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Simplify the design process by selecting a letter case.&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/cases-1_Z6pAOB.webp&quot; srcset=&quot;/_astro/cases-1_2aHljw.webp 640w, /_astro/cases-1_cvIKq.webp 750w, /_astro/cases-1_Z2sQ7l1.webp 828w, /_astro/cases-1_lj130.webp 1080w, /_astro/cases-1_7rcBc.webp 1280w, /_astro/cases-1_Z6pAOB.webp 1480w&quot;&gt;&lt;/p&gt;
&lt;p&gt;In our &lt;strong&gt;Advanced Text Styling,&lt;/strong&gt; users can now adjust multiple new settings to enhance the visual appeal of their designs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Letter case settings, including uppercase, lowercase, and title case.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Using the new styling settings enhances your design’s visual appeal while reducing implementation time and effort.&lt;/p&gt;
&lt;h3 id=&quot;keep-font-size-consistent-in-templates&quot;&gt;Keep Font Size Consistent in Templates&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Interfaces&lt;/strong&gt;: API, Default UI, Advanced UI&lt;br&gt;
&lt;strong&gt;Platforms:&lt;/strong&gt; Web, iOS, Android, Server&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Perfect for creating templates in our Advanced UI: choose &amp;quot;Auto-size&amp;quot; to allow users to fit as much text in the frame at all times, without breaking the design.&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/auto-size-1_Z1fYTGh.webp&quot; srcset=&quot;/_astro/auto-size-1_WxLcx.webp 640w, /_astro/auto-size-1_1XUna6.webp 750w, /_astro/auto-size-1_N9OrG.webp 828w, /_astro/auto-size-1_zbNgd.webp 1080w, /_astro/auto-size-1_2cc1bV.webp 1280w, /_astro/auto-size-1_Z1fYTGh.webp 1480w&quot;&gt;&lt;/p&gt;
&lt;p&gt;CE.SDK’s new &lt;strong&gt;Automatic Font Size&lt;/strong&gt; feature adjusts font size to fit within text frame constraints, enabling users to create visually appealing designs with ease. For example, a text placeholder for names will now adjust the font size for longer names, ensuring they fit perfectly within a print design. Users can now enter as much text as they need, without worrying about it overflowing out of the designated frame.&lt;/p&gt;
&lt;h3 id=&quot;enhance-and-highlight-text&quot;&gt;Enhance and Highlight Text&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Interfaces&lt;/strong&gt;: API, Advanced UI, Default UI&lt;br&gt;
&lt;strong&gt;Platforms:&lt;/strong&gt; Web, iOS, Android, Server&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;textrun.jpg&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/textrun-1_UtjFF.webp&quot; srcset=&quot;/_astro/textrun-1_1FuFvn.webp 640w, /_astro/textrun-1_13oHHh.webp 750w, /_astro/textrun-1_1eSzTe.webp 828w, /_astro/textrun-1_Z26PieJ.webp 1080w, /_astro/textrun-1_ZAaYh2.webp 1280w, /_astro/textrun-1_UtjFF.webp 1480w&quot;&gt;&lt;/p&gt;
&lt;p&gt;Easily manipulate individual segments of text within a text block with &lt;strong&gt;Text Run&lt;/strong&gt;. That means, you can modify the formatting of specific words or phrases, such as font weight and changing colors, without having to manipulate the entire text block. This feature is particularly useful for creating visually appealing text effects or highlighting specific words or phrases within a larger body of text.&lt;/p&gt;
&lt;h3 id=&quot;ensure-effortless-layouting-with-alignment-options&quot;&gt;Ensure Effortless Layouting with Alignment Options&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Interfaces&lt;/strong&gt;: API, Advanced UI, Default UI&lt;br&gt;
&lt;strong&gt;Platforms:&lt;/strong&gt; Web, Server, iOS, Android&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Easily align elements for streamlined layouting.&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/align-shirt-1_1YVar6.webp&quot; srcset=&quot;/_astro/align-shirt-1_ZM3FIw.webp 640w, /_astro/align-shirt-1_1vtDEA.webp 750w, /_astro/align-shirt-1_K5eYF.webp 828w, /_astro/align-shirt-1_2jkAOw.webp 1080w, /_astro/align-shirt-1_29CS8j.webp 1280w, /_astro/align-shirt-1_1YVar6.webp 1480w&quot;&gt;&lt;/p&gt;
&lt;p&gt;We are introducing the &lt;strong&gt;Block Align&lt;/strong&gt; feature, which transforms the editing experience by enabling users to effortlessly align blocks to the page or each other, empowering them to achieve their desired layout with ease. Read our &lt;a href=&quot;https://img.ly/docs/cesdk/js/insert-media/position-and-align-cc6b6a/#alignment&quot;&gt;documentation on Block Alignment&lt;/a&gt; for more details.&lt;/p&gt;
&lt;h3 id=&quot;support-more-codecs-and-transparent-videos&quot;&gt;Support More Codecs and Transparent Videos&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Interfaces&lt;/strong&gt;: All&lt;br&gt;
&lt;strong&gt;Platforms:&lt;/strong&gt; Web&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;HEVC.png&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/HEVC-1_Z1pW1FI.webp&quot; srcset=&quot;/_astro/HEVC-1_Z1ShWzE.webp 640w, /_astro/HEVC-1_1nVYci.webp 750w, /_astro/HEVC-1_Z1GUF7A.webp 828w, /_astro/HEVC-1_ZxYjSK.webp 1080w, /_astro/HEVC-1_ZYsFhJ.webp 1280w, /_astro/HEVC-1_Z1pW1FI.webp 1480w&quot;&gt;&lt;/p&gt;
&lt;p&gt;We have added support for hardware-accelerated video decoding of the &lt;strong&gt;HEVC/H.265 codec&lt;/strong&gt;. This new feature will allow users to decode high-quality videos with &lt;strong&gt;better compression and smaller file sizes&lt;/strong&gt;. It enables CE.SDK to handle a wider range of video files with improved efficiency.&lt;/p&gt;
&lt;p&gt;Please note: At the moment, we do not support transparent videos on some major platforms due to a limitation on Windows. However, we’re excited to announce preliminary MOV container support, allowing you to work with a wider range of video files.&lt;/p&gt;
&lt;h3 id=&quot;use-less-memory&quot;&gt;Use Less Memory&lt;/h3&gt;
&lt;p&gt;&lt;img alt=&quot;assetresource.png&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/assetresource-1_1MIj2c.webp&quot; srcset=&quot;/_astro/assetresource-1_sbgtj.webp 640w, /_astro/assetresource-1_Z1lCtE0.webp 750w, /_astro/assetresource-1_Nmg4O.webp 828w, /_astro/assetresource-1_ZgsD4d.webp 1080w, /_astro/assetresource-1_KCktu.webp 1280w, /_astro/assetresource-1_1MIj2c.webp 1480w&quot;&gt;&lt;/p&gt;
&lt;p&gt;Loading and unloading assets, including images and fonts, has been updated to allow for the unloading of unused items. This &lt;strong&gt;unused asset usage optimization&lt;/strong&gt; frees up memory and reduces the engine’s memory footprint, resulting in more stable and longer editing sessions.&lt;/p&gt;
&lt;h3 id=&quot;smoother-editing&quot;&gt;Smoother Editing&lt;/h3&gt;
&lt;p&gt;&lt;img alt=&quot;Undo-Redo.jpg&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/Undo-Redo-1_Z10dxPT.webp&quot; srcset=&quot;/_astro/Undo-Redo-1_1i4AF2.webp 640w, /_astro/Undo-Redo-1_2jrcCA.webp 750w, /_astro/Undo-Redo-1_18FDUb.webp 828w, /_astro/Undo-Redo-1_OXa6A.webp 1080w, /_astro/Undo-Redo-1_2rXn2j.webp 1280w, /_astro/Undo-Redo-1_Z10dxPT.webp 1480w&quot;&gt;&lt;/p&gt;
&lt;p&gt;This update &lt;strong&gt;addresses issues with the undo/redo&lt;/strong&gt; stack not being built properly in certain scenarios, which could cause delays in updating the video timeline. With these improvements, users can now benefit from a smoother and more efficient editing experience.&lt;/p&gt;
&lt;p&gt;Thanks for reading. &lt;strong&gt;Visit our&lt;/strong&gt; &lt;a href=&quot;https://img.ly/docs/cesdk/changelog/&quot;&gt;&lt;strong&gt;changelog&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;for more details and start creating with confidence.&lt;/strong&gt;&lt;/p&gt;</content:encoded><dc:creator>Neslihan</dc:creator><media:content url="https://blog.img.ly/2023/05/cesdk-v1_1-1_ReleaseNotes-1.jpg" medium="image"/><category>Release Notes</category><category>App Development</category><category>Cutouts</category><category>Web-to-print</category><category>Design Editor</category></item><item><title>Variable Data Printing: What Is It &amp; Why Do You Need It</title><link>https://img.ly/blog/variable-data-printing-definition-and-benefits/</link><guid isPermaLink="true">https://img.ly/blog/variable-data-printing-definition-and-benefits/</guid><description>Discover the power of VDP for automating processes, scaling personalization &amp; enhancing intimacy in marketing, advertising &amp; customer management.</description><pubDate>Fri, 03 Mar 2023 09:45:33 GMT</pubDate><content:encoded>&lt;p&gt;Variable data printing (VDP) has been around since the 1980s, helping businesses automate manual processes, scale personalization efforts, and utilize the power of direct mail marketing. While the term “variable data printing” may not be familiar to everyone, we encounter its use regularly in our day-to-day lives through bills, event tickets, or membership cards.&lt;/p&gt;
&lt;p&gt;VDP’s ability to leverage data and create personalized tangible items, such as postcards or brochures, provides a more intimate experience compared to digital communication. Although process automation is a significant advantage of VDP, there are many other ways to use it.&lt;/p&gt;
&lt;p&gt;In this article, we’ll explore the most common applications of VDP and the best practices for working with it.&lt;/p&gt;
&lt;h2 id=&quot;how-it-works&quot;&gt;How It Works&lt;/h2&gt;
&lt;p&gt;To fully understand the advantages of variable data printing (VDP), let’s start with a clear definition. VDP, also referred to as variable data imaging, is a digital printing technique that enables the creation of numerous customized materials in a single print run. This process is powered by software that can generate data-driven designs or templates by pulling variables from databases or files.&lt;/p&gt;
&lt;p&gt;The variables used in VDP can automatically generate unique and personalized materials based on data sources. Anything that can be customized, such as names, addresses, messages, or images, can be utilized as a variable. These elements can be changed on each printed piece without slowing down the printing process.&lt;/p&gt;
&lt;p&gt;To illustrate how VDP works in practice, let’s consider a scenario where a company offers a loyalty program for customers to collect points when they make purchases. To encourage more spending, customers can use their accumulated points to receive discounts or freebies. Although points and bonuses can be accessed through an app or website, the company can create immediate gamification by sending a personalized card with every new purchase.&lt;/p&gt;
&lt;p&gt;To personalize that card, we are looking at three separate variables: name, number of points, and type of discount that can be applied. To manually generate all variations of the same template would be counterproductive, but with variables connected to a database it’s an automated process. A name is connected to a number of points, which in turn are connected to discounts. The software does all the heavy lifting, while marketers and designers can focus on other tasks.&lt;/p&gt;
&lt;h2 id=&quot;common-applications-of-vdp&quot;&gt;Common Applications of VDP&lt;/h2&gt;
&lt;p&gt;Although VDP was originally used to automate manual mail processes, its usefulness extends beyond that. Its ability to personalize marketing and advertising materials quickly and efficiently has made it widely appreciated and used in various industries.&lt;/p&gt;
&lt;p&gt;While there are many ways to use VDP, we’ll focus on its most common applications in marketing, advertising, and customer relationship management. These areas benefit greatly from the ability to tailor messages to specific audiences and create unique, personalized experiences.&lt;/p&gt;
&lt;h3 id=&quot;marketing&quot;&gt;Marketing&lt;/h3&gt;
&lt;p&gt;From quickly generating business cards to creating custom QR codes, variable data printing is a big part of marketing efforts for most businesses. Apart from handling internal processes, VPD also has a hand in scaling personalized marketing campaigns. The growing preference for personalized messaging and products goes alongside increased usage of VDP.&lt;/p&gt;
&lt;p&gt;Production of personalized labels, packaging, or brochures is one of the best ways to leverage VDP in marketing. It can be used as a step in a broader personalization campaign, like generating custom QR codes to bring users to personalized landing pages. Or be a venture on its own, like &lt;a href=&quot;https://us.coca-cola.com/store/personalized-bottle&quot;&gt;“Share a Coke”&lt;/a&gt; by Coca-Cola and its widely successful personalization of labels.&lt;/p&gt;
&lt;h3 id=&quot;advertising&quot;&gt;Advertising&lt;/h3&gt;
&lt;p&gt;Variable data printing brought new life to direct mail, moving away from what once was perceived as junk and irrelevant advertising, and bringing about a new age of valuable and relatable mail. A &lt;a href=&quot;https://www.fundera.com/resources/direct-mail-statistics&quot;&gt;recent study&lt;/a&gt; reported that 70% of consumers see direct mail as more personal than online interactions, with 54% claiming they want direct mail from brands that interest them. Moreover, direct mail has the highest response rate among all advertising channels being five to nine times higher than other forms, with a simple act of adding a name to a direct mail piece that can increase response rates by 135%.&lt;/p&gt;
&lt;p&gt;Taking advantage of VPD in advertising usually includes customized leaflets or coupons with images and content based on age or demographics. One of the personalization examples is including custom maps with steps on how to reach an advertised location, making it much more relatable and easy to act on.&lt;/p&gt;
&lt;h3 id=&quot;customer-relationship-management&quot;&gt;Customer Relationship Management&lt;/h3&gt;
&lt;p&gt;While VDP helps marketing and advertising drive acquisition, it’s also a great way to help with customer retention. Small and yet important gestures of appreciation like custom-made thank you and birthday cards can go a long way. As mentioned before, VDP can also be used to generate membership cards or personalized bonuses and discounts based on shopping preferences. Tapping into the power of variables, every printed material sent to a customer can be created in a way that will feel personal and appreciative, in turn helping sustain loyal customers.&lt;/p&gt;
&lt;h2 id=&quot;why-use-vdp&quot;&gt;Why Use VDP&lt;/h2&gt;
&lt;p&gt;Variable data printing is not reserved for a single industry or business type. It can be leveraged across multiple customer touchpoints, from the awareness stage via direct mail advertising, to a personalized label and thank you card shipped with a purchased product. VDP can also be used internally to show gratitude and appreciation to employees with custom-made cards and packaging. In fact, variable data printing can be used on any piece of printed content or design that can be personalized.&lt;/p&gt;
&lt;h3 id=&quot;benefits&quot;&gt;Benefits&lt;/h3&gt;
&lt;p&gt;The advantages of variable data printing go hand-in-hand with the advantages of personalization. &lt;a href=&quot;https://www.twilio.com/blog/announcing-the-state-of-personalization-2021&quot;&gt;Studies show&lt;/a&gt; that customers respond much better to marketing materials they can connect to, with 60% of consumers saying they will likely become repeat buyers after a personalized shopping experience with a retailer.&lt;/p&gt;
&lt;p&gt;VDP can help create a valuable experience from start to finish and facilitate a meaningful connection between a brand and a customer. Some of the most prominent benefits are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Providing personalized shopping experience in the form of custom labels, packaging &amp;#x26; cards&lt;/li&gt;
&lt;li&gt;Building strong customer relationships with personalized thank you &amp;#x26; birthday cards, custom messaging, and discounts&lt;/li&gt;
&lt;li&gt;Delivering meaningful direct mail advertising with higher conversion rates&lt;/li&gt;
&lt;li&gt;Generating personalized marketing campaigns &amp;#x26; materials that customers can connect with&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bringing variable data printing to your workflows, whether it concerts marketing, advertising, HR, or sales, is a great way to tap into &lt;a href=&quot;https://img.ly/blog/why-companies-need-to-go-personal/&quot;&gt;powerful benefits of personalization&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;challenges&quot;&gt;Challenges&lt;/h3&gt;
&lt;p&gt;The main challenge of VDP is having software that can efficiently work with variables and generate print-ready designs, while also providing advanced design editing features.&lt;/p&gt;
&lt;p&gt;Since the popularization of personalization, variables can be leveraged in many different types of marketing materials. However, the design of those materials is equally important, and so it’s an automated print validation process.&lt;/p&gt;
&lt;p&gt;This challenge applies to companies that use variable data to generate designs, as well as Print Service Providers (PSP) working with VDP. For the PSP, another challenge is file format submission, especially if they don’t have a web-to-print editor their customers can use to submit their orders. Flawed print validation, incompatible format, low resolution, or insufficient quality could be costly mistakes to make. Hence, the best option for print service providers is to develop their own web-to-print editor with variable data printing that will take care of those problems and limit manual work to a minimum.&lt;/p&gt;
&lt;h2 id=&quot;example-of-leveraging-variable-data-printing-with-cesdk&quot;&gt;Example of Leveraging Variable Data Printing with CE.SDK&lt;/h2&gt;
&lt;p&gt;IMG.LY has developed CreativeEditor SDK to help integrate &lt;a href=&quot;https://img.ly/use-cases/variable-data-printing&quot;&gt;VDP&lt;/a&gt; into all designs in an easy and intuitive way. &lt;a href=&quot;https://img.ly/products/creative-sdk&quot;&gt;CE.SDK&lt;/a&gt; is fully customizable and can be integrated into a customer-facing web-to-print editor, providing powerful editing features, or an in-house design editor for all creative needs. Here’s an example of how you can leverage variables with our editor.&lt;/p&gt;
&lt;h3 id=&quot;creating-custom-thank-you-card&quot;&gt;Creating Custom Thank-You Card&lt;/h3&gt;
&lt;p&gt;As mentioned before, thank you cards are a great way to show appreciation and build stronger connections with both customers and employees. Creation of a custom thank-you card is pretty straightforward, here are the necessary steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Creating a Smart Template&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To create a personalized card, we begin by designing a template with variable fields. The front design remains consistent, while the back features unique personalized messages.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Design a template by adding images, text, or fun shapes and stickers.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1120px) 1120px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1120&quot; height=&quot;598&quot; src=&quot;https://img.ly/_astro/01_create_template-1_f1nPB.webp&quot; srcset=&quot;/_astro/01_create_template-1_DshRl.webp 640w, /_astro/01_create_template-1_Z23vRzl.webp 750w, /_astro/01_create_template-1_Z22g4xm.webp 828w, /_astro/01_create_template-1_Z1k7Jmg.webp 1080w, /_astro/01_create_template-1_f1nPB.webp 1120w&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Assigning Placeholders&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The next step is to choose the elements that will be personalized. For example, we may select a personalized greeting, such as “Hello {{name}}”, and address information. To insert a variable, we use double curly brackets {{}} and a placeholder name, such as {{firstname}} or {{address}}.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Take advantage of variables that serve as placeholders for information, such as customer names.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1120px) 1120px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1120&quot; height=&quot;527&quot; src=&quot;https://img.ly/_astro/02_assigning_placeholders_1MctnI.webp&quot; srcset=&quot;/_astro/02_assigning_placeholders_Z1dqOUT.webp 640w, /_astro/02_assigning_placeholders_i4vNS.webp 750w, /_astro/02_assigning_placeholders_Z1g3EsX.webp 828w, /_astro/02_assigning_placeholders_ZQmM65.webp 1080w, /_astro/02_assigning_placeholders_1MctnI.webp 1120w&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Connecting Template to a Data Source&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The last step is connecting your template to a data source with list of variables. This can be done by using the &lt;a href=&quot;https://img.ly/docs/cesdk/js/create-templates/add-dynamic-content/text-variables-7ecb50/&quot;&gt;Creative Engine variable API&lt;/a&gt; to programmatically set values for the variables and render the final personalized card.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Design Validation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In the example above, there shouldn’t be any issue with text exceeding beyond bleed line or other common print errors, however, design validation is an important feature of CE.SDK. It will automatically detect any issues that might cause a print error, cause trademark infringement or generate harmful content.&lt;/p&gt;
&lt;p&gt;And that’s it! We have created a template for custom thank-you card in three easy steps. Here is what a card would look like.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;A personalized hello: Create a custom card yourself with CE.SDK.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 621px) 621px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;621&quot; height=&quot;896&quot; src=&quot;https://img.ly/_astro/03_design_validation_Z2gOUY2.webp&quot; srcset=&quot;/_astro/03_design_validation_Z2gOUY2.webp 621w&quot;&gt;&lt;/p&gt;
&lt;p&gt;Try creating a custom card with CE.SDK yourself on our &lt;a href=&quot;https://img.ly/demos/post-greeting-cards/web/&quot;&gt;showcase&lt;/a&gt; page!&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://img.ly/use-cases/variable-data-printing&quot;&gt;Variable data printing&lt;/a&gt; can be a valuable tool to boost performance and take initiatives to the next level. It can help scale personalization efforts, acquire new customers, add value to the final product, and make employees feel appreciated. By using VDP, businesses can efficiently grow and reap numerous benefits, with only a few obstacles that can be easily overcome with the right solution.&lt;/p&gt;
&lt;p&gt;To take advantage of the benefits of VDP and overcome its challenges, consider using &lt;a href=&quot;https://img.ly/products/creative-sdk&quot;&gt;CreativeEditor SDK&lt;/a&gt; and see how it can help you scale personalization and bring variable data printing to your company and customers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Thanks for reading! To stay in the loop, subscribe to our&lt;/strong&gt; &lt;a href=&quot;https://photoeditorsdk.us13.list-manage.com/subscribe?u=dc9f652839dbb620d14d6d28d&amp;#x26;id=04a306e4b2&quot;&gt;&lt;strong&gt;Newsletter&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;</content:encoded><dc:creator>Klaudia</dc:creator><media:content url="https://blog.img.ly/2023/03/VDP-print-product-web2print-web-application.jpg" medium="image"/><category>How-To</category><category>VDP</category><category>Automation</category><category>Creative Editor</category><category>Personlization</category><category>Web-to-print</category><category>Design Editor</category><category>Design Systems</category><category>Learning</category></item><item><title>Personalize or Perish: Why Companies Need to Go Personal</title><link>https://img.ly/blog/why-companies-need-to-go-personal/</link><guid isPermaLink="true">https://img.ly/blog/why-companies-need-to-go-personal/</guid><description>Learn about leveraging Personalization for deeper customer connections, increased brand loyalty and customer retention, and higher conversion rates. </description><pubDate>Tue, 21 Feb 2023 11:34:58 GMT</pubDate><content:encoded>&lt;p&gt;In the past, tailor-made marketing campaigns and personalized products were seen as a luxury that only a few companies could afford. However, as we enter 2023, personalization has become essential for all industries. Consumers now expect to see relevant and relatable content on a regular basis, which means that leveraging personalization on at least one channel has become a must-have.&lt;/p&gt;
&lt;p&gt;Many marketers already use personalization techniques to retain customers and boost conversions. However, with new trends constantly emerging, there’s a risk of falling behind. If you’re still unconvinced that personalization is the future, we’ve put together an overview of why it should be a top priority for your business strategy.&lt;/p&gt;
&lt;h3 id=&quot;what-is-personalization&quot;&gt;What is Personalization?&lt;/h3&gt;
&lt;p&gt;First, let’s clarify what personalization actually means. The most straightforward way to explain personalization would be tailoring of marketing materials, campaigns, and products to individuals’ specific characteristics, preferences, and needs in order to provide a more relevant and engaging experience.&lt;/p&gt;
&lt;p&gt;With technological development, companies are finding new ways to apply personalization across their businesses, ways beyond mere “Hello [name]” emails. For industries like e-commerce or printers, the personalization approach has been extended all the way to the production stage - allowing customers to incorporate their own designs and purchase a unique product made exclusively for them. Others, rely on algorithms to make sure that customers are always presented with the most relevant and engaging content. Regardless of the industry, everyone is looking to take advantage of personalization approaches.&lt;/p&gt;
&lt;h3 id=&quot;benefits-of-personalization&quot;&gt;Benefits of Personalization&lt;/h3&gt;
&lt;p&gt;Personalization is by default a user-centric approach, prioritizing relevance, usability, and impact of provided content and features. Thoroughly planned personalized marketing campaigns can make or break new product launches, boost subscription numbers, or convert lingering customers.&lt;br&gt;
For industries like e-commerce and print, enabling customers to design or customize their own product means higher sales and lower return rates - which translates to not only a higher profit margin but also a more sustainable shopping experience.&lt;/p&gt;
&lt;p&gt;Companies efficiently utilizing personalization efforts can expect:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Deeper connection between brand and customer&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Increased brand loyalty and customer retention&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Higher conversion rates&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Treating customers with individual attention and care creates a sense of connection going beyond just purchasing needs. When customers are faced with meaningful content they are able to find what they need more easily, creating a pleasant user experience. &lt;a href=&quot;https://instapage.com/blog/personalization-statistics&quot;&gt;Instapage&lt;/a&gt; reported that 74% of customers feel frustrated when website content is not personalized. Making them more likely to stick with brands that go the extra mile.&lt;/p&gt;
&lt;p&gt;Moreover, presenting customers with relevant recommendations or tailor-made discounts significantly increases chances of conversion. According to Business Insider, 47% of customers turn to Amazon if the brand they are shopping with doesn’t provide personalized product suggestions. The ability to quickly find what is needed might just be the difference between making a sale and losing a customer.&lt;/p&gt;
&lt;h2 id=&quot;leveraging-personalization&quot;&gt;Leveraging Personalization&lt;/h2&gt;
&lt;p&gt;Applications of personalization are limited only by imagination and creativity. The right personalization approach can sometimes equal to the success of an entire business. Hard to imagine Spotify being so popular without its flawless personalization algorithms alongside giants like Netflix or Amazon which heavily rely on personalization to retain subscriptions and push sales.&lt;/p&gt;
&lt;p&gt;Fortunately, personalization is not reserved for large enterprises only, it can be used just as efficiently by any other company, regardless of its size. Thanks to its versatility, it can be utilized across different channels, platforms, and consumer touchpoints. Some of the most popular uses of personalization include:&lt;/p&gt;
&lt;h3 id=&quot;marketing&quot;&gt;Marketing&lt;/h3&gt;
&lt;p&gt;For brands and marketing agencies, personalization usually translates to displaying personalized content - be it product, service, or piece of information, alongside ensuring relevant outreach - with tailor-made emails and ads. The success of marketing personalization efforts usually depends on quality of gathered data and right algorithms. Unfortunately, finding a winning approach means little without having a way to scale it. Companies that wish to succeed with their marketing personalization strategy usually have to turn to automation of workflows and creative materials.&lt;/p&gt;
&lt;h3 id=&quot;e-commerce&quot;&gt;E-Commerce&lt;/h3&gt;
&lt;p&gt;Apart from applying personalization in their marketing efforts, e-commerce companies have the advantage of extending it all the way to their products. Allowing customers to add a custom engraving or artwork creates a more intimate shopping experience with irreplaceable product added value. Companies that cannot offer those services have also found a way to leverage personalization, usually by providing options to add a custom greeting card, thank you note, or even record a custom message.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;This kind of personalization is becoming increasingly popular among beauty product consumers, as it adds a special touch and makes the product feel more unique and customized. Companies are benefiting from this trend by strengthening their relationship with customers, who feel more connected to the brand when they receive personalized products.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 388px) 388px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;388&quot; height=&quot;566&quot; src=&quot;https://img.ly/_astro/personalize-print-1_1tPVfG.webp&quot; srcset=&quot;/_astro/personalize-print-1_1tPVfG.webp 388w&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;print-products&quot;&gt;Print Products&lt;/h3&gt;
&lt;p&gt;Print products might have the most exciting and yet still underutilized personalization growth possibility. While photo printers have been profiting from personalization for quite some time, there is still a large portion of the industry lagging behind. Personalization of any printed materials like photos, posters, cards, marketing materials, or apparel items is the future. And certainly, the future customers are impatiently looking forward to.&lt;/p&gt;
&lt;p&gt;However, personalization leaves nobody behind. For those unable to provide such services, there is a whole world of personalized packaging and labels to take advantage of and create a meaningful customer experience.&lt;/p&gt;
&lt;h2 id=&quot;personalization-challenges&quot;&gt;Personalization Challenges&lt;/h2&gt;
&lt;p&gt;With all the benefits and possibilities of personalization, it seems like every company should have mastered it by now. So why it isn’t so? Scaling personalization can proven to be a challenging task. It requires a strategy on how to gather data sensibly, translate it into initiatives, and bring those initiatives to life. Some of the most common challenges of scaling personalization are as follows.&lt;/p&gt;
&lt;h3 id=&quot;data-collection-and-preparation&quot;&gt;Data Collection and Preparation&lt;/h3&gt;
&lt;p&gt;In order to create relevant personalization of marketing content and materials first there must be data that can support this. With topics of privacy policies and data protection on the rise, targeted ads and campaigns might seem obsolete. The key to leveraging personalization is understanding the fine line between providing experience that feels relevant and welcomed, not invasive and overbearing. Another factor contributing to positive results is the transparency of collected data and how it’s being used. &lt;a href=&quot;https://hbr.org/2018/01/ads-that-dont-overstep&quot;&gt;Harvard Business Review&lt;/a&gt; conducted a study that reported that when customers were openly informed their ads were based on their online activity revenue grew by 38%. With data becoming a currency of its own, honest communication seems to be the key to successful personalization campaigns.&lt;/p&gt;
&lt;h3 id=&quot;creative-materials-production&quot;&gt;Creative Materials Production&lt;/h3&gt;
&lt;p&gt;Personalization is loved by marketers because they know how much it helps with engagement and conversion rates. However, it can be dreaded by designers and creative teams. Production of personalized marketing materials can create a painful bottleneck and freeze resources for extended periods of time. The only way to scale production and reduce efforts is by implementing software that can automate a large portion of the work with templates and variable data imports. Designers can create adjustable templates and the marketing team can adapt them to their needs, making the process fast and accessible to all.&lt;/p&gt;
&lt;h3 id=&quot;custom-prints&quot;&gt;Custom Prints&lt;/h3&gt;
&lt;p&gt;The most significant challenges of personalized print products usually revolve around artwork supply and print quality. Different resolutions, file formats, and design quality might mean the back and forth of proofreading, rejecting, and proofreading again. Custom prints might also pose a risk of misprints and trademark infringements, as well as mismatched expectations - especially if there is no preview function of the ready product. A solution for those headaches would be a web-to-print editor, which can not only improve the design creation process, but also automatically validate designs and generate previews.&lt;/p&gt;
&lt;h2 id=&quot;scale-personalization-with-cesdk&quot;&gt;Scale Personalization with CE.SDK&lt;/h2&gt;
&lt;p&gt;CreativeEditor SDK was developed with the thought of bringing automation and scalability to creative materials. Because of its versatility and extensive features, it can be applied across all industries and utilized on all channels and platforms, and addresses some of the most burning questions limiting the current use of personalization.&lt;/p&gt;
&lt;h3 id=&quot;personalized-cross-channel-content&quot;&gt;Personalized Cross-Channel Content&lt;/h3&gt;
&lt;p&gt;How do you create personalized content that can be implemented for a large audience across multiple channels, all with limited resources? The short answer is &lt;strong&gt;automation&lt;/strong&gt;. Creating countless variations of marketing materials has to be automated, otherwise, it cannot be scaled.&lt;/p&gt;
&lt;p&gt;The most efficient way is to work with adjustable templates and data variation imports. Designers can create as many templates as needed, making sure they stay on brand, while marketers and social media creators can adapt them to their needs.&lt;/p&gt;
&lt;p&gt;CreativeEditor SDK offers the possibility of creating smart templates with adjustable placeholders and constraints. This way, editing of any design is done in a controlled and predefined way. The editor can be used by internal teams, as well as external clients and customers, making the production of all marketing materials easily scalable.&lt;/p&gt;
&lt;h3 id=&quot;how-to-develop-a-web2print-editor-in-a-timely-manner&quot;&gt;How to Develop a Web2print Editor in a Timely Manner?&lt;/h3&gt;
&lt;p&gt;The most time-efficient way is to use Software Development Kit. SDKs contain powerful features with quick and easy integration and give the opportunity to stay on brand with customizable UI.&lt;/p&gt;
&lt;p&gt;Choosing CE.SDK, whether for photo prints, apparel, or marketing materials, can streamline the web2print process and solve many of the custom print challenges. With smart templates, companies can jumpstart their customers’ creative process, ensuring right design dimensions and quality. While automatic design validation safeguards the printing process with notifications of artwork exceeding bleed margin, as well as checking for harmful content or trademark infringements.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Regardless if you use it as a key component or part of a bigger strategy, personalization is here to stay, and it will most likely determine the success of many brands and industries. Staying up to date with current personalization trends is becoming a must for marketers, with a growing need to think outside the box. The ability to scale personalized marketing materials, and provide bespoke user experience and relevant recommendations, are the future of reaching conversion goals and building lasting relationships with customers.&lt;/p&gt;
&lt;p&gt;Companies will have to find ways to easily and efficiently scale personalization and bring it to their users. IMG.LY developed tools to help with those efforts. Learn more about &lt;a href=&quot;https://img.ly/products/creative-sdk&quot;&gt;CE.SDK&lt;/a&gt; capabilities or see how to use it for &lt;a href=&quot;https://img.ly/use-cases/creative-automation&quot;&gt;Creative Automation&lt;/a&gt; process or &lt;a href=&quot;https://img.ly/industries/print&quot;&gt;Web-to-Print&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you want to learn more about integrating CE.SDK, check out our &lt;a href=&quot;https://img.ly/docs/cesdk/js/what-is-cesdk-2e7acd/&quot;&gt;documentation&lt;/a&gt; or &lt;a href=&quot;https://img.ly/forms/free-trial&quot;&gt;try it for free&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Thanks for reading. To stay in the loop, subscribe to our&lt;/strong&gt; &lt;a href=&quot;https://photoeditorsdk.us13.list-manage.com/subscribe?u=dc9f652839dbb620d14d6d28d&amp;#x26;id=04a306e4b2&quot;&gt;&lt;strong&gt;Newsletter&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;</content:encoded><dc:creator>Klaudia</dc:creator><media:content url="https://blog.img.ly/2023/02/how-to-personalize-products-.jpg" medium="image"/><category>Automation</category><category>Personlization</category><category>Design Editor</category><category>Print</category><category>Learning</category></item><item><title>CE.SDK v1.8.0 Release</title><link>https://img.ly/blog/creative-editor-sdk-v_1_8_0-release-notes/</link><guid isPermaLink="true">https://img.ly/blog/creative-editor-sdk-v_1_8_0-release-notes/</guid><description>This release includes Node.js Platform Support, enhanced image control, and more!</description><pubDate>Tue, 18 Oct 2022 14:48:05 GMT</pubDate><content:encoded>&lt;p&gt;Since our CE.SDK &lt;a href=&quot;https://img.ly/blog/creative-editor-sdk-v_1_7_0-release-notes/?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=releasenotes&quot;&gt;v1.7.0&lt;/a&gt; Release, we implemented more highly requested features. Today, we shine light on them. As always, we are excited to hear your feedback and suggestions to build powerful features for your application. Our &lt;a href=&quot;https://roadmap.img.ly/?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=releasenotes&quot;&gt;Product Roadmap&lt;/a&gt; is the best place to make your case and be the first one to know of future releases.&lt;/p&gt;
&lt;p&gt;&lt;video src=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/cesdk_v1-8-0-summary.mp4&quot; controls playsinline poster=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/cesdk-v-1-8-0_cover.jpg&quot;&gt;&lt;/video&gt;&lt;/p&gt;
&lt;h2 id=&quot;cesdk-v180&quot;&gt;CE.SDK v1.8.0&lt;/h2&gt;
&lt;p&gt;This release includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Node.js Platform Support&lt;/li&gt;
&lt;li&gt;Common Touch Gesture Support for iOS&lt;/li&gt;
&lt;li&gt;Emoji Support ?&lt;/li&gt;
&lt;li&gt;Image Straightening in Advanced &amp;#x26; Default UI&lt;/li&gt;
&lt;li&gt;Multi Selection Rotation&lt;/li&gt;
&lt;li&gt;Outlook&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;nodejs-platform-support&quot;&gt;Node.js Platform Support&lt;/h3&gt;
&lt;p&gt;Since the release of our &lt;a href=&quot;https://www.npmjs.com/package/@cesdk/node&quot;&gt;Node Package&lt;/a&gt;, you can run a headless version of CE.SDK on the server. Now with this release, you have the full power of our Creative Engine at your fingertips, enabling you to programmatically generate images on the server or command line, render scenes created with the web SDK, and implement any creative automation workflow.&lt;/p&gt;
&lt;h3 id=&quot;common-touch-gesture-support-for-ios&quot;&gt;Common Touch Gesture Support for iOS&lt;/h3&gt;
&lt;p&gt;We know that a mobile presence and functionality is crucial for your application. If users find it difficult to complete a task or are frustrated by poor usability, they could quickly bid adieu to your app and ditch your hard work for a competitor. So with this update, we add common touch gesture to improve the editing experience on touchpads and mobile devices. This includes gestures like pinching, spreading, dragging, rotating, tap and double tapping.&lt;/p&gt;
&lt;h3 id=&quot;emoji-support&quot;&gt;Emoji Support&lt;/h3&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/Emoticon_Support_Z14LJgA.webp&quot; srcset=&quot;/_astro/Emoticon_Support_Z2sV7lX.webp 640w, /_astro/Emoticon_Support_cm4FH.webp 750w, /_astro/Emoticon_Support_Z28eEIM.webp 828w, /_astro/Emoticon_Support_Z8mMhQ.webp 1080w, /_astro/Emoticon_Support_ZB4KLI.webp 1280w, /_astro/Emoticon_Support_Z14LJgA.webp 1480w&quot;&gt;&lt;/p&gt;
&lt;p&gt;Sometimes, a party face says more than a thousand words ?: Emojis have become an essential part of modern communication and are omnipresent, especially on mobile platforms, but on desktop as well. We added Emoji rendering support for more fun edits and colorful messaging.&lt;/p&gt;
&lt;h3 id=&quot;image-straightening-in-advanced--default-ui&quot;&gt;Image Straightening in Advanced &amp;#x26; Default UI&lt;/h3&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/Image-Straighten-in-Advanced---Desktop-UI_25ivqN.webp&quot; srcset=&quot;/_astro/Image-Straighten-in-Advanced---Desktop-UI_1Ig67Y.webp 640w, /_astro/Image-Straighten-in-Advanced---Desktop-UI_dKO90.webp 750w, /_astro/Image-Straighten-in-Advanced---Desktop-UI_ZvWPQk.webp 828w, /_astro/Image-Straighten-in-Advanced---Desktop-UI_1cOROz.webp 1080w, /_astro/Image-Straighten-in-Advanced---Desktop-UI_ZSwmLh.webp 1280w, /_astro/Image-Straighten-in-Advanced---Desktop-UI_25ivqN.webp 1480w&quot;&gt;&lt;/p&gt;
&lt;p&gt;While cropping your image, you can now also straighten, flip and rotate it! This feature gives you full control over your image in one place – available in both Advanced and Default User Interfaces.&lt;/p&gt;
&lt;h3 id=&quot;multi-selection-rotation&quot;&gt;Multi Selection Rotation&lt;/h3&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/multi-selection-rotation-small_-1-_1wSd7Y.webp&quot; srcset=&quot;/_astro/multi-selection-rotation-small_-1-_p9U93.webp 640w, /_astro/multi-selection-rotation-small_-1-_KG4mg.webp 750w, /_astro/multi-selection-rotation-small_-1-_ZM2FD2.webp 828w, /_astro/multi-selection-rotation-small_-1-_ZF1y1u.webp 1080w, /_astro/multi-selection-rotation-small_-1-_qqk3f.webp 1280w, /_astro/multi-selection-rotation-small_-1-_1wSd7Y.webp 1480w&quot;&gt;&lt;/p&gt;
&lt;p&gt;For an accelerated design and editing process, the engine and user interface now allow rotating several blocks at once. To multi-rotate, simply hold your &lt;em&gt;Shift&lt;/em&gt; key while selecting the blocks you would like to move simultaneously.&lt;/p&gt;
&lt;h3 id=&quot;outlook&quot;&gt;Outlook&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Native iOS Platform Support:&lt;/strong&gt; With this feature, we will add support for developing native iOS applications with the SDK. It will come with full Swift API support and many integration examples.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Video for Web with CreativeEditor SDK:&lt;/strong&gt; Users will be able to edit and create fantastic videos based on templates in their browser with our SDK in your application soon! &lt;a href=&quot;https://photoeditorsdk.us13.list-manage.com/subscribe?u=dc9f652839dbb620d14d6d28d&amp;#x26;id=4833b9cfb6&quot;&gt;Sign up&lt;/a&gt; for &lt;strong&gt;early access&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Thanks for reading! To stay in the loop, feel free to subscribe to our &lt;a href=&quot;https://share.hsforms.com/1IgAOV1wASXGPnFG4ZPLejg1hk3i&quot;&gt;Newsletter&lt;/a&gt;.&lt;/p&gt;</content:encoded><dc:creator>Neslihan</dc:creator><media:content url="https://blog.img.ly/2022/10/creative-editor-sdk-design-editor-sdk-1-8-0-imgly.png" medium="image"/><category>Release Notes</category><category>Releases</category><category>Design Editor</category><category>Web Development</category><category>Web Application</category><category>iOS</category></item><item><title>CE.SDK v1.7.0 Release and Roadmap</title><link>https://img.ly/blog/creative-editor-sdk-v_1_7_0-release-notes/</link><guid isPermaLink="true">https://img.ly/blog/creative-editor-sdk-v_1_7_0-release-notes/</guid><description>Enjoy powerful Blur and Effects APIs, Shadows, Rotation of Groups and Hierarchies, and more. Our Product Roadmap will keep you up-to-date.</description><pubDate>Mon, 08 Aug 2022 12:07:47 GMT</pubDate><content:encoded>&lt;p&gt;Today, we are thrilled to highlight the best new features and changes in CE.SDK since our &lt;a href=&quot;https://img.ly/blog/creative-editor-sdk-v_1_6_0-release-notes/?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=releasenotes&quot;&gt;v1.6.0 Release&lt;/a&gt;. We have also published our &lt;a href=&quot;https://roadmap.img.ly/&quot;&gt;&lt;strong&gt;Product Roadmap for CE.SDK&lt;/strong&gt;&lt;/a&gt; to share our vision and direction for upcoming releases. This roadmap will let you know ahead of time what features you can expect from us and accelerate your product planning and development. We are excited to hear your feedback and suggestions to build more powerful features for your application!&lt;/p&gt;
&lt;h2 id=&quot;cesdk-v170&quot;&gt;CE.SDK v1.7.0&lt;/h2&gt;
&lt;p&gt;This release includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Auto Close Option in Web UI Configuration for Asset Libraries&lt;/li&gt;
&lt;li&gt;Custom URI Resolver&lt;/li&gt;
&lt;li&gt;Improving Mobile Touch Support&lt;/li&gt;
&lt;li&gt;Rotation of Groups and Hierarchies&lt;/li&gt;
&lt;li&gt;Custom Asset Source UI&lt;/li&gt;
&lt;li&gt;Disconnecting UI Variants from Roles&lt;/li&gt;
&lt;li&gt;Asset Source ApplyAsset API&lt;/li&gt;
&lt;li&gt;Blur API&lt;/li&gt;
&lt;li&gt;Effects API&lt;/li&gt;
&lt;li&gt;Image Fills API&lt;/li&gt;
&lt;li&gt;Image Straighten API&lt;/li&gt;
&lt;li&gt;Improved Group Selection and API&lt;/li&gt;
&lt;li&gt;Scopes API&lt;/li&gt;
&lt;li&gt;Shadows API&lt;/li&gt;
&lt;li&gt;Zoom API&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;auto-close-option-in-web-ui-configuration-for-asset-libraries&quot;&gt;Auto Close Option in Web UI Configuration for Asset Libraries&lt;/h3&gt;
&lt;p&gt;&lt;img alt=&quot;Should it stay or should it go? Have control over your library behavior with this update.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 740px) 740px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;740&quot; height=&quot;321&quot; src=&quot;https://img.ly/_astro/auto_close_lib_1W98pV.webp&quot; srcset=&quot;/_astro/auto_close_lib_1Jj7hj.webp 640w, /_astro/auto_close_lib_1W98pV.webp 740w&quot;&gt;&lt;/p&gt;
&lt;p&gt;There are no one-size-fits-all solutions for the behavior of asset library panels after an action was triggered. It depends on the use case and might vary between the panels and the available screen space. Thus, this is now configurable.&lt;/p&gt;
&lt;h3 id=&quot;custom-uri-resolver&quot;&gt;Custom URI Resolver&lt;/h3&gt;
&lt;p&gt;Custom URI Resolvers give you full control over how URIs should be resolved. You can create custom storage backends and even resolve different resolution images in different instances. Find more information in our &lt;a href=&quot;https://img.ly/docs/cesdk/js/open-the-editor/uri-resolver-36b624/?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=releasenotes&quot;&gt;documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;improving-mobile-touch-support&quot;&gt;Improving Mobile Touch Support&lt;/h3&gt;
&lt;p&gt;&lt;img alt=&quot;Great design-to-go: improved mobile touch support.&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/mobile_touch_Z2g42pt.webp&quot; srcset=&quot;/_astro/mobile_touch_ZJKt2L.webp 640w, /_astro/mobile_touch_Z1AgDJY.webp 750w, /_astro/mobile_touch_ZGdINX.webp 828w, /_astro/mobile_touch_Z2doG6d.webp 1080w, /_astro/mobile_touch_imcDC.webp 1280w, /_astro/mobile_touch_Z2g42pt.webp 1480w&quot;&gt;&lt;/p&gt;
&lt;p&gt;Input handling was streamlined to handle both touch and mouse input efficiently. On touch devices, all handles maintain the recommended minimum size for touch input and are intelligently hidden to minimize overlap. Thanks to this mechanism, resizing and rotating are always a breeze.&lt;/p&gt;
&lt;h3 id=&quot;rotation-of-groups-and-hierarchies&quot;&gt;Rotation of Groups and Hierarchies&lt;/h3&gt;
&lt;p&gt;&lt;img alt=&quot;Simplify your design process by grouping elements and edit them altogether.&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/rotation_of_groups_oxAW4.webp&quot; srcset=&quot;/_astro/rotation_of_groups_1NFy6r.webp 640w, /_astro/rotation_of_groups_2ss6Qm.webp 750w, /_astro/rotation_of_groups_ZCO3fG.webp 828w, /_astro/rotation_of_groups_29du7E.webp 1080w, /_astro/rotation_of_groups_Z1gd1mB.webp 1280w, /_astro/rotation_of_groups_oxAW4.webp 1480w&quot;&gt;&lt;/p&gt;
&lt;p&gt;The engine and user interface add options for rotating groups and design blocks with children. This allows changing the rotation of multiple elements at once quickly.&lt;/p&gt;
&lt;h3 id=&quot;custom-asset-source-ui&quot;&gt;Custom Asset Source UI&lt;/h3&gt;
&lt;p&gt;Instead of fixed entry points such as “Images,” “Stickers,” or “Shapes,” we want to enable custom and flexible entry points. Until today, we tied them to a block type, which is currently only relevant when users add an asset to the scene.&lt;/p&gt;
&lt;h3 id=&quot;moving-from-roles-to-abilities-disconnecting-ui-variants-from-roles&quot;&gt;Moving from Roles to Abilities: Disconnecting UI Variants from Roles&lt;/h3&gt;
&lt;p&gt;Before the change, the Advanced UI was tied to the creator role and the Default UI was tied to the Adopter Role. This is now no longer the case. The scopes and editing options are still controlled by the abilities of the current role.&lt;/p&gt;
&lt;h3 id=&quot;shadows-in-advanced-ui&quot;&gt;Shadows in Advanced UI&lt;/h3&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/shadows_in_advanced_API_Z1FOoi7.webp&quot; srcset=&quot;/_astro/shadows_in_advanced_API_Z45be.webp 640w, /_astro/shadows_in_advanced_API_Zy5jRz.webp 750w, /_astro/shadows_in_advanced_API_egkMm.webp 828w, /_astro/shadows_in_advanced_API_Qlk0w.webp 1080w, /_astro/shadows_in_advanced_API_27QwKF.webp 1280w, /_astro/shadows_in_advanced_API_Z1FOoi7.webp 1480w&quot;&gt;&lt;/p&gt;
&lt;p&gt;With this update, we roll out the long-awaited ability to apply shadows to elements in our Advanced UI. Realistic drop shadow effects add more depth to your designs with a few clicks – no other editor is needed.&lt;/p&gt;
&lt;h3 id=&quot;blur-api&quot;&gt;Blur API&lt;/h3&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/blur_API_Zfrq6A.webp&quot; srcset=&quot;/_astro/blur_API_1o848m.webp 640w, /_astro/blur_API_ZGbmUm.webp 750w, /_astro/blur_API_ZziuOW.webp 828w, /_astro/blur_API_Z2rt0Ii.webp 1080w, /_astro/blur_API_Z1lsdpr.webp 1280w, /_astro/blur_API_Zfrq6A.webp 1480w&quot;&gt;&lt;/p&gt;
&lt;p&gt;We introduce new APIs to modify the blur for images and other blocks. This change allows programmatic access to add blur effects in automation cases and when building your own UI.&lt;/p&gt;
&lt;h3 id=&quot;effects-api&quot;&gt;Effects API&lt;/h3&gt;
&lt;p&gt;We introduce new APIs to modify the effect stack for shapes and other blocks. This allows programmatic access to effects like adjustments, LUT filters, and many more.&lt;/p&gt;
&lt;h3 id=&quot;image-fills-api&quot;&gt;Image Fills API&lt;/h3&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/image_fill_HmPh2.webp&quot; srcset=&quot;/_astro/image_fill_Z1IbTb.webp 640w, /_astro/image_fill_Z14KA8n.webp 750w, /_astro/image_fill_1rwknl.webp 828w, /_astro/image_fill_274TKn.webp 1080w, /_astro/image_fill_1pdRvH.webp 1280w, /_astro/image_fill_HmPh2.webp 1480w&quot;&gt;&lt;/p&gt;
&lt;p&gt;Currently, you can only access and use images with the image block. However, pages or vector shapes could use more than just a color or gradient fill. Therefore, we broaden the concept of fills by allowing every block to have an image fill, e.g., pages. This change will enable building a more natural photo- or video-editor experience. &lt;a href=&quot;https://img.ly/docs/cesdk/js/fills/overview-3895ee/?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=releasenotes&quot;&gt;Documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;image-straighten-api&quot;&gt;Image Straighten API&lt;/h3&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/image_straighten_Z1uLpF1.webp&quot; srcset=&quot;/_astro/image_straighten_Z29KtL5.webp 640w, /_astro/image_straighten_vwHgA.webp 750w, /_astro/image_straighten_Z1O428T.webp 828w, /_astro/image_straighten_ZymsGh.webp 1080w, /_astro/image_straighten_Z124rb9.webp 1280w, /_astro/image_straighten_Z1uLpF1.webp 1480w&quot;&gt;&lt;/p&gt;
&lt;p&gt;We are extending the Image Crop API to allow straightening, flipping, and rotating images during cropping. This change allows more fine-grained control.&lt;/p&gt;
&lt;h3 id=&quot;improved-group-selection-and-api&quot;&gt;Improved Group Selection and API&lt;/h3&gt;
&lt;p&gt;There are multiple options to select blocks inside a group:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;selecting a group first and with each click select one block deeper in the hierarchy&lt;/li&gt;
&lt;li&gt;selecting an element under the cursor directly, neglecting the hierarchy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Previously, we defaulted to different behaviors depending on the user’s role. Now, this is configurable and also customizable during runtime via APIs. Therefore, it’s up to the implementor how the selection should work.&lt;/p&gt;
&lt;h3 id=&quot;scopes-api&quot;&gt;Scopes API&lt;/h3&gt;
&lt;p&gt;We introduce new APIs to modify the scopes for blocks. This update allows programmatic access to change the scopes for users and allows control over the possible edits a user can make to a scene.&lt;/p&gt;
&lt;h3 id=&quot;shadows-api&quot;&gt;Shadows API&lt;/h3&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/shadows_API_jTf6L.webp&quot; srcset=&quot;/_astro/shadows_API_PF3VL.webp 640w, /_astro/shadows_API_1R2ETk.webp 750w, /_astro/shadows_API_Gh7bU.webp 828w, /_astro/shadows_API_2a5X4g.webp 1080w, /_astro/shadows_API_Z1i5WNW.webp 1280w, /_astro/shadows_API_jTf6L.webp 1480w&quot;&gt;&lt;/p&gt;
&lt;p&gt;We introduce new APIs to modify shadows for images and other blocks. This change allows programmatic access to add shadow effects to be used in automation cases and when you build your UI.&lt;/p&gt;
&lt;h3 id=&quot;zoom-api&quot;&gt;Zoom API&lt;/h3&gt;
&lt;p&gt;We introduce new APIs to modify the current zoom level. This allows programmatic access to change the current zoom easily for automation use-cases or for building your own user interface.&lt;/p&gt;
&lt;h2 id=&quot;product-roadmap&quot;&gt;Product Roadmap&lt;/h2&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/API_general_snkLp.webp&quot; srcset=&quot;/_astro/API_general_Z2gaGAs.webp 640w, /_astro/API_general_Z1eN5CT.webp 750w, /_astro/API_general_Z2pyDlj.webp 828w, /_astro/API_general_2iz3IT.webp 1080w, /_astro/API_general_Z19BR9j.webp 1280w, /_astro/API_general_snkLp.webp 1480w&quot;&gt;&lt;/p&gt;
&lt;p&gt;As mentioned before, we are happy to publish our &lt;a href=&quot;https://roadmap.img.ly&quot;&gt;Product Roadmap&lt;/a&gt; to let you in on our new features and enhancements for CE.SDK. This way, we can elaborate our decisions and plans for the product and how you can benefit while allowing you to give us feedback and indicate the importance of particular features.&lt;br&gt;
Now that you know what’s coming down the pike, you can prepare for the release of significant improvements and new features such as &lt;strong&gt;Video Support for Web&lt;/strong&gt; or &lt;strong&gt;Native iOS Support&lt;/strong&gt; well in advance.&lt;/p&gt;
&lt;h3 id=&quot;thanks-for-reading-let-us-know-what-you-think-on-twitter-to-stay-in-the-loop-subscribe-to-our-newsletter&quot;&gt;Thanks for reading! Let us know what you think on &lt;a href=&quot;https://twitter.com/imgly&quot;&gt;Twitter&lt;/a&gt;! To stay in the loop, subscribe to our &lt;a href=&quot;https://photoeditorsdk.us13.list-manage.com/subscribe?u=dc9f652839dbb620d14d6d28d&amp;#x26;id=04a306e4b2&quot;&gt;Newsletter&lt;/a&gt;.&lt;/h3&gt;</content:encoded><dc:creator>Malte</dc:creator><dc:creator>Daniel</dc:creator><media:content url="https://blog.img.ly/2022/08/creative-editor-sdk-design-photo-editor-javascript.png" medium="image"/><category>Release Notes</category><category>CE.SDK</category><category>Roadmap</category><category>Web Application</category><category>Web Development</category><category>Creative Editor</category><category>Design Editor</category><category>Photo Editor</category><category>SDK</category></item><item><title>How To Build a Canva Clone with CE.SDK</title><link>https://img.ly/blog/how-to-build-a-canva-clone-with-ce-sdk/</link><guid isPermaLink="true">https://img.ly/blog/how-to-build-a-canva-clone-with-ce-sdk/</guid><description>Design invitations, greeting cards, flyers, postcards, and business cards with a Canva clone built with CE.SDK in React in minutes. </description><pubDate>Wed, 27 Jul 2022 06:43:59 GMT</pubDate><content:encoded>&lt;p&gt;Canva has popularized image editing, and user expectations of creative capabilities have increased accordingly. If your web or mobile application includes any design functionality - for book covers, t-shirt designs, or social media content - it has to be on par with the design experience offered by prosumer creation tools such as Canva.&lt;/p&gt;
&lt;p&gt;Allowing users to edit images through an easy user interface, define high-quality templates, and give them the ability to share them with the community is a great way to boost engagement, add virality, and potentially new revenue streams.&lt;/p&gt;
&lt;p&gt;You might think this requires a lot of time and effort, but that is not the case. CreativeEditor SDK makes it dead simple to build a Canva-like design editor in minutes. I’ll show you how!&lt;/p&gt;
&lt;p&gt;Follow this step-by-step tutorial and learn how to implement a Canva clone in React with CE.SDK. At the end of this tutorial, you will achieve the following result:&lt;/p&gt;
&lt;p&gt;Try the final result live on &lt;a href=&quot;https://codesandbox.io/embed/how-to-build-a-canva-clone-with-ce-sdk-forked-nvxz3w&quot;&gt;CodeSandbox&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;what-is-canva&quot;&gt;What is Canva?&lt;/h2&gt;
&lt;p&gt;Canva is a free graphic design tool for image editing featuring a drag-and-drop interface for composing different elements on a canvas. You can easily create flyers, invitations, business cards, and more with professionally designed templates. You can think of it as a basic version of Photoshop that anyone can use.&lt;/p&gt;
&lt;p&gt;You can create Canva templates in a web browser or on the official app for iOS or Android, share them and collaborate easily. Templates make Canva a powerful tool - that is also true for CE.SDK, which makes it a perfect harbor to set sail for new horizons and create an excellent editor. Before we learn how to replicate Canva, let us evaluate the SDK in question.&lt;/p&gt;
&lt;h2 id=&quot;what-is-cesdk&quot;&gt;What is CE.SDK?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://img.ly/products/creative-sdk?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=howtos&quot;&gt;CreativeEditor SDK (CE.SDK)&lt;/a&gt; is a fully customizable, user-friendly design editor tool. You can integrate it easily into your application with just a few lines of code and benefit from the template-based editor in no time.&lt;/p&gt;
&lt;p&gt;The role-specific editing UI focuses heavily on content adaptation. CE.SDK offers two modes: in Creator Mode, you can create a design from scratch or customize existing templates. Once ready, creators can share their templates and decide which elements others can change and to what degree. Then, users can import the template and customize it in Adopter Mode (Default UI).&lt;/p&gt;
&lt;p&gt;Try CE.SDK &lt;a href=&quot;https://img.ly/showcases/cesdk&quot;&gt;live demos&lt;/a&gt; or &lt;a href=&quot;https://img.ly/forms/free-trial&quot;&gt;start a free trial&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;designing-and-sharing-a-template-in-creator-mode&quot;&gt;Designing and Sharing a Template in Creator Mode&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&quot;https://img.ly/docs/cesdk/react/configuration-2c1c3d/&quot;&gt;&lt;code&gt;Creator&lt;/code&gt;&lt;/a&gt; Mode is the most powerful and least restrictive role in CE.SDK. It empowers you to unleash your creativity and create custom templates for every imaginable use case. Add, move, modify, and delete elements as you wish and define constraints. Further elevate your designs with photo editings, such as filters, effects, and background removal.&lt;/p&gt;
&lt;p&gt;The well-rounded text editor also allows you to define variables and programmatically give them a value using the CE.SDK &lt;a href=&quot;https://img.ly/docs/cesdk/react/create-templates/add-dynamic-content/text-variables-7ecb50/&quot;&gt;Variable API&lt;/a&gt;. For example, you may introduce a &lt;code&gt;{{Name}}&lt;/code&gt; Variable and have CESDK import names from a database. This automation is perfect for batch-processing designs, such as greeting cards. Based on this principle, we have built an example &lt;a href=&quot;https://img.ly/blog/how-to-generate-an-nft-art-collection-with-react-using-ce-sdk/?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=howtos&quot;&gt;NFT Art Collection Generator in React with CE.SDK&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In the Creator Mode, you also can define &lt;a href=&quot;https://img.ly/docs/cesdk/react/create-templates/add-dynamic-content/placeholders-d9ba8a/&quot;&gt;placeholders&lt;/a&gt;. Turning an element into a placeholder will let you determine if it can be deleted, styled, or duplicated by the adopter.&lt;/p&gt;
&lt;p&gt;This is what the CE.SDK Creator Mode looks like:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;creator-mode-cesdk&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1000px) 1000px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1000&quot; height=&quot;506&quot; src=&quot;https://img.ly/_astro/creator-mode-cesdk_Z1H6JCC.webp&quot; srcset=&quot;/_astro/creator-mode-cesdk_Q0z9g.webp 640w, /_astro/creator-mode-cesdk_1WU4FC.webp 750w, /_astro/creator-mode-cesdk_Z1Ww1nc.webp 828w, /_astro/creator-mode-cesdk_Z1H6JCC.webp 1000w&quot;&gt;&lt;/p&gt;
&lt;p&gt;As you can see, you can use CE.SDK to easily create a wedding invitation card template. This is just an example, and you can find other cool sample templates for greeting cards, flyers, postcards, and business cards on &lt;a href=&quot;https://img.ly/showcases/cesdk?tags=custom-build-uis&quot;&gt;showcase page&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;what-adopter-mode-offers-you&quot;&gt;What Adopter Mode Offers You&lt;/h3&gt;
&lt;p&gt;You can test the adopter view of the wedding invitation card template shown above &lt;a href=&quot;https://ubique.img.ly/main/apps/dashboard/#/template/Hoc0dPRe5l9BfJaqwCI3&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is what the Adopter Mode looks like:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;adopter-mode&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 999px) 999px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;999&quot; height=&quot;485&quot; src=&quot;https://img.ly/_astro/adopter-mode_Z1qq5LI.webp&quot; srcset=&quot;/_astro/adopter-mode_gAVDi.webp 640w, /_astro/adopter-mode_Z1ThvMI.webp 750w, /_astro/adopter-mode_Z22GG6v.webp 828w, /_astro/adopter-mode_Z1qq5LI.webp 999w&quot;&gt;&lt;/p&gt;
&lt;p&gt;As shown above, CE.SDK’s Adopter Mode enables you to add and modify colors, text, and images based on the constraints enabled by the creator of the template. This mode provides the &lt;a href=&quot;https://img.ly/docs/cesdk/js/configuration-2c1c3d/?ref=img.ly#adopter?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=howtos&quot;&gt;&lt;code&gt;Adopter&lt;/code&gt;&lt;/a&gt; users with a simple interface, narrowed down to the properties that they are allowed to change. This prevents adopters from accidentally changing or deleting parts of a design that should not be modified.&lt;/p&gt;
&lt;h2 id=&quot;implement-a-canva-clone-with-cesdk&quot;&gt;Implement a Canva Clone with CE.SDK&lt;/h2&gt;
&lt;p&gt;Let’s now learn how to use CE.SDK to build a Canva clone in React.&lt;/p&gt;
&lt;h3 id=&quot;prerequisites&quot;&gt;Prerequisites&lt;/h3&gt;
&lt;p&gt;This is the list of all the prerequisites for the Canva clone application you are going to build:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.npmjs.com/getting-started/&quot;&gt;Node.js and npm 8.0+ and higher&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://react.dev/&quot;&gt;React&lt;/a&gt; &gt;= 18&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/@cesdk/cesdk-js&quot;&gt;&lt;code&gt;@cesdk/cesdk-js&lt;/code&gt;&lt;/a&gt; &gt; 1.6.3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Add &lt;code&gt;@cesdk/cesdk-js&lt;/code&gt; to your project’s dependencies with the following command:&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;npm install @cesdk/cesdk-js&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;initialize-a-react-project&quot;&gt;Initialize a React Project&lt;/h3&gt;
&lt;p&gt;You can try out the Canva clone by cloning the &lt;a href=&quot;https://github.com/imgly/canva-clone-react-cesdk&quot;&gt;GitHub repository supporting the article&lt;/a&gt; and running the demo web application with the following commands:&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;git clone https://github.com/Tonel/canva-clone-cesdk-imgly&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;cd canva-clone-cesdk-imgly&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm i&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm start&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Otherwise, follow this step-by-step tutorial and learn how to build the Canva clone with CE.SDK by yourself.&lt;/p&gt;
&lt;p&gt;First, you need to initialize a &lt;code&gt;canva-clone-cesdk-imgly&lt;/code&gt; React project. You can do it with &lt;a href=&quot;https://create-react-app.dev/docs/getting-started/&quot;&gt;Create React App&lt;/a&gt; by launching the command 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;npx create-react-app canva-clone-cesdk-imgly&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now, the &lt;code&gt;canva-clone-cesdk-imgly&lt;/code&gt; folder will have the following file structure:&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;canva-clone-cesdk-imgly&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── README.md&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── node_modules&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;├── .gitignore&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── public&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── favicon.ico&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;│   ├── logo192.png&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── logo512.png&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── manifest.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   └── robots.txt&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.css&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ├── App.js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ├── App.test.js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ├── index.css&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ├── index.js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ├── logo.svg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ├── reportWebVitals.js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    └── setupTests.js&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Move into the &lt;code&gt;canva-clone-cesdk-imgly&lt;/code&gt; folder and start a local development server with:&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;cd canva-clone-cesdk-imgly&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm start&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Reach &lt;a href=&quot;http://localhost:3000/&quot;&gt;http://localhost:3000/&lt;/a&gt; in your browser and make sure you see the default Create React App screen below:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;react&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 983px) 983px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;983&quot; height=&quot;728&quot; src=&quot;https://img.ly/_astro/react_1REyVa.webp&quot; srcset=&quot;/_astro/react_2lRYbq.webp 640w, /_astro/react_Z21FBPj.webp 750w, /_astro/react_OLsOd.webp 828w, /_astro/react_1REyVa.webp 983w&quot;&gt;&lt;/p&gt;
&lt;p&gt;You are now ready to code!&lt;/p&gt;
&lt;h3 id=&quot;build-the-canva-clone-component-with-cesdk&quot;&gt;Build the Canva Clone Component with CE.SDK&lt;/h3&gt;
&lt;p&gt;If you want your image editing component to provide a Canva-like experience, it must include key features, such as template and custom resource management. Let’s see how to implement them all with CE.SDK.&lt;/p&gt;
&lt;h4 id=&quot;configure-cesdk-to-use-templates&quot;&gt;Configure CE.SDK to use templates&lt;/h4&gt;
&lt;p&gt;Managing templates in CE.SDK is easy. All you have to do is configure the set of predefined templates loaded by CE.SDK on initialization, as explained in the &lt;a href=&quot;https://img.ly/docs/cesdk/react/use-templates/library-b3c704/&quot;&gt;official documentation on adding templates&lt;/a&gt;. You can achieve this as below:&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;useEffect&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; cesdk;&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;  let&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;    // initializing CE.SDK with a few templates&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    presets: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      templates: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        postcard_1: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          label: &lt;/span&gt;&lt;span&gt;&apos;Postcard Design&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          scene: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_postcard_1.scene`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          thumbnailURL: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_postcard_1.png`&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;        postcard_2: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          label: &lt;/span&gt;&lt;span&gt;&apos;Postcard Tropical&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          scene: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_postcard_2.scene`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          thumbnailURL: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_postcard_2.png`&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;        business_card_1: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          label: &lt;/span&gt;&lt;span&gt;&apos;Business card&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          scene: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_business_card_1.scene`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          thumbnailURL: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_business_card_1.png`&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;        instagram_photo_1: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          label: &lt;/span&gt;&lt;span&gt;&apos;Instagram photo&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          scene: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_instagram_photo_1.scene`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          thumbnailURL: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_instagram_photo_1.png`&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;        instagram_story_1: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          label: &lt;/span&gt;&lt;span&gt;&apos;Instagram story&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          scene: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_instagram_story_1.scene`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          thumbnailURL: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_instagram_story_1.png`&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;        poster_1: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          label: &lt;/span&gt;&lt;span&gt;&apos;Poster&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          scene: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_poster_1.scene`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          thumbnailURL: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_poster_1.png`&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;        presentation_4: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          label: &lt;/span&gt;&lt;span&gt;&apos;Presentation&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          scene: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_presentation_1.scene`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          thumbnailURL: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_presentation_1.png`&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;        collage_1: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          label: &lt;/span&gt;&lt;span&gt;&apos;Collage&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          scene: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_collage_1.scene`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          thumbnailURL: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_collage_1.png`&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 class=&quot;line&quot;&gt;&lt;span&gt;  if&lt;/span&gt;&lt;span&gt; (cesdkContainer.current) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    CreativeEditorSDK.&lt;/span&gt;&lt;span&gt;init&lt;/span&gt;&lt;span&gt;(cesdkContainer.current, config).&lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;instance&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;      cesdk &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; instance;&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;  return&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; (cesdk) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      cesdk.&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;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;}, [cesdkContainer]);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Thanks to the &lt;code&gt;presets.templates&lt;/code&gt;, you can specify all the CE.SDK templates to be made available to users.&lt;br&gt;
Note that the &lt;code&gt;cesdkContainer&lt;/code&gt; variable stores the &lt;a href=&quot;https://legacy.reactjs.org/docs/refs-and-the-dom.html&quot;&gt;React reference&lt;/a&gt; to the div where to mount CE.SDK.&lt;/p&gt;
&lt;p&gt;This is what the CE.SDK template section will look like:&lt;br&gt;
&lt;img alt=&quot;mount&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1866px) 1866px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1866&quot; height=&quot;893&quot; src=&quot;https://img.ly/_astro/mount_iSSUR.webp&quot; srcset=&quot;/_astro/mount_2jvRJt.webp 640w, /_astro/mount_Zh1IIF.webp 750w, /_astro/mount_aEtiJ.webp 828w, /_astro/mount_Z2irfxL.webp 1080w, /_astro/mount_1YRGvg.webp 1280w, /_astro/mount_CvNzu.webp 1668w, /_astro/mount_iSSUR.webp 1866w&quot;&gt;&lt;/p&gt;
&lt;p&gt;As you can see, all eight templates loaded with &lt;code&gt;presets.templates&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id=&quot;integrate-external-asset-sources-into-cesdk&quot;&gt;Integrate External Asset Sources Into CE.SDK&lt;/h4&gt;
&lt;p&gt;CE.SDK supports external asset sources, meaning you can give your users a vast library of resources to supercharge their creative workflows. Instead of spending time building a repository of images manually, you can provide your users with image resources retrieved dynamically by connecting to services like Unsplash and Airtable. Learn &lt;a href=&quot;https://img.ly/docs/cesdk/react/import-media/asset-panel/customize-c9a4de/&quot;&gt;how to integrate external asset sources in CE.SDK&lt;/a&gt;, or see a live demo based on the &lt;a href=&quot;https://img.ly/showcases/cesdk/unsplash-image-assets/web?c_asset_library=airtable&quot;&gt;Unsplash and Airtable integration&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&quot;add-custom-images-to-cesdk&quot;&gt;Add Custom Images to CE.SDK&lt;/h4&gt;
&lt;p&gt;You can load custom resources and make them available to users with CE.SDK. For example, you would like to add this &lt;a href=&quot;https://www.flaticon.com/free-icon/programming_1208884&quot;&gt;Flaticon&lt;/a&gt; below to the available images in CE.SDK:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;icon&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 512px) 512px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;512&quot; height=&quot;512&quot; src=&quot;https://img.ly/_astro/icon_7W96.webp&quot; srcset=&quot;/_astro/icon_7W96.webp 512w&quot;&gt;&lt;/p&gt;
&lt;p&gt;All you need to do is define a new asset source as explained in the documentation page on &lt;a href=&quot;https://img.ly/docs/cesdk/react/import-media/asset-panel/customize-c9a4de/&quot;&gt;Integrating Custom Resources into CE.SDK&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can achieve this 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;useEffect&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;  // path to the local image to load into CE.SDK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  const&lt;/span&gt;&lt;span&gt; customImagePath&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; `${&lt;/span&gt;&lt;span&gt;window&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;protocol&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; window&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;span&gt;}/resources/programming.png`&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;  let&lt;/span&gt;&lt;span&gt; cesdk;&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;  let&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;    // loading the business card template as default template&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    initialSceneURL: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_business_card_1.scene`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    // loading the external asset sources&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    assetSources: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      // loading a custom image into CE.SDK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      custom: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        findAssets&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;          return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            assets: [&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;custom-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;                type: &lt;/span&gt;&lt;span&gt;&apos;ly.img.image&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                locale: &lt;/span&gt;&lt;span&gt;&apos;en&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;Programming&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                thumbUri: customImagePath,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                size: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                  width: &lt;/span&gt;&lt;span&gt;512&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                  height: &lt;/span&gt;&lt;span&gt;512&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;                meta: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                  uri: customImagePath,&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;                context: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                  sourceId: &lt;/span&gt;&lt;span&gt;&apos;custom&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;                credits: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                  name: &lt;/span&gt;&lt;span&gt;&apos;Freepik&apos;&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;&apos;https://www.flaticon.com/free-icon/programming_1208884?related_id=1208782&amp;#x26;origin=search&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;            currentPage: &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;            total: &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;            nextPage: &lt;/span&gt;&lt;span&gt;undefined&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;    // translating the labels associates with the external asset sources&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    i18n: {&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;libraries.custom.label&apos;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;Custom&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;    // initializing CE.SDK with a few templates&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    presets: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      templates: {&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;        business_card_1: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          label: &lt;/span&gt;&lt;span&gt;&apos;Business card&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          scene: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_business_card_1.scene`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          thumbnailURL: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_business_card_1.png`&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 class=&quot;line&quot;&gt;&lt;span&gt;  if&lt;/span&gt;&lt;span&gt; (cesdkContainer.current) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    CreativeEditorSDK.&lt;/span&gt;&lt;span&gt;init&lt;/span&gt;&lt;span&gt;(cesdkContainer.current, config).&lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;instance&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;      cesdk &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; instance;&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;  return&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; (cesdk) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      cesdk.&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;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;}, [cesdkContainer]);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;customImagePath&lt;/code&gt; variable stores the path to the local image file &lt;code&gt;programming.png&lt;/code&gt; located in the &lt;code&gt;public/resources&lt;/code&gt; folder of the React project. This variable is used in the &lt;code&gt;findAssets()&lt;/code&gt; function. This function is important because it defines the complete asset source. In other words, you only need one function to implement the custom asset retrieval logic. Note that providing images with labels is useful to make them searchable through the CE.SDK UI.&lt;/p&gt;
&lt;p&gt;Now, users will be able to use the image in their template.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;icon-template-ce-sdk-create-canva-yourself&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1000px) 1000px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1000&quot; height=&quot;474&quot; src=&quot;https://img.ly/_astro/icon-template-ce-sdk-create-canva-yourself_1F6dsS.webp&quot; srcset=&quot;/_astro/icon-template-ce-sdk-create-canva-yourself_SgMiL.webp 640w, /_astro/icon-template-ce-sdk-create-canva-yourself_Z1zWsKX.webp 750w, /_astro/icon-template-ce-sdk-create-canva-yourself_wOR2.webp 828w, /_astro/icon-template-ce-sdk-create-canva-yourself_1F6dsS.webp 1000w&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;tie-it-together&quot;&gt;Tie it Together&lt;/h4&gt;
&lt;p&gt;This is what the final &lt;code&gt;CanvaClone&lt;/code&gt; component looks like:&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; &apos;./CanvaClone.css&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; CreativeEditorSDK &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;@cesdk/cesdk-js&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; React, { useEffect, useRef } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;react&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; { findAirtableAssets } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;./airtableAssetLibrary&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; { findUnsplashAssets } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;./unsplashAssetLibrary&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;function&lt;/span&gt;&lt;span&gt; CanvaClone&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  // initializing Airtable as default external asset library&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  assetLibrary&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;airtable&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; cesdkContainer&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; useRef&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;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  useEffect&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; externalAssetSources&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;(assetLibrary &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; &apos;airtable&apos;&lt;/span&gt;&lt;span&gt; &amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        airtable: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          findAssets: findAirtableAssets,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          credits: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            name: &lt;/span&gt;&lt;span&gt;&apos;Airtable&apos;&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;&apos;https://airtable.com/shr4x8s9jqaxiJxm5/tblSLR9GBwiVwFS8z?backgroundColor=orange&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;(assetLibrary &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; &apos;unsplash&apos;&lt;/span&gt;&lt;span&gt; &amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        unsplash: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          findAssets: findUnsplashAssets,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          credits: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            name: &lt;/span&gt;&lt;span&gt;&apos;Unsplash&apos;&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;&apos;https://unsplash.com/&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;          license: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            name: &lt;/span&gt;&lt;span&gt;&apos;Unsplash license (free)&apos;&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;&apos;https://unsplash.com/license&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 class=&quot;line&quot;&gt;&lt;span&gt;    // path to the local image to load into CE.SDK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    const&lt;/span&gt;&lt;span&gt; customImagePath&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; `${&lt;/span&gt;&lt;span&gt;window&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;protocol&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; window&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;span&gt;}/resources/programming.png`&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;    let&lt;/span&gt;&lt;span&gt; cesdk;&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;    let&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;      // loading the business card template as default template&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      initialSceneURL: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_business_card_1.scene`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      // loading the external asset sources&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      assetSources: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        // loading the AirTable or Unsplash asset library&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        ...&lt;/span&gt;&lt;span&gt;externalAssetSources,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        // loading a custom image into CE.SDK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        custom: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          findAssets&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;            return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;              assets: [&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;custom-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;                  type: &lt;/span&gt;&lt;span&gt;&apos;ly.img.image&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                  locale: &lt;/span&gt;&lt;span&gt;&apos;en&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;Programming&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                  thumbUri: customImagePath,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                  size: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                    width: &lt;/span&gt;&lt;span&gt;512&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                    height: &lt;/span&gt;&lt;span&gt;512&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;                  meta: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                    uri: customImagePath,&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;                  context: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                    sourceId: &lt;/span&gt;&lt;span&gt;&apos;custom&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;                  credits: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                    name: &lt;/span&gt;&lt;span&gt;&apos;Freepik&apos;&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;&apos;https://www.flaticon.com/free-icon/programming_1208884?related_id=1208782&amp;#x26;origin=search&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;              currentPage: &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;              total: &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;              nextPage: &lt;/span&gt;&lt;span&gt;undefined&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;      // translating the labels associates with the external asset sources&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      i18n: {&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;libraries.airtable.label&apos;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;Airtable&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          &apos;libraries.unsplash.label&apos;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;Unsplash&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          &apos;libraries.custom.label&apos;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;Custom&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;      // initializing CE.SDK with a few templates&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      presets: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        templates: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          postcard_1: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            label: &lt;/span&gt;&lt;span&gt;&apos;Postcard Design&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            scene: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_postcard_1.scene`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            thumbnailURL: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_postcard_1.png`&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;          postcard_2: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            label: &lt;/span&gt;&lt;span&gt;&apos;Postcard Tropical&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            scene: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_postcard_2.scene`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            thumbnailURL: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_postcard_2.png`&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;          business_card_1: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            label: &lt;/span&gt;&lt;span&gt;&apos;Business card&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            scene: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_business_card_1.scene`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            thumbnailURL: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_business_card_1.png`&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;          instagram_photo_1: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            label: &lt;/span&gt;&lt;span&gt;&apos;Instagram photo&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            scene: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_instagram_photo_1.scene`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            thumbnailURL: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_instagram_photo_1.png`&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;          instagram_story_1: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            label: &lt;/span&gt;&lt;span&gt;&apos;Instagram story&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            scene: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_instagram_story_1.scene`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            thumbnailURL: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_instagram_story_1.png`&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;          poster_1: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            label: &lt;/span&gt;&lt;span&gt;&apos;Poster&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            scene: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_poster_1.scene`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            thumbnailURL: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_poster_1.png`&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;          presentation_4: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            label: &lt;/span&gt;&lt;span&gt;&apos;Presentation&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            scene: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_presentation_1.scene`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            thumbnailURL: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_presentation_1.png`&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;          collage_1: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            label: &lt;/span&gt;&lt;span&gt;&apos;Collage&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            scene: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_collage_1.scene`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            thumbnailURL: &lt;/span&gt;&lt;span&gt;`https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_collage_1.png`&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;    if&lt;/span&gt;&lt;span&gt; (cesdkContainer.current) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      CreativeEditorSDK.&lt;/span&gt;&lt;span&gt;init&lt;/span&gt;&lt;span&gt;(cesdkContainer.current, config).&lt;/span&gt;&lt;span&gt;then&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;instance&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;          cesdk &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; instance;&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 class=&quot;line&quot;&gt;&lt;span&gt;    return&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; (cesdk) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        cesdk.&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;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;  }, [cesdkContainer, assetLibrary]);&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;  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;div&lt;/span&gt;&lt;span&gt; className&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;caseContainer&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;div&lt;/span&gt;&lt;span&gt; className&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;wrapper&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;div&lt;/span&gt;&lt;span&gt; ref&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{cesdkContainer} &lt;/span&gt;&lt;span&gt;className&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;cesdk&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;span class=&quot;line&quot;&gt;&lt;span&gt;      &amp;#x3C;/&lt;/span&gt;&lt;span&gt;div&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;div&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;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; CanvaClone;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;findAirtableAssets()&lt;/code&gt; and &lt;code&gt;findUnsplashAssets()&lt;/code&gt; functions come from the &lt;a href=&quot;https://github.com/imgly/cesdk-web-examples/tree/showcases/showcase-custom-asset-libraries&quot;&gt;GitHub repo&lt;/a&gt; associated with the &lt;a href=&quot;https://img.ly/showcases/cesdk/unsplash-image-assets/web?c_asset_library=airtable&quot;&gt;Unsplash and Airtable integration showcase page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;These functions allow CE.SDK to dynamically retrieve resources from online services. A search for images in the CE.SDK UI will perform a query on Airtable or Unsplash and provides them to your users. With just a few lines of code, you are making massive resources available to your users.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Canva has rapidly become one of the most popular graphic design tools. It is so prevalent that users expect similar features in your web and mobile applications. Building a Canva clone from scratch would take months, but with CreativeEditor SDK, it only takes minutes.&lt;/p&gt;
&lt;p&gt;In this article, we used CE.SDK to initialize an advanced design editor in React. We adopted its API to configure and customize a design editor to build a Canva clone. This would not be possible without the intuitive UI offered by CE.SDK and its advanced features, such as &lt;a href=&quot;https://img.ly/showcases/cesdk/placeholders/web?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=howtos&quot;&gt;placeholders&lt;/a&gt; and the possibility to define &lt;a href=&quot;https://img.ly/showcases/cesdk/design-validation/web?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=howtos&quot;&gt;validation rules&lt;/a&gt; to guide your users’ creation process.&lt;/p&gt;
&lt;p&gt;Here we only scratched the surface of what is possible with CE.SDK – you can use its powerful image processing API to implement many more features and make your Canva clone more and more complex. This is only the beginning!&lt;/p&gt;
&lt;p&gt;See how &lt;a href=&quot;https://img.ly/canva-alternative&quot;&gt;IMG.LY compares to Canva Connect API&lt;/a&gt; and check out all the use cases of &lt;a href=&quot;https://img.ly/products/creative-sdk&quot;&gt;CreativeEditor SDK&lt;/a&gt; or &lt;a href=&quot;https://img.ly/forms/contact-sales&quot;&gt;contact sales&lt;/a&gt; to learn more!&lt;/p&gt;</content:encoded><dc:creator>Antonello</dc:creator><media:content url="https://blog.img.ly/2022/07/create-an-app-like-canva.png" medium="image"/><category>How-To</category><category>Canva</category><category>Design Editor</category><category>Creative Editor</category><category>Web Application</category><category>Web Development</category><category>React</category><category>Tutorial</category><category>Learning</category></item><item><title>Content Moderation for User-Generated Designs with CE.SDK and Sightengine</title><link>https://img.ly/blog/content-moderation-for-user-generated-designs-with-ce-sdk-and-sightengine/</link><guid isPermaLink="true">https://img.ly/blog/content-moderation-for-user-generated-designs-with-ce-sdk-and-sightengine/</guid><description>Protect your users and your brand reputation without manual content moderation.</description><pubDate>Mon, 13 Jun 2022 14:07:54 GMT</pubDate><content:encoded>&lt;p&gt;Creating content and sharing it with others has become one of the core features offered by online services. As users publish their content to your website, you want to consider implementing a system to prevent inappropriate posts. Ideally, content will be programmatically moderated before it is uploaded on your platform. That is what you will learn in this article!&lt;/p&gt;
&lt;p&gt;Follow this step-by-step tutorial and learn how to integrate content moderation with Sightengine in your design process built with CreativeEditor SDK in React. At the end of this tutorial, you will achieve the &lt;a href=&quot;https://codesandbox.io/s/content-moderation-for-user-generated-designs-with-ce-sdk-and-sightengine-forked-8kc7te&quot;&gt;following result&lt;/a&gt;:&lt;/p&gt;
&lt;h2 id=&quot;why-you-should-moderate-user-generated-content&quot;&gt;Why You Should Moderate User-Generated Content&lt;/h2&gt;
&lt;p&gt;User-generated content represents a large portion of online content, whether text or multimedia. Empowering users with tools and features to create high-quality content is excellent. However, it is a common concern that potentially inappropriate content on your website will be associated with your brand. Naturally, you will want to avoid this.&lt;/p&gt;
&lt;p&gt;A recent example from the web-to-print industry serves as a cautionary tale: the German e-commerce company Spreadshirt neglected to moderate content on its t-shirt printing platform, leading to a wave of &lt;a href=&quot;https://www.beyond-print.net/market-spreadshirt-removes-tasteless-star-of-david-motif/&quot;&gt;outrage on social media&lt;/a&gt;. Even though the company reacted swiftly and stated an apology, Spreadshirt could have avoided most of the damage if it had implemented a system that automatically flags potentially harmful content. Of course, a religious or cultural symbol is not inherently inappropriate, but the misuse is.&lt;/p&gt;
&lt;p&gt;It is highly advisable to take precautions to prevent your company from facing similar adversity. A common problem, however, is the costly and time-consuming manual moderation, epecially when controlling multimedia files like images.&lt;/p&gt;
&lt;p&gt;Luckily, you can use CE.SDK and Sightengine to programmatically integrate moderation into your content design process without manual reviews.&lt;/p&gt;
&lt;h2 id=&quot;what-is-cesdk&quot;&gt;What is CE.SDK?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://img.ly/products/creative-sdk?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=howtos&quot;&gt;CreativeEditor SDK (CE.SDK)&lt;/a&gt; is a powerful, easy-to-use, and fully customizable design editor. With just a few lines of code, CE.SDK provides your application with template-based workflows and automation.&lt;/p&gt;
&lt;p&gt;The role-specific editing UI focuses on keeping content adaptation dead simple: in &lt;strong&gt;Creator Mode&lt;/strong&gt;, you have the liberty to create a design from scratch or customize existing templates. When creators are ready to share a design for others to use and customize in &lt;strong&gt;Adopter Mode&lt;/strong&gt; (Default UI), creators may decide which elements can be changed. See CE.SDK &lt;a href=&quot;https://img.ly/showcases/cesdk/web/?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=howtos&quot;&gt;in action&lt;/a&gt; or &lt;a href=&quot;https://img.ly/free-trial/?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=howtos&quot;&gt;try it for free&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;what-is-sightengine&quot;&gt;What is Sightengine?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://sightengine.com/&quot;&gt;Sightengine&lt;/a&gt; is a convenient tool for automatic content moderation. It detects and filters unwanted content in photos, videos, and live streams through fast, accurate, easy-to-integrate, privacy-compliant APIs.&lt;/p&gt;
&lt;p&gt;Sightengine offers you APIs to get moderation results instantly and effectively. The API-centric approach allows you to scale to up to tens of millions of images per month. You can have a look at the Sightengine &lt;a href=&quot;https://sightengine.com/demo&quot;&gt;demo&lt;/a&gt; or &lt;a href=&quot;https://dashboard.sightengine.com/signup&quot;&gt;try it for free&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;integrate-content-moderation-into-cesdk&quot;&gt;Integrate Content Moderation into CE.SDK&lt;/h2&gt;
&lt;p&gt;Let us look at how to implement an image editor with content moderation for your users. For this, you will learn how to use CE.SDK and React to implement an image design component and use the CE.SDK APIs to programmatically moderate the content with Sightengine on a Node.js server. You can try out a &lt;a href=&quot;https://img.ly/showcases/cesdk/web/content-moderation/?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=howtos&quot;&gt;live showcase&lt;/a&gt; of content moderation with CE.SDK.&lt;/p&gt;
&lt;p&gt;With the following steps, you can easily achieve this result with CE.SDK, React, Sightengine, and Node.js.&lt;/p&gt;
&lt;h3 id=&quot;1-get-started-with-cesdk&quot;&gt;1. Get Started with CE.SDK&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://img.ly/docs/cesdk/react/get-started/overview-e18f40/&quot;&gt;Integrate CreativeEditor SDK with React&lt;/a&gt; by using the official documentation. As you will see in the final snippet, this takes only a few lines of code.&lt;/p&gt;
&lt;p&gt;Now that you have a working CE.SDK instance, your users may unleash their creativity by designing templates and sharing them with others. The powerful APIs ensure control at every step of the editing process and allow programmatically performing operations, such as content moderation.&lt;/p&gt;
&lt;h2 id=&quot;2-build-a-content-moderation-api-with-sightengine&quot;&gt;2. Build a Content Moderation API with Sightengine&lt;/h2&gt;
&lt;p&gt;Let’s move on to content moderation with Sightengine. Keep in mind that any backend technology will work, but here you will implement a content moderation API based on Sightengine in Node.js.&lt;/p&gt;
&lt;h3 id=&quot;21-getting-started-with-sightengine&quot;&gt;2.1 Getting Started with Sightengine&lt;/h3&gt;
&lt;p&gt;First, you need a Sightengine account. If you do not have one yet, you can &lt;a href=&quot;https://dashboard.sightengine.com/signup&quot;&gt;create a free account&lt;/a&gt;. Fill out the form, click &lt;em&gt;Sign Up&lt;/em&gt;, and receive a verification email in your inbox. Click on the verification link and activate your account.&lt;/p&gt;
&lt;p&gt;Then, navigate to &lt;em&gt;API Keys&lt;/em&gt; on your Sightengine Dashboard page and retrieve your API &lt;code&gt;user&lt;/code&gt; and &lt;code&gt;secret&lt;/code&gt; credentials. You will need them to interact with the Sightengine moderation APIs.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;API-Keys&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1920px) 1920px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1920&quot; height=&quot;939&quot; src=&quot;https://img.ly/_astro/API-Keys_2qJUen.webp&quot; srcset=&quot;/_astro/API-Keys_ZlqYIr.webp 640w, /_astro/API-Keys_Z1w4Wxh.webp 750w, /_astro/API-Keys_133wET.webp 828w, /_astro/API-Keys_Z1wDt5P.webp 1080w, /_astro/API-Keys_Z19TsmB.webp 1280w, /_astro/API-Keys_1IfMS7.webp 1668w, /_astro/API-Keys_2qJUen.webp 1920w&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;22-prerequisites&quot;&gt;2.2 Prerequisites&lt;/h3&gt;
&lt;p&gt;Here is a list of all prerequisites for the backend application you are going to build:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/get-npm&quot;&gt;Node.js and npm 8.x and higher&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/express&quot;&gt;&lt;code&gt;express&lt;/code&gt;&lt;/a&gt; &gt;= 4.x&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/node-fetch&quot;&gt;&lt;code&gt;node-fetch&lt;/code&gt;&lt;/a&gt; &gt;= 3.x&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can add &lt;code&gt;express&lt;/code&gt; and &lt;code&gt;node-fetch&lt;/code&gt; to your project’s dependencies with the following command:&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;npm install --save express node-fetch&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;23-setting-up-a-nodejs-express-server&quot;&gt;2.3 Setting up a Node.js Express Server&lt;/h3&gt;
&lt;p&gt;Follow &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs/development_environment&quot;&gt;this&lt;/a&gt; step-by-step guide to set up a Node.js Express development server. You will need this to perform an API call to Sightengine to moderate your content server-side. Any Sightengine API call involves your Sightengine &lt;code&gt;user&lt;/code&gt; and &lt;code&gt;secret&lt;/code&gt; pair of credentials, and you do not want to expose them.&lt;/p&gt;
&lt;p&gt;You may also want to store the result of the moderation API in your database, as well as other data. For example, you might be interested in keeping track of how many times a particular user has violated the moderation rules to warn or ban them.&lt;/p&gt;
&lt;h3 id=&quot;24-implementing-a-content-moderation-api-in-your-nodejs-server&quot;&gt;2.4 Implementing a Content Moderation API in your Node.js Server&lt;/h3&gt;
&lt;p&gt;You can now implement a content moderation API in your Node.js Express server as follows:&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 fetch = require(&quot;node-fetch&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;    router.get(&apos;/content-moderation&apos;, function (req, res) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      if (!req.query.url) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            res.status(404).send(&quot;Please provide an image url&quot;)&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 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;        // defining the Sightengine API parameters&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        const params = {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            url: req.query.url,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            models: &quot;nudity,wad,offensive&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            api_user: &quot;YOUR_SIGHTENGINE_USER&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            api_secret: &quot;YOUR_SIGHTENGINE_SECRET&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;        // generating the Sightengine API URL&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        const queryString = new URLSearchParams(params).toString();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        const requestOptions = {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            method: &quot;GET&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;        const sightengineUrl = &quot;https://api.sightengine.com/1.0/check.json?&quot; + queryString&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;        // calling the Sightengine moderation API&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        const externalRes = await fetch(SightengineUrl, requestOptions)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        // retrieving the moderation result from the Sightengine API&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        const moderationResultText = await externalRes.text()&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;        res.append(&quot;Access-Control-Allow-Origin&quot;, [&quot;*&quot;])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        res.append(&quot;Access-Control-Allow-Methods&quot;, &quot;GET&quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        res.append(&quot;Access-Control-Allow-Headers&quot;, &quot;Content-Type&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;        // returning the Sightengine moderation result text&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        res.status(200).send(text)&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;Take care of replacing &lt;code&gt;YOUR_SIGHTENGINE_USER&lt;/code&gt; and &lt;code&gt;YOUR_SIGHTENGINE_SECRET&lt;/code&gt; with your Sightengine pair of credentials retrieved before.&lt;/p&gt;
&lt;p&gt;Now, launch your Node.js server and reach the following URL below to use Sightengine to moderate the images specified in the URL query parameter:&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;    http://localhost:3000/content-moderation?url=&amp;#x3C;your_image_url&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;3-moderate-images-made-with-cesdk&quot;&gt;3. Moderate Images Made with CE.SDK&lt;/h2&gt;
&lt;p&gt;We will now use CE.SDK and Sightengine to programmatically moderate user-generated images. Before we can dive in, check the following requirements.&lt;/p&gt;
&lt;h3 id=&quot;31-prerequisites&quot;&gt;3.1 Prerequisites&lt;/h3&gt;
&lt;p&gt;This is the list of all the prerequisites you need to build for the frontend demo application:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/get-npm&quot;&gt;Node.js and npm 8.x and higher&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://reactjs.org/&quot;&gt;React&lt;/a&gt; &gt;= 17&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/@cesdk/cesdk-js&quot;&gt;&lt;code&gt;@cesdk/cesdk-js&lt;/code&gt;&lt;/a&gt; &gt;= 1.5.0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can add the &lt;code&gt;@cesdk/cesdk-js&lt;/code&gt; library to your project’s dependencies with the following command:&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;npm install --save @cesdk/cesdk-js&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Also, the demo application will use other libraries, although they are not strictly required to achieve the goals of this tutorial and can be omitted here.&lt;/p&gt;
&lt;h3 id=&quot;32-getting-started&quot;&gt;3.2 Getting Started&lt;/h3&gt;
&lt;p&gt;You can try out the demo application by cloning the &lt;a href=&quot;https://github.com/Tonel/content-moderation-with-cesdk-and-sightengine&quot;&gt;GitHub repository that supports this article&lt;/a&gt; with the following commands:&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;git clone https://github.com/Tonel/content-moderation-with-cesdk-and-sightengine&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;cd content-moderation-with-cesdk-and-sightengine&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm i&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm start&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Otherwise, keep following this tutorial and build the demo application for content moderation by yourself.&lt;/p&gt;
&lt;p&gt;First, initialize a React project called &lt;code&gt;content-moderation-with-cesdk-and-sightengine&lt;/code&gt; by employing the &lt;a href=&quot;https://create-react-app.dev/docs/getting-started/&quot;&gt;Create React App&lt;/a&gt; command 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;    npx content-moderation-with-cesdk-and-sightengine&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now, the &lt;code&gt;content-moderation-with-cesdk-and-sightengine&lt;/code&gt; folder should have the following file structure:&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;content-moderation-with-cesdk-and-sightengine&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── README.md&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── node_modules&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;├── .gitignore&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── public&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── favicon.ico&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;│   ├── logo192.png&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── logo512.png&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── manifest.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   └── robots.txt&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.css&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   ├── App.js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   ├── App.test.js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   ├── index.css&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   ├── index.js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   ├── logo.svg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   ├── reportWebVitals.js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   └── setupTests.js&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Enter the &lt;code&gt;content-moderation-with-cesdk-and-sightengine&lt;/code&gt; folder and start a local server with these two commands:&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;cd content-moderation-with-cesdk-and-sightengine&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm start&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Visit &lt;a href=&quot;http://localhost:3000/&quot;&gt;http://localhost:3000/&lt;/a&gt; in your browser, and you should now be seeing the default Create React App screen below:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;React-Screen&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 983px) 983px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;983&quot; height=&quot;728&quot; src=&quot;https://img.ly/_astro/React-Screen_ZpeFfw.webp&quot; srcset=&quot;/_astro/React-Screen_2jrC6f.webp 640w, /_astro/React-Screen_Z7rdRp.webp 750w, /_astro/React-Screen_Z1UwlqM.webp 828w, /_astro/React-Screen_ZpeFfw.webp 983w&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;33-integrate-the-moderation-check-into-your-design-process&quot;&gt;3.3 Integrate the Moderation Check into your Design Process&lt;/h3&gt;
&lt;p&gt;Notice that the demo application you are about to implement is just a simplified version of the app you can find in &lt;a href=&quot;https://github.com/imgly/cesdk-web-examples/blob/showcases/showcase-content-moderation/&quot;&gt;this GitHub repository&lt;/a&gt;. This demo app integrates the Sightengine moderation functionality with the CE.SDK design capabilities.&lt;/p&gt;
&lt;p&gt;Now, let’s move on to the main component where the integration takes place:&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; CreativeEditorSDK &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;@cesdk/cesdk-js&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; ValidationBox &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;../ui/ValidationBox/ValidationBox&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; React, { useCallback, useEffect, useRef, useState } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;react&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; { ReactComponent &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; RefreshIcon } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;./refresh.svg&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; { moderateImages } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;./moderationUtils&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; styles &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;./ImageModerator.module.css&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; classNames &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;classnames&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;function&lt;/span&gt;&lt;span&gt; selectBlock&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;blockId&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  // deselecting all blocks&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  cesdk.engine.block&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    .&lt;/span&gt;&lt;span&gt;findAllSelected&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;forEach&lt;/span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;block&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; cesdk.engine.block.&lt;/span&gt;&lt;span&gt;setSelected&lt;/span&gt;&lt;span&gt;(block, &lt;/span&gt;&lt;span&gt;false&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;  // selecting the block having the blockId passed as parameter&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  cesdk.engine.block.&lt;/span&gt;&lt;span&gt;setSelected&lt;/span&gt;&lt;span&gt;(blockId, &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;const&lt;/span&gt;&lt;span&gt; ImageModerator&lt;/span&gt;&lt;span&gt; =&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; cesdkContainerDiv&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; useRef&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; cesdkRef&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; useRef&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; [&lt;/span&gt;&lt;span&gt;validationResults&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;setValidationResults&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; useState&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;  useEffect&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;    // initializing CE.SDK if it has not been initialized yet&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; (cesdkContainerDiv.current &lt;/span&gt;&lt;span&gt;&amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span&gt; !&lt;/span&gt;&lt;span&gt;cesdkRef.current) {&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;        role: &lt;/span&gt;&lt;span&gt;&apos;Adopter&apos;&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;light&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        initialSceneURL: &lt;/span&gt;&lt;span&gt;`${&lt;/span&gt;&lt;span&gt;window&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;protocol&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; window&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;span&gt;}/cases/content-moderation/example.scene`&lt;/span&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;            panels: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;              settings: &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;                save: &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&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;        callbacks: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          // calling this function when the&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          // user presses the &quot;Save&quot; button&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;=&gt;&lt;/span&gt;&lt;span&gt; runImageModerationCheck&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;      CreativeEditorSDK.&lt;/span&gt;&lt;span&gt;init&lt;/span&gt;&lt;span&gt;(cesdkContainerDiv.current, config).&lt;/span&gt;&lt;span&gt;then&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;instance&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;          cesdkRef.current &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; instance;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          // running the moderation check on initialization&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          runImageModerationCheck&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;    return&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; (cesdkRef.current) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        cesdkRef.current.&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;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;  }, [cesdkContainerDiv]);&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; runImageModerationCheck&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; useCallback&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;    if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;cesdkRef.current) {&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;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    // retrieving the moderation results&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    const&lt;/span&gt;&lt;span&gt; validationResults&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; await&lt;/span&gt;&lt;span&gt; moderateImages&lt;/span&gt;&lt;span&gt;(cesdkRef.current);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    setValidationResults&lt;/span&gt;&lt;span&gt;(validationResults);&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;  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;div&lt;/span&gt;&lt;span&gt; className&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;classNames&lt;/span&gt;&lt;span&gt;(styles.wrapper, &lt;/span&gt;&lt;span&gt;&apos;space-y-2&apos;&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;div&lt;/span&gt;&lt;span&gt; className&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{styles.header}&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;div&lt;/span&gt;&lt;span&gt; className&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{styles.headerDiv}&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;div&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;h3&lt;/span&gt;&lt;span&gt; className&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;h4&quot;&lt;/span&gt;&lt;span&gt; style&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{{ color: &lt;/span&gt;&lt;span&gt;&apos;white&apos;&lt;/span&gt;&lt;span&gt; }}&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;              Content Moderation&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            &amp;#x3C;/&lt;/span&gt;&lt;span&gt;h3&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;p&lt;/span&gt;&lt;span&gt; className&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{styles.headerDivMessage}&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;              Check images for compliance with your content guidelines before&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;              further processing and provide user feedback.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            &amp;#x3C;/&lt;/span&gt;&lt;span&gt;p&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;div&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;button&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;{() &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; runImageModerationCheck&lt;/span&gt;&lt;span&gt;()}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            className&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&apos;button button--white space-x-2&apos;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&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;span&lt;/span&gt;&lt;span&gt;&gt;Validate Image Content&amp;#x3C;/&lt;/span&gt;&lt;span&gt;span&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;RefreshIcon&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;button&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;div&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;ValidationBox&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          results&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{validationResults}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          onSelect&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{(&lt;/span&gt;&lt;span&gt;blockId&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;            selectBlock&lt;/span&gt;&lt;span&gt;(cesdkRef.current, blockId);&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;        /&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;div&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;div&lt;/span&gt;&lt;span&gt; className&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{styles.cesdkWrapper}&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;div&lt;/span&gt;&lt;span&gt; ref&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{cesdkContainerDiv} &lt;/span&gt;&lt;span&gt;className&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{styles.cesdk}&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;div&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;div&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;div&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;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; ImageModerator;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In the first &lt;a href=&quot;https://reactjs.org/docs/hooks-effect.html&quot;&gt;&lt;code&gt;useEffect()&lt;/code&gt;&lt;/a&gt; hook, CE.SDK is initialized, and a callback on the save action is registered. This will take care of calling the &lt;code&gt;runImageModerationCheck()&lt;/code&gt; function when the user presses the CE.SDK &lt;em&gt;Save&lt;/em&gt; button. For more information on how callbacks work in CE.SDK, see &lt;a href=&quot;https://img.ly/docs/cesdk/react/concepts/events-353f97/?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=howtos&quot;&gt;the official documentation on observing events&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;runImageModerationCheck()&lt;/code&gt; retrieves the moderation results obtained from Sightengine and then stores it in the &lt;code&gt;validationResults&lt;/code&gt; array variable. This is then passed to the &lt;code&gt;ValidationBox&lt;/code&gt; component, which will show the results of the validation process to the end-user. None of this would be possible without the &lt;code&gt;moderateImages()&lt;/code&gt; function from the &lt;code&gt;moderationUtils.js&lt;/code&gt; file below:&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;export&lt;/span&gt;&lt;span&gt; const&lt;/span&gt;&lt;span&gt; moderateImages&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;  // retrieving all image blocks with a name&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  const&lt;/span&gt;&lt;span&gt; imageBlocksData&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; cesdk.engine.block&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    .&lt;/span&gt;&lt;span&gt;findByType&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;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;map&lt;/span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;blockId&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;      blockId,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      url: cesdk.engine.block.&lt;/span&gt;&lt;span&gt;getString&lt;/span&gt;&lt;span&gt;(blockId, &lt;/span&gt;&lt;span&gt;&apos;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;      blockType: cesdk.engine.block.&lt;/span&gt;&lt;span&gt;getType&lt;/span&gt;&lt;span&gt;(blockId),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      blockName: cesdk.engine.block.&lt;/span&gt;&lt;span&gt;getName&lt;/span&gt;&lt;span&gt;(blockId),&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;filter&lt;/span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;block&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;      return&lt;/span&gt;&lt;span&gt; block.blockName &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;    });&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;  console.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;Moderation check launched...&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;  // turning the moderation results on each image block into&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  // a flat array&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  const&lt;/span&gt;&lt;span&gt; imagesWithValidity&lt;/span&gt;&lt;span&gt; =&lt;/span&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;    imageBlocksData.&lt;/span&gt;&lt;span&gt;flatMap&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;imageBlockData&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;      // retrieving the moderation results&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      const&lt;/span&gt;&lt;span&gt; imageModerationResults&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; await&lt;/span&gt;&lt;span&gt; callSightengineModerationAPI&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        imageBlockData.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 class=&quot;line&quot;&gt;&lt;span&gt;      console.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(imageBlockData.blockName, imageModerationResults);&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;      return&lt;/span&gt;&lt;span&gt; imageModerationResults.&lt;/span&gt;&lt;span&gt;flatMap&lt;/span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;checkResult&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;        ...&lt;/span&gt;&lt;span&gt;checkResult,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        ...&lt;/span&gt;&lt;span&gt;imageBlockData,&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 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;Moderation check completed&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;  return&lt;/span&gt;&lt;span&gt; imagesWithValidity.&lt;/span&gt;&lt;span&gt;flat&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;// a cache variable to avoid&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// calling the Sightengine API when not necessary&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; complianceCache&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 class=&quot;line&quot;&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; callSightengineModerationAPI&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;url&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 the url is already present in the cache, then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  // return the result previously retrieved&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  if&lt;/span&gt;&lt;span&gt; (complianceCache[url]) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    return&lt;/span&gt;&lt;span&gt; complianceCache[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 class=&quot;line&quot;&gt;&lt;span&gt;  // calling the Sightengine moderation API&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  const&lt;/span&gt;&lt;span&gt; response&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; await&lt;/span&gt;&lt;span&gt; fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    // your endpoint URL&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &apos;https://europe-west3-img-ly.cloudfunctions.net/sightengineApiProxy?url=&apos;&lt;/span&gt;&lt;span&gt; +&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      encodeURIComponent&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;      method: &lt;/span&gt;&lt;span&gt;&apos;get&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      headers: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        accept: &lt;/span&gt;&lt;span&gt;&apos;application/json&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        &apos;Accept-Language&apos;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;en-US,en;q=0.8&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        &apos;Content-Type&apos;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;multipart/form-data;&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 class=&quot;line&quot;&gt;&lt;span&gt;  const&lt;/span&gt;&lt;span&gt; results&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; await&lt;/span&gt;&lt;span&gt; response.&lt;/span&gt;&lt;span&gt;json&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;  if&lt;/span&gt;&lt;span&gt; (results.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;(results.error);&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;  } &lt;/span&gt;&lt;span&gt;else&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; checkResults&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;        name: &lt;/span&gt;&lt;span&gt;&apos;Weapons&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        description: &lt;/span&gt;&lt;span&gt;&apos;Handguns, rifles, machine guns, threatening knives...&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        state: &lt;/span&gt;&lt;span&gt;percentageToState&lt;/span&gt;&lt;span&gt;(results.weapon),&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;        name: &lt;/span&gt;&lt;span&gt;&apos;Alcohol&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        description: &lt;/span&gt;&lt;span&gt;&apos;Wine, beer, cocktails, champagne...&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        state: &lt;/span&gt;&lt;span&gt;percentageToState&lt;/span&gt;&lt;span&gt;(results.alcohol),&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;        name: &lt;/span&gt;&lt;span&gt;&apos;Drugs&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        description: &lt;/span&gt;&lt;span&gt;&apos;Cannabis, syringes, glass pipes, bongs, pills...&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        state: &lt;/span&gt;&lt;span&gt;percentageToState&lt;/span&gt;&lt;span&gt;(results.drugs),&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;        name: &lt;/span&gt;&lt;span&gt;&apos;Nudity&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        description: &lt;/span&gt;&lt;span&gt;&apos;Images that contain either raw nudity or partial nudity.&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        state: &lt;/span&gt;&lt;span&gt;percentageToState&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt; results.nudity.safe),&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;    // storing the Sightengine results in the cache&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    complianceCache[url] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; checkResults;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    return&lt;/span&gt;&lt;span&gt; checkResults;&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; percentageToState&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;percentage&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;  // defining the custom moderation logic based on the&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  // percentage returned by Sightengine&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  if&lt;/span&gt;&lt;span&gt; (percentage &lt;/span&gt;&lt;span&gt;&gt;&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;    return&lt;/span&gt;&lt;span&gt; &apos;failed&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;else&lt;/span&gt;&lt;span&gt; if&lt;/span&gt;&lt;span&gt; (percentage &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; 0.4&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; &apos;warning&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;else&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; &apos;success&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;Here, we use the CE.SDK reference variable to retrieve all images in the scene through the CE.SDK APIs. Then, these are converted into URLs and passed &lt;code&gt;callSightengineModerationAPI()&lt;/code&gt; function, which takes care of calling the Sightengine moderation API, retrieving the results, using them to produce a new output, and returning it to the caller.&lt;/p&gt;
&lt;p&gt;We used an IMG.LY endpoint here to evade putting together a backend application. In a real-world scenario, replace &lt;code&gt;https://europe-west3-img-ly.cloudfunctions.net/sightengineApiProxy?url=&lt;/code&gt; with the URL of the &lt;code&gt;/content-moderation&lt;/code&gt; endpoint of your backend application. Also, note that a cache system was set up to avoid calling the Sightengine API too many times and using up call credits.&lt;/p&gt;
&lt;p&gt;This is what the demo application will look like after being launched and the moderation check has been executed:&lt;br&gt;
&lt;img alt=&quot;live-action-moderation&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1918px) 1918px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1918&quot; height=&quot;928&quot; src=&quot;https://img.ly/_astro/live-action-moderation_g22UQ.webp&quot; srcset=&quot;/_astro/live-action-moderation_xu23A.webp 640w, /_astro/live-action-moderation_2lOxOG.webp 750w, /_astro/live-action-moderation_Pdqj8.webp 828w, /_astro/live-action-moderation_Z1AnpCm.webp 1080w, /_astro/live-action-moderation_1LCvNP.webp 1280w, /_astro/live-action-moderation_ZQcY5P.webp 1668w, /_astro/live-action-moderation_g22UQ.webp 1918w&quot;&gt;&lt;/p&gt;
&lt;p&gt;As you can see, the Sightengine API correctly detects &lt;em&gt;drugs&lt;/em&gt; and &lt;em&gt;weapons&lt;/em&gt;. Next, remove the rightmost image containing a gun and click &lt;em&gt;Save&lt;/em&gt; to re-run the moderation check.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;detection&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1920px) 1920px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1920&quot; height=&quot;931&quot; src=&quot;https://img.ly/_astro/detection_ZflnCz.webp&quot; srcset=&quot;/_astro/detection_ZBLsO1.webp 640w, /_astro/detection_1CcGPE.webp 750w, /_astro/detection_1ADxoj.webp 828w, /_astro/detection_Z2sj5RQ.webp 1080w, /_astro/detection_Z256mPV.webp 1280w, /_astro/detection_1QiKB5.webp 1668w, /_astro/detection_ZflnCz.webp 1920w&quot;&gt;&lt;/p&gt;
&lt;p&gt;Sightengine no longer detects weapons in the image, proving that the moderation process is working as expected.&lt;/p&gt;
&lt;p&gt;Et voilà! You have learned to implement content moderation for user-generated images with CE.SDK and Sightengine.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;A challenge of user-generated content is avoiding the risk of hosting and displaying offensive or outright illegal content. Inappropriate content affects your user community and brand reputation and may even cause legal action against you.&lt;/p&gt;
&lt;p&gt;In this article, we used CE.SDK to initialize a fully-featured design editor in React. We employed its API to programmatically call a Node.js server using Sightengine to perform content moderation on images. This allows moderation of user-generated content automatically and prevents the upload of inappropriate content to your website.&lt;/p&gt;
&lt;p&gt;We are only scratching the surface of what is possible with CE.SDK – you can implement any UI on top of its powerful image processing API and extend the core functionality with features such as &lt;a href=&quot;https://img.ly/showcases/cesdk/web/placeholders/?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=howtos&quot;&gt;placeholders&lt;/a&gt; and define &lt;a href=&quot;https://img.ly/showcases/cesdk/web/design-validation/?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=howtos&quot;&gt;validation rules&lt;/a&gt; to guide your users’ creation process.&lt;/p&gt;
&lt;p&gt;Thanks for reading! We hope that you found this article helpful. Feel free to reach out on &lt;a href=&quot;https://twitter.com/imgly&quot;&gt;Twitter&lt;/a&gt; with any questions, comments, or suggestions.&lt;/p&gt;</content:encoded><dc:creator>Antonello</dc:creator><media:content url="https://blog.img.ly/2022/09/content-moderation-image-upload.png" medium="image"/><category>How-To</category><category>Automation</category><category>Web Development</category><category>Design Editor</category><category>Image Editing</category><category>Learning</category></item><item><title>CE.SDK v1.6.0 Release</title><link>https://img.ly/blog/creative-editor-sdk-v_1_6_0-release-notes/</link><guid isPermaLink="true">https://img.ly/blog/creative-editor-sdk-v_1_6_0-release-notes/</guid><description>CE.SDK brings stunning Linear Gradient Fills, Blend Modes, powerful APIs, and more.</description><pubDate>Fri, 20 May 2022 09:21:48 GMT</pubDate><content:encoded>&lt;p&gt;Today, we are highlighting the best new features and changes in CE.SDK since our &lt;a href=&quot;https://img.ly/blog/creative-editor-sdk-v_1_5_0-release-notes/?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=releasenotes&quot;&gt;v1.5.0 Release&lt;/a&gt; six weeks ago. CE.SDK v1.6.0 is adding:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Linear Gradient Fills&lt;/li&gt;
&lt;li&gt;Strokes, Outline, Insets, and Stroke Patterns&lt;/li&gt;
&lt;li&gt;Blend Modes&lt;/li&gt;
&lt;li&gt;Scale Groups, Multi-Selection, and Hierarchies&lt;/li&gt;
&lt;li&gt;UI Template Library&lt;/li&gt;
&lt;li&gt;Floating and Static Asset Library Panels&lt;/li&gt;
&lt;li&gt;Placeholders API&lt;/li&gt;
&lt;li&gt;Editing State APIs&lt;/li&gt;
&lt;li&gt;API for Image Fit Modes&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;linear-gradient-fills&quot;&gt;Linear Gradient Fills&lt;/h3&gt;
&lt;p&gt;With this update, we are introducing linear gradient fills. This feature creates a gradual blend between two colors, including transparency. Use the Color Picker to switch between solid color and linear gradient fill modes and determine the order of colors.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Let users create stunning backgrounds or shapes with Linear Gradient Fills.&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/Gradient_ZjWgRX.webp&quot; srcset=&quot;/_astro/Gradient_Z2n9Nkn.webp 640w, /_astro/Gradient_BHSpP.webp 750w, /_astro/Gradient_IAKvf.webp 828w, /_astro/Gradient_Z2vXQuF.webp 1080w, /_astro/Gradient_Z1pX4bO.webp 1280w, /_astro/Gradient_ZjWgRX.webp 1480w&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;strokes-outline-insets-and-stroke-patterns&quot;&gt;Strokes, Outline, Insets, and Stroke Patterns&lt;/h3&gt;
&lt;p&gt;This feature introduces strokes and stroke patterns. Strokes apply to any block, including images, text, and shapes. Use our APIs or UIs to set the stroke width, color, style, and more options affecting the stroke appearance.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Walk the line: apply strokes to any block and determine the appearance.&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/Strokes_photo_design_editor_SDK-1_1XfV7m.webp&quot; srcset=&quot;/_astro/Strokes_photo_design_editor_SDK-1_XdcAU.webp 640w, /_astro/Strokes_photo_design_editor_SDK-1_Zq9kWH.webp 750w, /_astro/Strokes_photo_design_editor_SDK-1_Z2uLzL5.webp 828w, /_astro/Strokes_photo_design_editor_SDK-1_1gU45l.webp 1080w, /_astro/Strokes_photo_design_editor_SDK-1_ZU0yN7.webp 1280w, /_astro/Strokes_photo_design_editor_SDK-1_1XfV7m.webp 1480w&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;blend-modes&quot;&gt;Blend Modes&lt;/h3&gt;
&lt;p&gt;Blend modes are a popular feature in creative and image editing tools. They blend two blocks or layers to get different types of effects. This feature is available in both the API and the UI.&lt;/p&gt;
&lt;h3 id=&quot;scale-groups-multi-selection-and-hierarchies&quot;&gt;Scale Groups, Multi-Selection, and Hierarchies&lt;/h3&gt;
&lt;p&gt;Our engine and user interface now provide options to scale groups, multi-select and create design blocks with children. You can easily change the scaling of multiple elements at once. This also simplifies resizing and rescaling your template designs for other page and art board sizes.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Easily group, multi-select and scale your elements.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 887px) 887px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;887&quot; height=&quot;492&quot; src=&quot;https://img.ly/_astro/creative-editor-group-elements_CE-SDK_2lijEh.webp&quot; srcset=&quot;/_astro/creative-editor-group-elements_CE-SDK_Zrb4wY.webp 640w, /_astro/creative-editor-group-elements_CE-SDK_ZfRGvT.webp 750w, /_astro/creative-editor-group-elements_CE-SDK_1dzvKF.webp 828w, /_astro/creative-editor-group-elements_CE-SDK_2lijEh.webp 887w&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;ui-template-library&quot;&gt;UI Template Library&lt;/h3&gt;
&lt;p&gt;We are introducing the template library in all UIs. Allow users to switch between multiple templates while editing.&lt;/p&gt;
&lt;h3 id=&quot;floating-and-static-asset-library-panels&quot;&gt;Floating and Static Asset Library Panels&lt;/h3&gt;
&lt;p&gt;For some screen sizes and use-cases, it might be tedious that the asset library floats over your canvas and covers your design. Therefore, you can now configure the asset library panel to be either floating or static. A static asset library won’t overlap with your design and adjusts to your screen size perfectly.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;An editor with a view: set your Asset Library to float or static.&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/Float-Static_1XM7K1.webp&quot; srcset=&quot;/_astro/Float-Static_Z7nVnb.webp 640w, /_astro/Float-Static_ZWT75o.webp 750w, /_astro/Float-Static_Z3Qc9n.webp 828w, /_astro/Float-Static_21rt4h.webp 1080w, /_astro/Float-Static_ZwXKYO.webp 1280w, /_astro/Float-Static_1XM7K1.webp 1480w&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;placeholders-api&quot;&gt;Placeholders API&lt;/h3&gt;
&lt;p&gt;CE.SDK 1.6 introduces an additional API that allows you to interact with all placeholders on the canvas. The API queries the number of placeholders in a template or document and lists all available placeholders in the current scene.&lt;/p&gt;
&lt;h3 id=&quot;editing-state-apis&quot;&gt;Editing State APIs&lt;/h3&gt;
&lt;p&gt;We extend the API to allow querying and modifying the current editing mode. That includes changing the on-canvas editing mode to &lt;em&gt;Crop&lt;/em&gt;, &lt;em&gt;Text&lt;/em&gt;, or others. You can also query the editor state for helpful information like the desired cursor type and rotation and the text cursor position. To observe these values more comfortably, an additional endpoint allows registering for callbacks whenever the editing state changes.&lt;/p&gt;
&lt;h3 id=&quot;api-for-image-fit-modes&quot;&gt;API for Image Fit Modes&lt;/h3&gt;
&lt;p&gt;The API now allows switching between fit modes for images:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Crop&lt;/code&gt; applies crop properties, and ignores the aspect ratio.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Cover&lt;/code&gt; resizes the image aspect-aware to fill the frame.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Contain&lt;/code&gt; allows resizing the image aspect-aware to fit into its frame.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;thanks-for-reading-let-us-know-what-you-think-on-twitter-or-stay-in-the-loop-with-our-newsletter&quot;&gt;Thanks for reading! Let us know what you think on &lt;a href=&quot;https://twitter.com/imgly&quot;&gt;Twitter&lt;/a&gt;, or stay in the loop with our &lt;a href=&quot;https://photoeditorsdk.us13.list-manage.com/subscribe?u=dc9f652839dbb620d14d6d28d&amp;#x26;id=04a306e4b2&quot;&gt;Newsletter&lt;/a&gt;.&lt;/h3&gt;</content:encoded><dc:creator>Malte</dc:creator><dc:creator>Daniel</dc:creator><media:content url="https://blog.img.ly/2022/05/creative-editor-sdk-v-1_6_0.png" medium="image"/><category>Release Notes</category><category>Web Development</category><category>JavaScript</category><category>Design Editor</category><category>Photo Editor</category></item></channel></rss>