<?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>Daniel – IMG.LY Blog</title><description>MD &amp; CPTO / Co-Founder of IMG.LY</description><link>https://img.ly/blog/author/daniel/</link><language>en-us</language><image><url>https://img.ly/apple-touch-icon.png</url><title>Daniel – IMG.LY Blog</title><link>https://img.ly/blog/author/daniel/</link></image><atom:link href="https://img.ly/blog/author/daniel/rss.xml" rel="self" type="application/rss+xml"/><generator>Astro</generator><lastBuildDate>Wed, 10 Jun 2026 12:21:42 GMT</lastBuildDate><ttl>60</ttl><item><title>One SDK to Power Them All: Announcing IMG.LY SDK</title><link>https://img.ly/blog/one-sdk-to-power-them-all-announcing-img-ly-sdk/</link><guid isPermaLink="true">https://img.ly/blog/one-sdk-to-power-them-all-announcing-img-ly-sdk/</guid><description>We’re consolidating our Photo and Video Editor SDKs under the Creative Editor SDK (CE.SDK) umbrella to simplify development and accelerate innovation. PE.SDK and VE.SDK will enter long-term support this year, with CE.SDK (soon branded IMG.LY SDK) becoming our single, future-ready solution.</description><pubDate>Tue, 19 Aug 2025 10:25:44 GMT</pubDate><content:encoded>&lt;p&gt;From day one, IMG.LY has been driven by a singular mission: &lt;strong&gt;to empower creativity at scale&lt;/strong&gt;. By embedding our technology directly into apps, websites, and workflows, we have helped hundreds of customers from social networks to e-commerce platforms to deliver rich, media-powered experiences to millions of users. We started out by offering two specialized SDKs, the Photo Editor SDK and the Video Editor SDK, later on, we introduced the Creative Editor SDK (CE.SDK) as a more flexible, all-in-one creative editing solution.&lt;/p&gt;
&lt;p&gt;As CE.SDK has matured into a foundation for all creative workflows including photo and video editing, we’re taking the next step in our evolution. Later this year, we’ll unify our offerings under a single brand:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;IMG.LY SDK&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For existing customers of PE.SDK and VE.SDK, rest assured, both products will continue to receive long-term support. We’ll explain what that means below.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;from-fragmentation-to-unification&quot;&gt;From Fragmentation to Unification&lt;/h2&gt;
&lt;p&gt;Over the years, our Photo Editor SDK (PE.SDK) and Video Editor SDK (VE.SDK) have enabled customers to deliver creative editing for a specific domain (photo and video). While both excelled within their specific use cases, maintaining separate SDKs brought growing complexity from divergent feature sets across platforms to duplicated codebases and asynchronous upgrade paths. Not only did our customers’ use cases expand, driving demand for more custom editing solutions, this fragmentation ultimately limited our ability to move fast, innovate, and serve this growing demand.&lt;/p&gt;
&lt;p&gt;That’s why we introduced Creative Editor SDK (CE.SDK): a unified foundation designed from the ground up to scale across creative domains and workflows. At its core is a single, shared engine capable of handling image, video, layout, text, and audio processing paired with native UI components for every major platform. With each release, CE.SDK has steadily absorbed functionality from both PE.SDK and VE.SDK, making it our most capable and extensible offering yet.&lt;/p&gt;
&lt;p&gt;But as this convergence progressed, it also introduced a new kind of complexity: customers were often unsure which SDK to choose. By bringing everything into one consistent, cross-platform solution where every feature is developed in sync for web and mobile, CE.SDK eliminates that uncertainty and simplifies the path forward.&lt;/p&gt;
&lt;h2 id=&quot;one-sdk-to-power-them-all&quot;&gt;One SDK to Power Them All&lt;/h2&gt;
&lt;p&gt;Beyond the engine, the SDK now includes prebuilt &lt;strong&gt;solutions&lt;/strong&gt; tailored to common use cases, for example &lt;a href=&quot;https://img.ly/docs/cesdk/js/prebuilt-solutions/photo-editor-42ccb2/&quot;&gt;&lt;strong&gt;photo&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;,&lt;/strong&gt; &lt;a href=&quot;https://img.ly/docs/cesdk/js/prebuilt-solutions/video-editor-9e533a/&quot;&gt;&lt;strong&gt;video&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;,&lt;/strong&gt; or &lt;a href=&quot;https://img.ly/docs/cesdk/js/prebuilt-solutions/ai-editor-5409b9/&quot;&gt;&lt;strong&gt;AI-powered design tooling&lt;/strong&gt;&lt;/a&gt;. These solutions help teams get started faster without compromising on customization or scalability.&lt;/p&gt;
&lt;p&gt;As we move forward, the IMG.LY SDK will be the sole focus of our platform investments. That means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Regular updates&lt;/strong&gt; and new features delivered consistently across all supported platforms.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Turnkey solutions&lt;/strong&gt; will provide an even simpler integration path, requiring only a few lines of code for set up.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plugin support&lt;/strong&gt; and a modular architecture for maximum extensibility.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automation and Headless Mode&lt;/strong&gt; for powerful backend or non-UI-driven workflows.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;unified API surface&lt;/strong&gt;: one learning curve, one integration, fewer surprises.&lt;/li&gt;
&lt;li&gt;And for new prospects and existing partners alike, a clear and confident message: &lt;strong&gt;IMG.LY SDK is the future.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;long-term-support-for-pe-and-vesdk&quot;&gt;Long-Term Support for PE. and VE.SDK&lt;/h2&gt;
&lt;p&gt;As part of this transition, PE.SDK and VE.SDK are now in &lt;strong&gt;long-term support mode&lt;/strong&gt; (LTS). This means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;They remain actively supported by a dedicated team.&lt;/li&gt;
&lt;li&gt;They are no longer sold to new customers.&lt;/li&gt;
&lt;li&gt;We encourage current users to begin exploring CE.SDK — soon branded as IMG.LY SDK — as the future-ready path forward.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you’re currently using PE.SDK or VE.SDK, rest assured: we’ve got you covered. But for faster innovation and access to our latest AI-powered features, we strongly recommend evaluating IMG.LY SDK.&lt;/p&gt;
&lt;h2 id=&quot;whats-next&quot;&gt;What’s Next?&lt;/h2&gt;
&lt;p&gt;Of course, the journey doesn’t stop here. The unification of our SDKs paves the road for many more exciting capabilities, such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Improve Developer Experience&lt;/strong&gt;&lt;br&gt;
Simpler setup, smarter defaults, and faster time-to-interaction, so teams can go from idea to integration in record time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build for Agentic AI&lt;/strong&gt;&lt;br&gt;
Designed for agent-driven workflows: responsive canvases, multimodal orchestration, and APIs tailored for autonomous actions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Better Serve Designers &amp;#x26; Teams&lt;/strong&gt;&lt;br&gt;
Our upcoming Studio offering will include project dashboards, version control, and multi-user permissions for collaborative work.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Personalization at Scale&lt;/strong&gt;&lt;br&gt;
While we already support for variables and templating, we are exploring how to leverage AI to effortlessly create smart variation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Customizable UI &amp;#x26; Fast Workflow Building&lt;/strong&gt;&lt;br&gt;
We’re making it easier than ever to adapt the editor to your needs whether you’re modifying the UI, embedding your own logic, or orchestrating custom creative workflows.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now is the perfect time to connect with our team, share your roadmap, test-drive upcoming modules, and plan your migration. Your feedback will help shape the future of IMG.LY SDK.&lt;/p&gt;</content:encoded><dc:creator>Eray</dc:creator><dc:creator>Daniel</dc:creator><media:content url="https://blog.img.ly/2025/08/imglysdkcover.png" medium="image"/><category>Company</category></item><item><title>Vibe-Engineering: When AI Does All the Coding, What Do We Actually Do?</title><link>https://img.ly/blog/vibe-engineering-when-ai-does-all-the-coding-what-do-we-actually-do/</link><guid isPermaLink="true">https://img.ly/blog/vibe-engineering-when-ai-does-all-the-coding-what-do-we-actually-do/</guid><description>When AI handles the coding, our value shifts to orchestrating, reasoning, and adapting. Guiding the process, not writing code.</description><pubDate>Mon, 07 Jul 2025 09:51:05 GMT</pubDate><content:encoded>&lt;p&gt;This isn’t an article about AI replacing engineers, it’s about discovering what (software) engineering will become when freed from the mechanics of coding itself.&lt;/p&gt;
&lt;p&gt;Vibe-Coding, and Vibe-Engineering are omnipresent in my social feeds these days. As with every new trend, it’s hard to judge what really works and what is pure marketing hype. But the central question nagged at me: if AI really can do all the coding, what exactly are we humans supposed to do?&lt;/p&gt;
&lt;p&gt;Therefore, I wanted to find out for myself. I didn’t want to build just a &lt;em&gt;Hello World&lt;/em&gt; example, so I pulled an old idea out of the closet and dusted it off.&lt;/p&gt;
&lt;h2 id=&quot;the-experiment-ai-agents-code-humans-curate&quot;&gt;The Experiment: AI Agents Code, Humans Curate&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1536px) 1536px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1536&quot; height=&quot;1024&quot; src=&quot;https://img.ly/_astro/20250705_1708_Human-Robot-Coding-Collaboration_remix_01jzdj1by9ebmaxjtmw6z04z8q--1-_2ur6G6.webp&quot; srcset=&quot;/_astro/20250705_1708_Human-Robot-Coding-Collaboration_remix_01jzdj1by9ebmaxjtmw6z04z8q--1-_mGF6X.webp 640w, /_astro/20250705_1708_Human-Robot-Coding-Collaboration_remix_01jzdj1by9ebmaxjtmw6z04z8q--1-_ZqNENu.webp 750w, /_astro/20250705_1708_Human-Robot-Coding-Collaboration_remix_01jzdj1by9ebmaxjtmw6z04z8q--1-_Z11NS9X.webp 828w, /_astro/20250705_1708_Human-Robot-Coding-Collaboration_remix_01jzdj1by9ebmaxjtmw6z04z8q--1-_Z2mk1A6.webp 1080w, /_astro/20250705_1708_Human-Robot-Coding-Collaboration_remix_01jzdj1by9ebmaxjtmw6z04z8q--1-_1UT4RJ.webp 1280w, /_astro/20250705_1708_Human-Robot-Coding-Collaboration_remix_01jzdj1by9ebmaxjtmw6z04z8q--1-_2ur6G6.webp 1536w&quot;&gt;&lt;/p&gt;
&lt;p&gt;For some time, I had considered porting our &lt;a href=&quot;https://github.com/imgly/background-removal-js&quot;&gt;IMG.LY background removal library&lt;/a&gt; from JavaScript to other platforms using Rust. However, I had postponed this side project due to the anticipated effort involved. This seemed like the perfect project to discover what my role would be in a world where AI does the heavy lifting. To pull it off, I self-imposed only one strict rule:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Hands off the code!&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Every commit, every fix, every feature would be handled by an AI coding agent. My role? Being the curator, formulating my intent, reviewing, play-testing, and guiding the agent with feedback.&lt;/p&gt;
&lt;p&gt;The agent should be the sole coder, from start to finish.&lt;/p&gt;
&lt;p&gt;This was a true hands-off experiment: could an AI build an entire Rust library if I never touched the code?&lt;/p&gt;
&lt;p&gt;Is it really something new? After years of handing off development to teammates as a CTO or teaching students, this didn’t feel completely different.&lt;/p&gt;
&lt;p&gt;So, what happens when you &lt;strong&gt;let an AI do all the coding&lt;/strong&gt;, and you just review and give feedback? What does it actually mean to be a human in this new paradigm?&lt;/p&gt;
&lt;p&gt;The result is baffling and gives a glimpse of what we as engineers can expect for the future.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;10,000+ lines of production-ready code. Authored by AI, orchestrated by a human.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Seeing is believing? Then explore the results and judge for yourself at &lt;a href=&quot;https://github.com/imgly/background-removal-rs/tree/v0.2.0&quot;&gt;github.com/imgly/background-removal-rs&lt;/a&gt;.&lt;br&gt;
I open-sourced the full code and the agent rules used during this experience.&lt;/p&gt;
&lt;p&gt;Here’s what I learned: vibe-engineering an entire Rust library with a coding agent CLI as my only pair programmer.&lt;/p&gt;
&lt;p&gt;On a quick note, I chose to use Claude Code with Opus 4 and Sonnet 4, as I was already familiar with them and had achieved the best results so far. The costs were kept in check by using a Claude Max Account, which at the time is around ~€100.&lt;/p&gt;
&lt;h3 id=&quot;the-general-workflow-that-emerged&quot;&gt;The General Workflow That Emerged&lt;/h3&gt;
&lt;p&gt;After some initial time to get used to working with an AI agent, I realized that the workflow follows pretty closely a typical software engineering flow, but with an important twist that answers our central question: what do humans actually do when AI codes? While most people focus on the &lt;code&gt;code writing&lt;/code&gt; part, I discovered that the &lt;code&gt;quality assurance&lt;/code&gt; part becomes the human’s primary domain. In my experiments, I realized that to keep the code intact over time, this QA phase is essential—and this is where humans truly shine. Most interestingly, with the right rules and prompting, we can let the agent do the heavy lifting here, too.&lt;/p&gt;
&lt;p&gt;Here’s how the collaboration actually worked in practice:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Getting Started&lt;/strong&gt;&lt;br&gt;
The project began with me setting up the environment and configuring timeouts for long-running tasks—because AI agents need time to compile Rust code and run extensive test suites. Together, the AI and I created a &lt;code&gt;CLAUDE.md&lt;/code&gt; file with coding standards and rules (you can see the &lt;a href=&quot;https://github.com/imgly/background-removal-rs/tree/main/.claude/rules&quot;&gt;actual rules we used&lt;/a&gt;). We also wrote project requirements documents collaboratively, with me providing the vision and the AI helping structure the technical details.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Development Dance&lt;/strong&gt;&lt;br&gt;
Once we got rolling, a natural rhythm emerged. I’d describe what I wanted—something like “add support for different image formats with color profile preservation.” The AI would then create a detailed implementation plan, breaking down the work into manageable chunks. I’d review this plan, often tweaking the approach or scope, then give the green light.&lt;/p&gt;
&lt;p&gt;What happened next was fascinating: the AI would write the code, run correctness checks, update all the tests (unit tests, documentation tests, end-to-end tests), run the linter, analyze coverage, and even update documentation and examples. Sometimes it would run performance benchmarks without me asking—the overzealous builder at work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;My New Role: The Quality Guardian&lt;/strong&gt;&lt;br&gt;
My job became verifying that the intent was met and the API actually made sense. I’d play-test the functionality, try to break it in ways a real user might, and provide feedback. When something worked well, I’d document what we learned for future development. The AI would then write tests to lock in that new functionality, ensuring we never accidentally broke what was working.&lt;/p&gt;
&lt;p&gt;This cycle repeated for every feature, with the AI handling the heavy lifting while I focused on direction, quality, and user experience.&lt;/p&gt;
&lt;p&gt;The interesting part was that the more I got used to the workflow, the more I handed off to the agent. The validation and general experience had to be largely influenced or orchestrated by me, but building, testing, and even updating documentation could be delegated. In the beginning, I started just building things, but the more we built, the more the AI agent failed to keep existing functionality intact. With those small context windows, it’s kind of understandable after all.&lt;/p&gt;
&lt;h3 id=&quot;quality-assurance--knowledge-capturing-matters-more-than-ever&quot;&gt;Quality Assurance &amp;#x26; Knowledge Capturing Matters More Than Ever&lt;/h3&gt;
&lt;p&gt;As engineers, we know that at some points we cannot grasp every influence of our code changes on the whole code base anymore. Therefore, we use tests and tooling to help us keep our sanity.&lt;/p&gt;
&lt;p&gt;The good thing is that the Rust and Cargo toolchains are exceptionally high quality when it comes to providing the right tooling also for agents.&lt;/p&gt;
&lt;p&gt;Due to its lack of long-term context and limited knowledge of all the library’s capabilities, the tests and verification mechanisms become crucial. While these &lt;em&gt;are&lt;/em&gt; part of the context, they’re not stored in the agent’s memory but baked into the codebase itself. With the tests and the tooling being available to the agent, it will still make mistakes, as I do, but they can effectively &lt;code&gt;auto-heal&lt;/code&gt; or &lt;code&gt;auto-correct&lt;/code&gt; their own mistakes with the provided feedback.&lt;/p&gt;
&lt;p&gt;I can only advise being even stricter with QA from the very beginning.&lt;/p&gt;
&lt;p&gt;Another thing that became apparent very quickly is that, unlike a human colleague with lots of context and a good memory, agents &lt;em&gt;still&lt;/em&gt; need significant help to remember things to avoid rediscovering the same information repeatedly. This revealed another crucial human role: &lt;code&gt;context engineering&lt;/code&gt; becomes critically important. As such, we engineers become the keepers of institutional knowledge, the ones that help the agent remember what worked and what didn’t. I would describe it as &lt;code&gt;knowledge capture&lt;/code&gt;, for lack of a better term.&lt;/p&gt;
&lt;h2 id=&quot;tips--tricks&quot;&gt;Tips &amp;#x26; Tricks&lt;/h2&gt;
&lt;h3 id=&quot;ai-is-eager-resourceful-and-has-memory-like-a-sieve&quot;&gt;AI Is Eager, Resourceful, and Has Memory Like a Sieve&lt;/h3&gt;
&lt;p&gt;Here are the key insights I gained from building the library with an AI coding agent:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Code that works:&lt;/strong&gt; This might seem obvious, but it wasn’t clear to me if the library would ever be usable or publishable, but it is. The AI proved it could deliver production-ready code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Time Effectiveness:&lt;/strong&gt; While creating the library took around 3 weeks, don’t let this fool you. Most of the time, the agent worked alone, and I only had to check in once in a while to review and give feedback. Iteration cycles and rewriting still take time. So I wouldn’t say development was faster than if I did it myself, but much more scalable and effective with my own time. Here’s what I actually spent my time on: reviewing architectural decisions, ensuring the API made sense, and play-testing the final product.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stamina:&lt;/strong&gt; The agent never complained, even when fixing 400+ warnings after setting the linter to pedantic—it pushed through. The AI powered through hundreds of warnings, even clustering them and suggesting which to fix first. To be fair, most humans would have either gone crazy or aborted the effort claiming “it’s good enough.” This revealed something important: as humans, we don’t need to be the ones grinding through tedious tasks anymore.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Overzealous Builder:&lt;/strong&gt; The agent often built more than I asked for. Scoping and clear implementation plans were essential. This taught me that one of the key human roles is setting boundaries and maintaining focus.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Premature “Done”:&lt;/strong&gt; Sometimes the agent claimed it was finished but left code mocked or incomplete. I learned to always ask, “Is there anything left to implement?” Quality assurance becomes fundamentally a human responsibility.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Old Knowledge:&lt;/strong&gt; The AI sometimes relied on outdated library knowledge. I had to remind it to check the latest docs and version of dependencies, but when asked, it searched the web, GitHub, crates.io, etc., and gathered all necessary information for using a library. Humans become the validators of information freshness.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Forgetting and Compaction:&lt;/strong&gt; Larger features grow outside the context window, so the agent would “compact” context, sometimes forgetting important details. Forcing it to write implementation plans in markdown files helps maintain flow and allows better resuming and bookkeeping. We humans become the keepers of long-term project memory.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Helps Establishing Rules:&lt;/strong&gt; While working with the agent, I saw repeating patterns like it forgetting how to check, build, and test the application, or best practices like using &lt;code&gt;git worktrees&lt;/code&gt;. I started adding new rules to &lt;code&gt;Claude.md&lt;/code&gt; by myself at first, but quickly realized that the agent is far better at formulating and adding new rules if I asked it to. The human role evolved into being the pattern recognizer and rule creator.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Doesn’t Always Obey the Rules:&lt;/strong&gt; Most of the time, the rules are followed, but occasionally it doesn’t follow them and forgets to automatically run all tests. This reinforced that humans must remain the final guardians of process and quality.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Code Deletion:&lt;/strong&gt; Occasionally, the AI “fixed” issues by removing important code paths. Solution: Insist on never removing functionality without discussion, and build a robust test suite. We become the protectors of existing functionality.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Process Management:&lt;/strong&gt; The AI struggled with background processes, understanding when to run things in the background, and keeping track of what it started. For example, starting a web server via &lt;a href=&quot;https://docs.anthropic.com/en/docs/agents-and-tools/tool-use/bash-tool&quot;&gt;&lt;code&gt;Bash&lt;/code&gt;&lt;/a&gt; (see &lt;a href=&quot;https://docs.anthropic.com/en/docs/agents-and-tools/tool-use/bash-tool&quot;&gt;Claude Code Bash tool docs&lt;/a&gt;), and then trying to use a &lt;a href=&quot;https://github.com/microsoft/playwright&quot;&gt;&lt;code&gt;playwright&lt;/code&gt; tool&lt;/a&gt; (see also &lt;a href=&quot;https://github.com/microsoft/playwright-mcp&quot;&gt;playwright-mcp&lt;/a&gt;) to access this server was blocked by these issues. Complex orchestration remains a distinctly human skill.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Overly Agreeable:&lt;/strong&gt; Too often, it seems to just agree with whatever I said. For the future, I wish agents wouldn’t be so obedient. This highlighted that humans need to be the challengers and devil’s advocates in the process.&lt;/p&gt;
&lt;h3 id=&quot;further-remarks&quot;&gt;Further Remarks&lt;/h3&gt;
&lt;p&gt;After three weeks of this experiment, the patterns became clear. Here’s what I learned about the human role in AI-assisted development:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ensure Verify&lt;/strong&gt;, &lt;strong&gt;and Self-Correct:&lt;/strong&gt; Always ask the AI to check, format, lint, test, and benchmark its work. Your job becomes quality orchestration, not quality execution.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Always Plan First:&lt;/strong&gt; Insist on a clear implementation plan before coding begins. Humans excel at high-level architectural thinking and breaking down complex problems.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Write It Down:&lt;/strong&gt; Let an agent keep notes, todos, and open issues in markdown files. Ideally in the repository itself. Don’t rely on the AI’s memory. We become the institutional memory keepers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scope Features:&lt;/strong&gt; Break tasks into small, manageable pieces. Feature scoping and boundary setting become a core human skill.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Test Suite is King:&lt;/strong&gt; A robust test suite prevents accidental “fixes” that remove functionality. Humans become the guardians of existing behavior.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stay Involved:&lt;/strong&gt; Fast iteration and discussion with the AI is crucial. Don’t go fully hands-off. Active curation and guidance remain essential.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;So, what do humans actually do when AI does all the coding?&lt;/p&gt;
&lt;p&gt;To answer that, let’s look at what AI agents are today:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Agents are super-talented, overly obedient coding assistants with lots of stamina and endless potential.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;They’re fast, never complain, and iterate like champs. But they need your guidance, structure, and a healthy dose of skepticism.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In the end, the best results come from a true partnership: you plan and guide—the AI builds, fixes, and learns.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you follow these concepts, then&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Vibe engineering is a highly engaging experience.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And if you’re wondering: yes, I’d do it again. But next time, I’ll make sure the AI writes everything down too, and I’ll put even more effort into validating and securing new features as soon as they’re play-tested and verified. The human role isn’t disappearing—it’s evolving into something more strategic and impactful.&lt;/p&gt;
&lt;p&gt;Through this experiment, I’ve identified three fundamental shifts that define what engineering becomes in an AI-assisted world:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;From Execution to Orchestration&lt;/strong&gt;&lt;br&gt;
We’re no longer the ones typing code—we’re the conductors. Our new skills revolve around prompting (framing tasks so AI understands our intent), directing workflows (knowing when to use AI versus human judgment), and tool fluency (combining different AI tools to create something greater than their parts).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;From Knowledge to Reasoning&lt;/strong&gt;&lt;br&gt;
AI can recall facts and syntax better than any human ever could. But what matters now is our ability to interpret, contextualize, and make sense of uncertainty—something current AI still struggles with. We become the ones who ask “why” and “what if” rather than just “how.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;From Repetition to Adaptation&lt;/strong&gt;&lt;br&gt;
Skills rooted in routine are increasingly automated. The enduring value lies in adaptive thinking, problem-framing, and reinventing approaches when the usual patterns don’t apply. We’re the ones who recognize when something feels off, even if we can’t immediately articulate why.&lt;/p&gt;
&lt;h2 id=&quot;afterthought&quot;&gt;Afterthought&lt;/h2&gt;
&lt;p&gt;During this experiment, I saw that the agent repeated similar tasks over and over again. One thing that struck me was looking up documentation. Whenever something with a third-party library didn’t pan out, it started web-searching for info and guides about the library. It rarely started out with reading the Rust docs first, so I had to tell it to use the Rust docs. Therefore, I assume that providing quick access via tools to guides, docs, API references, and examples will spare me some roundtrips, time, and tokens and accelerate the process. I know that there are tools like &lt;a href=&quot;https://context7.com/&quot;&gt;context7&lt;/a&gt;, but it seems to be focused on JavaScript. At least for the Rust ecosystem, the docs are centralized and standardized and can even be used locally. A tool to access those quickly and find things in them would be highly beneficial.&lt;/p&gt;
&lt;p&gt;Additionally, for coding projects, there are typical steps to follow to verify if the code is sound. It’s probably also best to provide specific tools or workflows to follow these steps exactly. Rules already help with this, though.&lt;/p&gt;
&lt;p&gt;Last but not least, a natural next step would be for an agent to analyze its history periodically and provide new memory entries (rules) based on that to reduce repetition and common mistakes. For more details, see the &lt;a href=&quot;https://img.ly/blog/vibe-engineering-when-ai-does-all-the-coding-what-do-we-actually-do/#appendix-most-used-prompts&quot;&gt;&lt;em&gt;Appendix: Most used prompts&lt;/em&gt;&lt;/a&gt; section, where I analyzed the top 10 most common prompts to help agents proactively develop useful rules.&lt;/p&gt;
&lt;p&gt;If you’re curious about improvements, I’ve put together a &lt;a href=&quot;https://img.ly/blog/vibe-engineering-when-ai-does-all-the-coding-what-do-we-actually-do/#appendix&quot;&gt;&lt;em&gt;wishlist for Claude Code&lt;/em&gt;&lt;/a&gt; that would make the agent even more useful.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;try-it-yourself&quot;&gt;Try It Yourself&lt;/h2&gt;
&lt;p&gt;If you want to experience the results of vibe-engineering firsthand:&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;# Clone and explore the codebase&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; clone&lt;/span&gt;&lt;span&gt; https://github.com/imgly/background-removal-rs.git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; checkout&lt;/span&gt;&lt;span&gt; --tag&lt;/span&gt;&lt;span&gt; v0.2.0&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;# Or install the CLI directly&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;cargo&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; --git&lt;/span&gt;&lt;span&gt; https://github.com/imgly/background-removal-rs.git&lt;/span&gt;&lt;span&gt; --tag&lt;/span&gt;&lt;span&gt; v0.2.0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Remember: every line of code in this library was written by AI while I played the role of curator, architect, and quality guardian. Judge for yourself whether this new paradigm produces production-ready results.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;appendix&quot;&gt;Appendix&lt;/h2&gt;
&lt;h3 id=&quot;appendix-claude-code-wishlist&quot;&gt;Appendix: Claude Code Wishlist&lt;/h3&gt;
&lt;p&gt;During the experiment, I encountered some issues whose resolution would improve the agent.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Project-scoped history (not global).&lt;/li&gt;
&lt;li&gt;Project-scoped todos (not global).&lt;/li&gt;
&lt;li&gt;Project-scoped implementation plans (not global).&lt;/li&gt;
&lt;li&gt;Customizable &lt;code&gt;/compact&lt;/code&gt; prompt or choose other compact strategies.&lt;/li&gt;
&lt;li&gt;Improved handling of background processes.&lt;/li&gt;
&lt;li&gt;History analytics with memory proposal.&lt;/li&gt;
&lt;li&gt;Code-specific predefined &lt;code&gt;Code and Validate&lt;/code&gt; workflows.&lt;/li&gt;
&lt;li&gt;Allow forking of multiple agents from a single point in the session history to create multiple trials with the same intent and context.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;appendix-most-used-prompts&quot;&gt;Appendix: Most Used Prompts&lt;/h3&gt;
&lt;p&gt;Claude code stores the history under &lt;code&gt;~/.claude/history&lt;/code&gt; as json formats. I asked claude code to read them in and categorize the most used prompts.&lt;/p&gt;



































































































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;#&lt;/th&gt;&lt;th&gt;Category&lt;/th&gt;&lt;th&gt;% Usage (Count)&lt;/th&gt;&lt;th&gt;Description / Examples&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Other/Specific Instructions&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;19.5%&lt;/td&gt;&lt;td&gt;Technical specs, detailed requirements&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;em&gt;e.g.&lt;/em&gt;: “Relax the success metrics”, “Use tensor data directly as alpha channel”&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Questions&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;12.7%&lt;/td&gt;&lt;td&gt;Status checks, clarifications&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;em&gt;e.g.&lt;/em&gt;: “What’s next?”, “How can I test it myself?”, “Do we have any mock implementations?“&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Implementation Requests&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;11.1%&lt;/td&gt;&lt;td&gt;Direct build/create requests&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;em&gt;e.g.&lt;/em&gt;: “Create a PRD for Rust port”, “Make ONNX Runtime injectable”&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Simple Responses&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;10.0%&lt;/td&gt;&lt;td&gt;Short confirmations, approvals&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;em&gt;e.g.&lt;/em&gt;: “ok”, “go for it”, specific technical choices&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Continuation Commands&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;8.4%&lt;/td&gt;&lt;td&gt;Requests to proceed&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;em&gt;e.g.&lt;/em&gt;: “go on” (59 times)&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;&lt;strong&gt;File Operations&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;8.3%&lt;/td&gt;&lt;td&gt;File management&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;em&gt;e.g.&lt;/em&gt;: “Write this into PRD.md”, “Move packages into crates directory”&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Context Summaries&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;8.3%&lt;/td&gt;&lt;td&gt;Session continuation due to context limits&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;em&gt;e.g.&lt;/em&gt;: “This session is being continued from a previous conversation…“&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Analysis/Review Requests&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;7.7%&lt;/td&gt;&lt;td&gt;Requests to analyze/review&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;em&gt;e.g.&lt;/em&gt;: “Analyze my background removal project”, “Check the preprocessing”&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Bug Fix/Issue Resolution&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;4.4%&lt;/td&gt;&lt;td&gt;Problem identification/fixes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;em&gt;e.g.&lt;/em&gt;: “You mix up release and debug”, “This is wrong”&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Testing&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;3.8%&lt;/td&gt;&lt;td&gt;Running/validating tests&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;em&gt;e.g.&lt;/em&gt;: “Test images are incorrect”, “Rerun comparison tests”&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;appendix-claude-code-settings&quot;&gt;Appendix: Claude Code Settings&lt;/h3&gt;
&lt;p&gt;In real-world projects, the default timeout of two minutes is not enough. I bumped the timeouts to the maximum values to allow execution of unit tests, E2E tests, benchmarks, and long-running tasks.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;BASH_DEFAULT_TIMEOUT_MS&lt;/code&gt;: Sets the default timeout (in milliseconds) for long-running bash commands.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BASH_MAX_TIMEOUT_MS&lt;/code&gt;: Specifies the maximum timeout (in milliseconds) that can be set for bash commands.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BASH_MAX_OUTPUT_LENGTH&lt;/code&gt;: Limits the maximum number of characters in bash outputs before they are truncated in the middle.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CLAUDE_BASH_MAINTAIN_PROJECT_WORKING_DIR&lt;/code&gt;: Ensures the working directory is reset to the original after each Bash command.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &quot;env&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &quot;CLAUDE_BASH_MAINTAIN_PROJECT_WORKING_DIR&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;true&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &quot;BASH_MAX_TIMEOUT_MS&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;3600000&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &quot;BASH_DEFAULT_TIMEOUT_MS&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;3600000&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &quot;MCP_TIMEOUT&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;3600000&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &quot;MCP_TOOL_TIMEOUT&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;3600000&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;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;library-capabilities&quot;&gt;Library Capabilities&lt;/h3&gt;
&lt;p&gt;High-performance Rust library for AI-powered background removal with hardware acceleration, built for&lt;br&gt;
production scale and developer productivity.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Performance Highlights&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hardware acceleration: CUDA (NVIDIA), CoreML (Apple Silicon), CPU fallback&lt;/li&gt;
&lt;li&gt;Sub-second processing on modern hardware (100-1200ms depending on image size)&lt;/li&gt;
&lt;li&gt;Memory efficient with optimized threading and session reuse&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Key Features&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;AI Models &amp;#x26; Quality&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Multiple state-of-the-art models (ISNet, BiRefNet)&lt;/li&gt;
&lt;li&gt;FP16/FP32 precision variants for performance vs. quality&lt;/li&gt;
&lt;li&gt;Portrait-optimized and general-purpose models&lt;/li&gt;
&lt;li&gt;Custom model support via ONNX models from &lt;a href=&quot;https://huggingface.co/&quot;&gt;Hugging Face&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Format and Color Profile Support&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Input: JPEG, PNG, WebP, TIFF, BMP with ICC color profile preservation&lt;/li&gt;
&lt;li&gt;Output: PNG (transparency), JPEG, WebP, TIFF, raw RGBA8&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Integration Patterns&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One-liner API for simple use cases&lt;/li&gt;
&lt;li&gt;Session-based processing for batch operations&lt;/li&gt;
&lt;li&gt;Stream processing from any AsyncRead source&lt;/li&gt;
&lt;li&gt;CLI tool for standalone usage and pipeline integration&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Architecture &amp;#x26; Platforms&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Dual Backend System&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ONNX Runtime: Maximum performance, GPU acceleration&lt;/li&gt;
&lt;li&gt;Tract: Pure Rust, zero external dependencies&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Platform Support&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;macOS: Apple Silicon + Intel with CoreML acceleration&lt;/li&gt;
&lt;li&gt;Linux/Windows: NVIDIA CUDA + CPU fallback&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Developer Experience&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Modern Rust Ecosystem&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Async/await native support&lt;/li&gt;
&lt;li&gt;Comprehensive documentation and examples&lt;/li&gt;
&lt;li&gt;Zero-warning policy with extensive testing&lt;/li&gt;
&lt;li&gt;Structured tracing for production observability&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CLI Capabilities&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Batch processing with recursive directory support&lt;/li&gt;
&lt;li&gt;Model management (download, cache, clear)&lt;/li&gt;
&lt;li&gt;Provider diagnostics and performance monitoring&lt;/li&gt;
&lt;li&gt;Pipeline-friendly with stdin/stdout support&lt;/li&gt;
&lt;/ul&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>Daniel</dc:creator><media:content url="https://blog.img.ly/2025/07/20250705_1708_Human-Robot-Collaboration_remix_01jzdj0cdxeacs9y9rbhsn04yy.png" medium="image"/><category>AI</category><category>Vibe Coding</category></item><item><title>Background Removal in the Browser Using ONNX Runtime with WebGPU</title><link>https://img.ly/blog/browser-background-removal-using-onnx-runtime-webgpu/</link><guid isPermaLink="true">https://img.ly/blog/browser-background-removal-using-onnx-runtime-webgpu/</guid><description>Achieve 20x Faster Background Removal in the Browser</description><pubDate>Tue, 11 Jun 2024 16:26:17 GMT</pubDate><content:encoded>&lt;p&gt;TL;DR: Using ONNX Runtime with WebGPU and WebAssembly leads to 20x speedup over multi-threaded and 550x speedup over single-threaded CPU performance. Thus achieving interactive speeds for state-of-the-art background removal directly in the browser.&lt;/p&gt;
&lt;p&gt;Removing background from an image is a typical job to be done in creative editing. We have come a long way from manually knocking out the background from an image to full automation with Neural Networks.&lt;/p&gt;
&lt;p&gt;Most state-of-the-art background removal solutions work by offloading the task to the server with a GPU as it was simply infeasible to run the NN on the client.&lt;/p&gt;
&lt;p&gt;However, running background removal directly in the browser offers several advantages over server-side processing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reduced server load and infrastructure costs by offloading heavy lifting to the client.&lt;/li&gt;
&lt;li&gt;Enhanced scalability by distributing the workload across client devices.&lt;/li&gt;
&lt;li&gt;Easier compliance with data protection and security policies by not transferring data across a network to a server.&lt;/li&gt;
&lt;li&gt;Offline processing without needing a reliable internet connection.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It caters to a wide range of use cases, including but not limited to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;E-commerce applications&lt;/em&gt; that need to remove backgrounds from product images in real time.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Image editing applications&lt;/em&gt; that require background removal capabilities for enhancing user experience.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Web-based graphic design tools&lt;/em&gt; that aim to simplify the creative process with in-browser background removal.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In general, two factors influence the feasibility of running background removal directly on the client.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The execution performance, and&lt;/li&gt;
&lt;li&gt;the download size of the Neural Network.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The performance or overall runtime is the major factor to be useful in interactive applications, if a user has to wait several minutes or hours for a neural network to execute, this is in many cases far too long in terms of good user experience. From experience, there are three factors to consider.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The initial first-time execution. The major factor is that neural networks come with the drawback of generally being several MB to GB in size, thus the time to download the neural network into the browser cache is considerable. In subsequent browser page reloads this has no impact anymore.&lt;/li&gt;
&lt;li&gt;The neural network or session initialization time, cannot be cached and has to run with every reload of the page in the browser.&lt;/li&gt;
&lt;li&gt;The neural network or session inference time, largely depends on the longest path inside the neural network and most importantly the execution time of each operator in the neural network.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;towards-real-time-background-removal-in-the-browser&quot;&gt;Towards Real-time Background Removal in the Browser&lt;/h3&gt;
&lt;p&gt;Neural networks are commonly trained in frameworks like PyTorch, which is a neural network library for Python, as such not usable directly in the browser. The best option to run neural networks directly in the browser is converting the neural network into the &lt;strong&gt;Open Neural Network Exchange (ONNX)&lt;/strong&gt; format, which is a widely supported standardized format by Microsoft used extensively in the industry.&lt;/p&gt;
&lt;p&gt;These ONNX-formatted neural networks can then be reconverted into a platform-specific format or directly executed by a supported runtime.&lt;/p&gt;
&lt;p&gt;The ONNX Runtime by Microsoft is a high-performance inference engine designed to run ONNX models across various platforms and languages. One notable feature is &lt;a href=&quot;https://onnxruntime.ai/docs/tutorials/web/build-web-app.html&quot;&gt;ONNX Runtime Web&lt;/a&gt;, which allows JavaScript developers to execute ONNX models directly in the browser. ONNX Runtime Web offers several execution providers for hardware acceleration. For instance, its WebAssembly execution provider enhances CPU execution performance using multiple Web Workers and SIMD instructions.&lt;/p&gt;
&lt;p&gt;More importantly, starting from version 1.7.0, ONNX Runtime Web includes official support for the WebGPU execution provider. WebGPU is a modern web API that enables developers to utilize GPU power for high-performance computations, offering a significant performance boost over CPU-based in-browser machine learning. WebGPU support has been available by default since Chrome 113 and Edge 113 on Mac, Windows, and ChromeOS, and Chrome 121 on Android. For the latest browser support updates, you can track them &lt;a href=&quot;https://github.com/gpuweb/gpuweb/wiki/Implementation-Status&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;implementation-details&quot;&gt;Implementation Details&lt;/h3&gt;
&lt;p&gt;For the implementation of the open-source package &lt;a href=&quot;https://github.com/imgly/background-removal-js&quot;&gt;@imgly/background-removal-js&lt;/a&gt;, we started the journey with a neural network implementation in PyTorch written in Python. The network was then converted to ONNX. You can see our &lt;a href=&quot;https://img.ly/showcases/cesdk/background-removal/web&quot;&gt;live showcase&lt;/a&gt; here.&lt;/p&gt;
&lt;p&gt;The original model was using 32-bit floating point (fp32) precision, which is fine, but results in a file size of 168 MB after converting it to ONNX. As mentioned earlier, the size of the network has a large impact on perceived first-time execution performance as the download time tends to be longer than the execution time, but more to that later.&lt;/p&gt;
&lt;p&gt;To reduce the size of the model, we converted the model to use fp16 (16-bit floating point) and QUINT8 (Quantized 8-bit) datatypes. Thus, effectively reducing the size to half (84MB) and a fourth (42MB) of the original size. Additionally to the download size, the operators used will be converted corresponding to the datatype and different data types and depending on the hardware may lead to speed improvements or even deteriorating due to specialized hardware being used or not being present.&lt;/p&gt;
&lt;p&gt;Note, that while that sounds great, the conversion has a potential negative impact on the quality of the output as we are removing information in the neural networks and since we are working with images, artifacts might become visible and the quality of the resulting background mask is reduced.&lt;/p&gt;
&lt;h2 id=&quot;evaluation&quot;&gt;Evaluation&lt;/h2&gt;
&lt;p&gt;When dealing with neural networks in the browser we can identify three different scenarios&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;First Use&lt;/li&gt;
&lt;li&gt;First Run&lt;/li&gt;
&lt;li&gt;Consecutive Runs&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The first-use scenario occurs when the web application is started the first time. The neural network has to be downloaded from the server into the browser sandbox, as neural networks are several 10-1000 MB in size this is not neglectable.&lt;/p&gt;
&lt;p&gt;The first run assumes that the neural network is already present in the browser cache, however, when the neural network ought to be used, the network has to initialize before execution.&lt;/p&gt;
&lt;p&gt;In consecutive runs, the neural network is already in memory and the execution time is largely determined by the neural network depth and operators only.&lt;/p&gt;
&lt;h3 id=&quot;first-use--neural-network-download&quot;&gt;First Use – Neural Network Download&lt;/h3&gt;
&lt;p&gt;While download or time is a large factor in the first-time execution time, this is largely dependent on the available network bandwidth, as such it is not part of the evaluation but in order to get an idea here are the expected download times for the fp32 (168MB) and fp16 (84MB) neural network subject to various common network bandwidth:&lt;/p&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Network Bandwidth&lt;/th&gt;&lt;th&gt;Filesize&lt;/th&gt;&lt;th&gt;Download Time&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;10 Mbps&lt;/td&gt;&lt;td&gt;84 MB&lt;/td&gt;&lt;td&gt;67s s&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;100 Mbps&lt;/td&gt;&lt;td&gt;84 MB&lt;/td&gt;&lt;td&gt;6.7 s&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1 Gbps&lt;/td&gt;&lt;td&gt;84 MB&lt;/td&gt;&lt;td&gt;0.67 s&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;10 Gbps&lt;/td&gt;&lt;td&gt;84 MB&lt;/td&gt;&lt;td&gt;0.067&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Network Bandwidth&lt;/th&gt;&lt;th&gt;Filesize&lt;/th&gt;&lt;th&gt;Download Time&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;10 Mbps&lt;/td&gt;&lt;td&gt;168 MB&lt;/td&gt;&lt;td&gt;134.4 s&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;100 Mbps&lt;/td&gt;&lt;td&gt;168 MB&lt;/td&gt;&lt;td&gt;13.4 s&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1 Gbps&lt;/td&gt;&lt;td&gt;168 MB&lt;/td&gt;&lt;td&gt;1.34 s&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;10 Gbps&lt;/td&gt;&lt;td&gt;168 MB&lt;/td&gt;&lt;td&gt;0.13 s&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Based on the assumption that the median download bandwidth is ~100 Mbps, we see that it’s in the 5-15 second range.&lt;/p&gt;
&lt;h3 id=&quot;first-run--neural-network-initialization--compilation&quot;&gt;First Run – Neural Network Initialization / Compilation&lt;/h3&gt;
&lt;p&gt;Before the neural network can be executed it has to be initialized. Initialization includes several execution provider-specific steps. Most prominent are the time to upload or convert the data to the execution provider and execution provider-specific ONNX graph optimization passes. This all adds to the first run experience. We have evaluated the average session initialization time for the CPU (WASM) and WebGPU provider on a MacBook Pro 13” from 2024 with an Apple M3 Max 16 cores to get an idea of the general impact on first run execution time:&lt;/p&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Device&lt;/th&gt;&lt;th&gt;Datatype&lt;/th&gt;&lt;th&gt;Session Initialization Time&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;CPU (WASM)&lt;/td&gt;&lt;td&gt;fp32&lt;/td&gt;&lt;td&gt;~320ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CPU (WASM)&lt;/td&gt;&lt;td&gt;fp16&lt;/td&gt;&lt;td&gt;~320ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;WebGPU&lt;/td&gt;&lt;td&gt;fp32&lt;/td&gt;&lt;td&gt;~400ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;WebGPU&lt;/td&gt;&lt;td&gt;fp16&lt;/td&gt;&lt;td&gt;~200ms&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Note, that session initialization is not negligible and adds significant runtime overhead and might be subject to additional optimization possibilities like caching the optimized model.&lt;/p&gt;
&lt;h3 id=&quot;consecutive-runs--neural-network-execution&quot;&gt;Consecutive Runs – Neural Network Execution&lt;/h3&gt;
&lt;p&gt;Independent of the download and initialization time, we evaluated different execution providers on a MacBook Pro 13” from 2024 with an Apple M3 Max 16 cores. While this is top-end consumer hardware, the general trends will probably apply to various hardware configurations. As a reference, we choose the single thread performance with the neural network running on the CPU with 1 worker thread and SIMD disabled.&lt;/p&gt;













































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Device&lt;/th&gt;&lt;th&gt;SIMD&lt;/th&gt;&lt;th&gt;Threads&lt;/th&gt;&lt;th&gt;Datatype&lt;/th&gt;&lt;th&gt;Session Runtime&lt;/th&gt;&lt;th&gt;Speedup&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;CPU (WASM)&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;fp32&lt;/td&gt;&lt;td&gt;~53000 ms&lt;/td&gt;&lt;td&gt;1.0 x&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CPU (WASM)&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;fp32&lt;/td&gt;&lt;td&gt;~6300 ms&lt;/td&gt;&lt;td&gt;8.4 x&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CPU (WASM)&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;fp32&lt;/td&gt;&lt;td&gt;~15000 ms&lt;/td&gt;&lt;td&gt;3.5 x&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CPU (WASM)&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;fp32&lt;/td&gt;&lt;td&gt;~2000 ms&lt;/td&gt;&lt;td&gt;26.5 x&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The data above reveals that running the neural network without any acceleration such as SIMD and threading in the browser results in almost 53s runtime, and as such is for most interactive use cases too slow to use. Due to the optimizations of the ONNX Runtime that uses SIMD and threads, we can achieve an overall speedup of roughly ~26 times compared to the baseline performance. Thus decreasing the session runtime to around 2s and making it usable for interactive applications.&lt;/p&gt;
&lt;p&gt;As mentioned before, we neglected the download time and size of the network. Leveraging the fp16 model compression, we re-ran the benchmarks and got similar results as before, but with half the bandwidth required to download the network for the first time application. The general visual performance of the fp16 and fp32 is similar or visually not perceivable. The quint8 model led to artifacts and as such unusable for visual processing, thus we excluded from the following benchmark.&lt;/p&gt;













































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Device&lt;/th&gt;&lt;th&gt;SIMD&lt;/th&gt;&lt;th&gt;Threads&lt;/th&gt;&lt;th&gt;Datatype&lt;/th&gt;&lt;th&gt;Session Runtime&lt;/th&gt;&lt;th&gt;Speedup&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;CPU (WASM)&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;fp16&lt;/td&gt;&lt;td&gt;~55000 ms&lt;/td&gt;&lt;td&gt;1.0 x&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CPU (WASM)&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;fp16&lt;/td&gt;&lt;td&gt;~7300 ms&lt;/td&gt;&lt;td&gt;7.2 x&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CPU (WASM)&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;fp16&lt;/td&gt;&lt;td&gt;~15000 ms&lt;/td&gt;&lt;td&gt;3.5 x&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CPU (WASM)&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;fp16&lt;/td&gt;&lt;td&gt;~2300 ms&lt;/td&gt;&lt;td&gt;23.9 x&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The results are a little worse than the fp32 version, which might be because the fp16 datatype has no direct specialized hardware in modern CPUs like the M3 Max CPU, and as such additional fp16 to fp32 conversion operations have to be performed.&lt;/p&gt;
&lt;p&gt;Our final benchmark measures the WebGPU performance, which led to the following impressive results. To have a fair comparison and understanding of the impact of the WebGPU technology, we compare it with the best CPU version with 16 threads and SIMD enabled with the fp32 model, which was around ~2 s.&lt;/p&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Device&lt;/th&gt;&lt;th&gt;SIMD&lt;/th&gt;&lt;th&gt;Threads&lt;/th&gt;&lt;th&gt;Datatype&lt;/th&gt;&lt;th&gt;Session Runtime&lt;/th&gt;&lt;th&gt;Speedup&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;WebGPU&lt;/td&gt;&lt;td&gt;Not applicable&lt;/td&gt;&lt;td&gt;Not applicable&lt;/td&gt;&lt;td&gt;fp32&lt;/td&gt;&lt;td&gt;~120ms&lt;/td&gt;&lt;td&gt;16.6 x&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;WebGPU&lt;/td&gt;&lt;td&gt;Not applicable&lt;/td&gt;&lt;td&gt;Not applicable&lt;/td&gt;&lt;td&gt;fp16&lt;/td&gt;&lt;td&gt;~100ms&lt;/td&gt;&lt;td&gt;20.0 x&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The WebGPU performance varies around &lt;strong&gt;16 to 20 x&lt;/strong&gt; improvements over the best CPU execution time. The GPU has specialized hardware for fp16 instructions, as such the model performs better than the fp32 model. Also, note that the session initialization time is also reduced due to half the required bandwidth to upload the network data to the GPU.&lt;/p&gt;
&lt;p&gt;Therefore, the first run of the network will take ~300 ms and consecutive runs will be ~100 ms, leading to near real-time performance in the browser.&lt;/p&gt;
&lt;p&gt;Note, that the WebGPU performance is an astonishing &lt;strong&gt;550 times faster&lt;/strong&gt; than the single thread, with no SIMD performance.&lt;/p&gt;
&lt;p&gt;Try the live implementation in our &lt;a href=&quot;https://img.ly/?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=background-removal-onnx&quot;&gt;background removal showcase&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;WebGPU is a major leap in establishing the browser as a factor to be reckoned with as a true Application platform. With &lt;a href=&quot;https://IMG.LY/?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=background-removal-onnx&quot;&gt;IMG.LY&lt;/a&gt;, we are striving to leverage modern technology to make design tools accessible, this includes on-device execution, on-premise, but also on-cloud execution of design tools leveraging neural networks.&lt;/p&gt;
&lt;p&gt;As a next step, we will port background removal to all our supported platforms, ONNX Runtime seems the best choice, as it is already available for all the potential platforms we support.&lt;/p&gt;
&lt;p&gt;&lt;video src=&quot;https://storage.googleapis.com/imgly-static-assets/static/blog/videos/onnx/bg-removal.mp4&quot; controls autoplay muted loop playsinline&gt;&lt;/video&gt;&lt;/p&gt;
&lt;p&gt;Furthermore, we are evaluating the feasibility of in-browser background removal for videos to be included with our video-editing suits.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://img.ly/showcases/cesdk/?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=background-removal-onnx&quot;&gt;Try our tools today&lt;/a&gt; to see how we help bring unique creative editing experiences to any application. Or &lt;a href=&quot;https://img.ly/forms/contact-sales/?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=background-removal-onnx&quot;&gt;contact us&lt;/a&gt; to discuss your project.&lt;/p&gt;</content:encoded><dc:creator>Daniel</dc:creator><dc:creator>Emma</dc:creator><media:content url="https://blog.img.ly/2024/06/onnx-runtime-imgly.jpg" medium="image"/><category>Plugin</category><category>App Development</category><category>Image Processing</category><category>Insights</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.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>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><item><title>CE.SDK v1.5.0 Release</title><link>https://img.ly/blog/creative-editor-sdk-v_1_5_0-release-notes/</link><guid isPermaLink="true">https://img.ly/blog/creative-editor-sdk-v_1_5_0-release-notes/</guid><description>This quarter CE.SDK brings PDF Export, High-Performance Rendering, and more updates.</description><pubDate>Thu, 14 Apr 2022 12:53:45 GMT</pubDate><content:encoded>&lt;p&gt;Another six weeks have passed since our &lt;a href=&quot;https://img.ly/blog/ce-sdk-v140-release/?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=releasenotes&quot;&gt;v1.4.0 release&lt;/a&gt; that brought an updated asset library and headless APIs. Since the initial CE.SDK release, we’ve been listening to your feedback and continuously releasing updates to improve and expand CE.SDK to better serve your needs. Here’s a short overview of what’s happened in the last quarter.&lt;/p&gt;
&lt;p&gt;CE.SDK v1.5.0 is adding:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hierarchies (Groups)&lt;/li&gt;
&lt;li&gt;Template Imports &amp;#x26; Exports&lt;/li&gt;
&lt;li&gt;More Performance, More Power&lt;/li&gt;
&lt;li&gt;High-Performance Rendering&lt;/li&gt;
&lt;li&gt;Improved Touch Support&lt;/li&gt;
&lt;li&gt;PDF Export&lt;/li&gt;
&lt;li&gt;Subscription/Events API&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;hierarchies-groups&quot;&gt;Hierarchies (Groups)&lt;/h2&gt;
&lt;p&gt;With this release, we finally extended our flat hierarchy model to the typical parent-child relationship model between items on the canvas. That allows you to build an even more complex design: Group items to form a single unit and handle those items as one or control their opacity.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;group-elements-editor.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 841px) 841px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;841&quot; height=&quot;564&quot; src=&quot;https://img.ly/_astro/group-elements-editor_OYf4m.webp&quot; srcset=&quot;/_astro/group-elements-editor_1uc9Su.webp 640w, /_astro/group-elements-editor_Z2l4gRb.webp 750w, /_astro/group-elements-editor_q95Qy.webp 828w, /_astro/group-elements-editor_OYf4m.webp 841w&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;template-imports--exports&quot;&gt;Template Imports &amp;#x26; Exports&lt;/h2&gt;
&lt;p&gt;Export your template scenes as .scene-files that pack all assets that were used. You can also share your template by URL - all dependencies will resolve accordingly.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;export-scene-file.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1484px) 1484px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1484&quot; height=&quot;994&quot; src=&quot;https://img.ly/_astro/export-scene-file-1_Z1uOhDg.webp&quot; srcset=&quot;/_astro/export-scene-file-1_Z1YOoN9.webp 640w, /_astro/export-scene-file-1_Z26gUFE.webp 750w, /_astro/export-scene-file-1_2puJLQ.webp 828w, /_astro/export-scene-file-1_ZUXUBt.webp 1080w, /_astro/export-scene-file-1_ZoLrs3.webp 1280w, /_astro/export-scene-file-1_Z1uOhDg.webp 1484w&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;more-performance&quot;&gt;More Performance&lt;/h2&gt;
&lt;p&gt;We have replaced our underlying rendering engine with a new high-performance implementation, resulting in the performance of distinct scenarios improving by 100%. Likewise, as a result of polishing up various logic, CE.SDK runs faster than ever.&lt;/p&gt;
&lt;h2 id=&quot;improved-touch--mobile-support&quot;&gt;Improved Touch &amp;#x26; Mobile Support&lt;/h2&gt;
&lt;p&gt;After evaluation, CE.SDK v1.5.0 expands upon our mobile advancement efforts by improving our web UI for touch inputs on mobile devices.&lt;/p&gt;
&lt;h2 id=&quot;pdf-export&quot;&gt;PDF Export&lt;/h2&gt;
&lt;p&gt;CE.SDK now supports PDF export. Vector paths and images are embedded, and rasterization will only be applied when necessary. Scenes of multiple pages can be exported as a multipage document.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Create a design or a multipage document, such as a presentation, and export it as a PDF. Your text remains selectable.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1132px) 1132px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1132&quot; height=&quot;690&quot; src=&quot;https://img.ly/_astro/pdf-online-creator_Z2nOnpt.webp&quot; srcset=&quot;/_astro/pdf-online-creator_1YzfbM.webp 640w, /_astro/pdf-online-creator_JPlYt.webp 750w, /_astro/pdf-online-creator_1gRVvw.webp 828w, /_astro/pdf-online-creator_1bCiFX.webp 1080w, /_astro/pdf-online-creator_Z2nOnpt.webp 1132w&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;build-your-custom-ui&quot;&gt;Build Your Custom UI&lt;/h2&gt;
&lt;p&gt;We vastly improved support for building custom UIs on top of CE.SDK engine:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;CreativeEngine&lt;/code&gt; offers a powerful set of APIs to inspect, modify and interact with a scene.&lt;/li&gt;
&lt;li&gt;A new set of UI-specific APIs, including history and zoom management, was added as a preview.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;events-api&quot;&gt;Events API&lt;/h2&gt;
&lt;p&gt;An Event API allows subscribing to scene changes and updates custom UI components accordingly.&lt;/p&gt;
&lt;h2 id=&quot;other&quot;&gt;&lt;strong&gt;Other&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;For an even smoother UI experience, we have improved the visual quality of element state indicators, and they now respect the element order.&lt;/p&gt;
&lt;h3 id=&quot;thanks-for-reading-to-stay-in-the-loop-with-our-latest-articles-and-releases-subscribe-to-our-newsletter&quot;&gt;Thanks for reading! To stay in the loop with our latest articles and releases, 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>Daniel</dc:creator><dc:creator>Malte</dc:creator><media:content url="https://blog.img.ly/2022/04/ce-sdk-v_1_5_0-editor-2.png" medium="image"/><category>Release Notes</category><category>Web Development</category><category>Design Editor</category><category>Photo Editor</category></item><item><title>CE.SDK v1.4.0 Release</title><link>https://img.ly/blog/ce-sdk-v140-release/</link><guid isPermaLink="true">https://img.ly/blog/ce-sdk-v140-release/</guid><description>Enhance your user experience with an improved library system, easy UI translation and more.</description><pubDate>Tue, 22 Feb 2022 12:34:56 GMT</pubDate><content:encoded>&lt;p&gt;Six weeks have passed since our &lt;a href=&quot;https://img.ly/blog/ce-sdk-v1-3-0-release-notes/?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=releasenotes&quot;&gt;last release&lt;/a&gt;, where we shipped our new and improved default UI, Placeholders, and a preview for our new Dashboard.&lt;/p&gt;
&lt;p&gt;This time, we focused heavily on making content discovery and provisioning better for you and your customers, as well as automation and API-driven design. Our release includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Custom Asset Libraries &amp;#x26; Management&lt;/li&gt;
&lt;li&gt;Internationalization&lt;/li&gt;
&lt;li&gt;Headless Mode &amp;#x26; APIs&lt;/li&gt;
&lt;li&gt;Other&lt;/li&gt;
&lt;li&gt;Outlook on upcoming releases&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;asset-libraries--management&quot;&gt;Asset Libraries &amp;#x26; Management&lt;/h2&gt;
&lt;p&gt;With this release, we improve our library system and overall usability. CE.SDK 1.4.0 introduces a new toolbar to let your users quickly access their favorite images, shapes, stickers, or text assets.&lt;/p&gt;
&lt;p&gt;Even more importantly, we added a General Asset Source API that allows you to add any external library sources you like. This way, you can provide custom assets to your users, such as images, stickers, or anything else.&lt;br&gt;
Check out our &lt;a href=&quot;https://img.ly/docs/cesdk/js/import-media-4e3703/?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=releasenotes&quot;&gt;Documentation on Custom Asset Source Integration&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;A new user toolbar to the left - for quick library access. Use the General Asset Source API for external libraries.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1408px) 1408px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1408&quot; height=&quot;792&quot; src=&quot;https://img.ly/_astro/ce-sdk-design-editor-v140_1cQ66o.webp&quot; srcset=&quot;/_astro/ce-sdk-design-editor-v140_15HV7q.webp 640w, /_astro/ce-sdk-design-editor-v140_Z1oTmQU.webp 750w, /_astro/ce-sdk-design-editor-v140_Z1g7GmS.webp 828w, /_astro/ce-sdk-design-editor-v140_Z1YrsWH.webp 1080w, /_astro/ce-sdk-design-editor-v140_ZPrsSq.webp 1280w, /_astro/ce-sdk-design-editor-v140_1cQ66o.webp 1408w&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;internationalization-i18n&quot;&gt;Internationalization (i18n)&lt;/h2&gt;
&lt;p&gt;CE.SDK now supports the easy translation of the default UI into any language, including full i18n support. We ship with English and German locales, but have successfully tested it with other languages.&lt;br&gt;
Learn more about &lt;a href=&quot;https://img.ly/docs/cesdk/js/user-interface/localization-508e20/?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=releasenotes&quot;&gt;adding translations to CE.SDK in our Documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;headless-mode--apis&quot;&gt;Headless Mode &amp;#x26; APIs&lt;/h2&gt;
&lt;p&gt;We are finally extending CE.SDK with a full headless mode that is usable without a user interface in a browser. You can use it to load, modify, and export scene templates programmatically without the need for any user interaction. Use it to create previews of your scenes with custom user content without opening the editor, or export your designs in multiple resolutions on demand.&lt;/p&gt;
&lt;h3 id=&quot;included-apis&quot;&gt;Included APIs&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;Scene API&lt;/em&gt;&lt;/strong&gt; lets you create, load, save, or export scenes to a rasterized image format.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Block API&lt;/strong&gt; lets you create, read, update and delete any item (so-called &lt;em&gt;blocks&lt;/em&gt;) in the scene; modifying properties like position, size, or content is guaranteed easy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Layouts API&lt;/strong&gt; lets you use advanced layout capabilities: choose from modes like absolute positioning, relative positioning in percent relative to the parent, or even auto layout. An even auto-layout lets you auto-adapt the size of a block according to its parent size and siblings.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;other&quot;&gt;Other&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Snapping now works with multiple selected items.&lt;/li&gt;
&lt;li&gt;Slider input values now allow manual input to give you more control.&lt;/li&gt;
&lt;li&gt;Easy asset library access in the UI.&lt;/li&gt;
&lt;li&gt;Changing content in Preview Mode to preview your template settings does not alter your template anymore.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;upcoming&quot;&gt;Upcoming&lt;/h2&gt;
&lt;p&gt;We are currently working hard to improve the overall CE.SDK Editor experience for you and your customers. That includes adding features like strokes, gradients, grouping, but also improving the rendering performance to create more complex designs. Additionally, we are improving asset discovery within the editor.&lt;/p&gt;
&lt;p&gt;Excitingly, we are working hard to bring our &lt;a href=&quot;https://img.ly/products/video-sdk/?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=releasenotes&quot;&gt;VE.SDK video features&lt;/a&gt; to CE.SDK! In the near future, you can use videos and animated GIFs inside any template and export short videos from within CE.SDK for Web.&lt;/p&gt;
&lt;h3 id=&quot;thanks-for-reading-to-stay-in-the-loop-with-our-latest-articles-and-case-studies-subscribe-to-our-newsletter&quot;&gt;Thanks for reading! To stay in the loop with our latest articles and case studies, 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>Daniel</dc:creator><media:content url="https://blog.img.ly/2022/02/CE-SDK-design-editor-1-4-0-javascript.png" medium="image"/><category>Release Notes</category><category>Design Editor</category><category>Web Development</category><category>Photo Editor</category><category>App Development</category></item><item><title>CE.SDK v1.3.0 Release</title><link>https://img.ly/blog/ce-sdk-v1-3-0-release-notes/</link><guid isPermaLink="true">https://img.ly/blog/ce-sdk-v1-3-0-release-notes/</guid><description>Including a fantastic dashboard to create and organize designs, we are happy to announce a major update for CE.SDK.</description><pubDate>Mon, 17 Jan 2022 15:07:02 GMT</pubDate><content:encoded>&lt;p&gt;After another six weeks of work, we are happy to ship another update of our &lt;a href=&quot;https://img.ly/creative-sdk?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=releasenotes&quot;&gt;CreativeEditor SDK&lt;/a&gt; (CE.SDK). This release is again packed with great features to enhance the developer experience and user experience. It includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New improved Default UI&lt;/li&gt;
&lt;li&gt;Lockable Design &amp;#x26; Placeholders&lt;/li&gt;
&lt;li&gt;SVG Assets&lt;/li&gt;
&lt;li&gt;Multi Selection&lt;/li&gt;
&lt;li&gt;Nudging (moving elements with arrow and shift key)&lt;/li&gt;
&lt;li&gt;Create scenes from an Image.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;new-improved-default-ui&quot;&gt;New Improved Default UI&lt;/h2&gt;
&lt;p&gt;That is the first release to introduce a new UI type for CE.SDK, which we call &lt;strong&gt;Default UI&lt;/strong&gt;. It comes with a slick interface and focuses on fast design adoption. The Default UI removes the need for inspectors for many editing cases, thus leaving your users undistracted and focused on adapting or creating designs.&lt;/p&gt;
&lt;p&gt;Check our official documentation to learn about &lt;a href=&quot;https://img.ly/docs/cesdk/js/user-interface/overview-41101a/&quot;&gt;configuring the UI Elements&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Minimal user interface for fast design adoption&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 2190px) 2190px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;2190&quot; height=&quot;1331&quot; src=&quot;https://img.ly/_astro/Screenshot-2022-01-05-at-19.03.52_Z1iDWLA.webp&quot; srcset=&quot;/_astro/Screenshot-2022-01-05-at-19.03.52_ZNEAUK.webp 640w, /_astro/Screenshot-2022-01-05-at-19.03.52_2pPIkY.webp 750w, /_astro/Screenshot-2022-01-05-at-19.03.52_Z2aWPwO.webp 828w, /_astro/Screenshot-2022-01-05-at-19.03.52_1hbrTA.webp 1080w, /_astro/Screenshot-2022-01-05-at-19.03.52_MnPWU.webp 1280w, /_astro/Screenshot-2022-01-05-at-19.03.52_Z1c39bY.webp 1668w, /_astro/Screenshot-2022-01-05-at-19.03.52_xEqee.webp 2048w, /_astro/Screenshot-2022-01-05-at-19.03.52_Z1iDWLA.webp 2190w&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;lockable-design--placeholders&quot;&gt;Lockable Design &amp;#x26; Placeholders&lt;/h2&gt;
&lt;p&gt;In the previous version, CE.SDK introduced the roles “&lt;strong&gt;creator&lt;/strong&gt;” and “&lt;strong&gt;adopter&lt;/strong&gt;” – differentiating between template creation and adoption. In creator mode, you have the liberty to create a design from scratch or change existing designs.&lt;/p&gt;
&lt;p&gt;When creators are ready to share a design, they define which design elements can be changed when opening the editor in the “adopter” role. Typically, creators will allow adopters to exchange content, but also the options to style or arrange an item can be controlled.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Specify how elements can be altered by adopters.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1087px) 1087px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;1087&quot; height=&quot;772&quot; src=&quot;https://img.ly/_astro/2_rtDwW.webp&quot; srcset=&quot;/_astro/2_27fgpW.webp 640w, /_astro/2_ZJnaXH.webp 750w, /_astro/2_pLfu7.webp 828w, /_astro/2_AzR1X.webp 1080w, /_astro/2_rtDwW.webp 1087w&quot;&gt;&lt;/p&gt;
&lt;p&gt;When the editor is opened in the “adopter” role (Default UI), items that are allowed to change will be highlighted and images will be shown with an overlay indicating that the content shall be replaced before exporting or saving the design.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 2187px) 2187px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;2187&quot; height=&quot;1336&quot; src=&quot;https://img.ly/_astro/3_Z2wSzmA.webp&quot; srcset=&quot;/_astro/3_Z1xfDxi.webp 640w, /_astro/3_fL1ec.webp 750w, /_astro/3_Z1UKVY3.webp 828w, /_astro/3_Z17Ikjc.webp 1080w, /_astro/3_Z1i96hT.webp 1280w, /_astro/3_IDAxi.webp 1668w, /_astro/3_a3BfK.webp 2048w, /_astro/3_Z2wSzmA.webp 2187w&quot;&gt;&lt;/p&gt;
&lt;p&gt;Find more information about &lt;a href=&quot;https://img.ly/docs/cesdk/js/create-templates/add-dynamic-content/placeholders-d9ba8a/?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=releasenotes&quot;&gt;placeholders and constraints&lt;/a&gt; in our official documentation.&lt;/p&gt;
&lt;h2 id=&quot;dashboard&quot;&gt;Dashboard&lt;/h2&gt;
&lt;p&gt;Creating and adopting designs is one part, but organizing designs is another. With this release, we also introduced a dashboard to create and organize your designs for your users. Reach out to us if you want to see a demo of the dashboard in action and understand.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Create, adopt and organize designs in your dashboard.&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;1049&quot; src=&quot;https://img.ly/_astro/dashboard_Z1hUiJy.webp&quot; srcset=&quot;/_astro/dashboard_1SHs7i.webp 640w, /_astro/dashboard_13nXG2.webp 750w, /_astro/dashboard_2cPKul.webp 828w, /_astro/dashboard_147xGm.webp 1080w, /_astro/dashboard_2lqHA4.webp 1280w, /_astro/dashboard_Z24kxQd.webp 1668w, /_astro/dashboard_Z1hUiJy.webp 2000w&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;svg-assets&quot;&gt;SVG Assets&lt;/h2&gt;
&lt;p&gt;With this version, we introduced SVG as an asset-type alternative to JPEG and PNG image formats. This has the benefit that standard SVG Stickers can just be used or uploaded in every design. This has the major advantage that stickers will be crisp at any resolution while coming with a very low download size. Reducing the server load and data transfer for you and your users. In this turn, we also replaced all our example stickers with their SVG equivalents.&lt;/p&gt;
&lt;h2 id=&quot;multi-selection&quot;&gt;Multi Selection&lt;/h2&gt;
&lt;p&gt;Positioning multiple items at once has been a pain before this release, but not anymore. With the new multi-selection interaction, users can select two or more items at once. Just hold down the “shift” modifier key and start selecting multiple items. Once selected, they can be moved around simultaneously.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 2184px) 2184px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;2184&quot; height=&quot;1336&quot; src=&quot;https://img.ly/_astro/multi_1fxY3W.webp&quot; srcset=&quot;/_astro/multi_ZJcsql.webp 640w, /_astro/multi_Z1OosUB.webp 750w, /_astro/multi_1ur2dz.webp 828w, /_astro/multi_2ryYzY.webp 1080w, /_astro/multi_wMfG6.webp 1280w, /_astro/multi_eVcmt.webp 1668w, /_astro/multi_Z2hMquq.webp 2048w, /_astro/multi_1fxY3W.webp 2184w&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;nudging&quot;&gt;Nudging&lt;/h2&gt;
&lt;p&gt;Always wanted to fine-tune your design and pixel-perfectly align your content?&lt;/p&gt;
&lt;p&gt;You can now use the &lt;em&gt;arrow keys&lt;/em&gt; (⬅️, ➡️, ⬆️ ⬇️) to nudge the selected items to their correct position pixel by pixel. You can also hold down &lt;em&gt;shift&lt;/em&gt; to nudge even further.&lt;/p&gt;
&lt;h2 id=&quot;create-scene-from-image&quot;&gt;Create Scene from Image&lt;/h2&gt;
&lt;p&gt;Before this release, the CE.SDK could either start from an empty or a predefined scene. From now on, there is also an option to start the editor with any image. It will auto-create a page with the size of the given image and insert the image into this one, allowing a more content-driven creation process. Learn &lt;a href=&quot;https://img.ly/docs/cesdk/js/open-the-editor/from-image-ad9b5e/?utm_source=imgly&amp;#x26;utm_medium=blog&amp;#x26;utm_campaign=releasenotes&quot;&gt;how to create a scene from an image&lt;/a&gt; in our documentation.&lt;/p&gt;
&lt;h2 id=&quot;minor-changes&quot;&gt;Minor changes&lt;/h2&gt;
&lt;p&gt;Besides the major features, there are a ton of small improvements. These include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;UI interface to rename items and pages to a user-defined name&lt;/li&gt;
&lt;li&gt;Ability to choose between two UI types, “default” and “advanced”&lt;/li&gt;
&lt;li&gt;Searching in image libraries now uses i18n translations&lt;/li&gt;
&lt;li&gt;Ability to change the UI Font.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Feel free to send us &lt;a href=&quot;https://img.ly/company/contact-us&quot;&gt;any question&lt;/a&gt;s, or let us know what you think on &lt;a href=&quot;https://twitter.com/imgly&quot;&gt;Twitter&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;thank-you-for-your-time&quot;&gt;Thank you for your time!&lt;/h3&gt;
&lt;p&gt;To stay in the loop with our latest articles and case studies, 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;/p&gt;</content:encoded><dc:creator>Daniel</dc:creator><media:content url="https://blog.img.ly/2022/02/creative-SDK-photo-design-editor-web.png" medium="image"/><category>Release Notes</category><category>Web Development</category><category>Photo Editor</category><category>Image Editing</category></item><item><title>Work Where You Work Best</title><link>https://img.ly/blog/work-where-you-work-best/</link><guid isPermaLink="true">https://img.ly/blog/work-where-you-work-best/</guid><description>Img.ly will now transition into a remote-first company. We won’t get back to the old normal, as we don’t believe in an old normal. Now, we’re figuring out what it means to make a temporary change permanent.</description><pubDate>Tue, 23 Jun 2020 13:01:57 GMT</pubDate><content:encoded>&lt;p&gt;When the coronavirus pandemic started spreading in Germany, our team started working from home, weeks before it became mandatory. This step seemed comparatively easy for us, like for many other tech-driven companies.&lt;/p&gt;
&lt;p&gt;From the get-go, img.ly has been a company of digital natives, and as such we are used to digital tools for day to day work. Everyone already worked with laptops instead of desktop computers, we used online collaboration tools in the majority of our time, communicated with tools like Slack, and relied on cloud services whenever possible. So when the pandemic hit, we were perfectly equipped to work from home.&lt;/p&gt;
&lt;p&gt;As for everyone, there were a few hiccups in the beginning. Many of our teammates missed day-to-day social contact. We all like to chit chat once in a while, enjoy a coffee break in our neighborhood or have lunch together in one of the many local restaurants.&lt;/p&gt;
&lt;p&gt;From day one, we added more video calls and played online games to compensate for the missing real-life interactions. We also tried to recreate our office atmosphere by introducing voice channels aside from our other communication channels.&lt;/p&gt;
&lt;p&gt;We realized that the newly introduced voice channels were used extensively in the first few weeks but became vacant later on. Instead, people relied on slack or zoom to hop on a call whenever necessary or wrote down problems to discuss with the team &lt;em&gt;asynchronously&lt;/em&gt; over time.&lt;/p&gt;
&lt;p&gt;After two to four weeks everything seemed to be back at what we would call normal operation. Everyone was back on track and we were making progress towards our goals.&lt;/p&gt;
&lt;p&gt;While it is obvious to us that the current situation is pretty special, we realized that it might be a good time to reassess how we work and what defines img.ly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How can we use the current situation to come out stronger when it’s over?&lt;/strong&gt;&lt;br&gt;
Somehow it bothered us how everyone talked about &lt;em&gt;things getting back to normal&lt;/em&gt;. Obviously, we want our social contacts back, go to restaurants, bars and meet with friends, but what about day-to-day work? Was it better before? Or maybe, does it feel better now?&lt;/p&gt;
&lt;h2 id=&quot;work-when-you-work-best&quot;&gt;Work when you work best&lt;/h2&gt;
&lt;p&gt;Before to this new situation, we always had flexible working hours and relied on everyone making their own decision &lt;em&gt;when&lt;/em&gt; to work best. While everyone started at different times during the day, we all came to the office eventually. Working from home was possible but only used as an exception when needed.&lt;/p&gt;
&lt;p&gt;The reason was simple: we preferred brief, sometimes spontaneous communication between teams and team members in the office during the day, which made us feel quick in our decision making. Over the years, with a growing team and office space, we sat together to discuss what “our” version of a good working environment was, eventually realizing that there is no one-size-fits-all solution, as everyone has their own needs. That’s why we always thought about different areas in the office that are built to amplify either trivial or deep work. The “virtual office” has similar requirements: We introduced Slack statuses like “Focus work” or “Out for a break” to communicate that they will be getting back later to other teammates if they have any questions. Eventually, everyone seemed to have more control over their own time while being productive, and some are being more productive than before.&lt;/p&gt;
&lt;h2 id=&quot;work-where-you-work-best&quot;&gt;Work where you work best&lt;/h2&gt;
&lt;p&gt;As said, some tensions came up. People were missing real-life contacts, and it seemed that communication between teams could be improved. While the first problem remains a challenge, the latter one got our attention quickly. Before jumping to conclusions, we asked ourselves if this was a new problem, only to realize that it had been there before, just mitigated by the daily run-ins in the office. This resulted in people feeling informed but eventually missing some important details. However, these occasional run-ins  in the office didn’t happen anymore, and as such, details would now easily get lost.&lt;/p&gt;
&lt;p&gt;Best practice would be to write down all information, record a video, or use other media that can be accessed asynchronously at any time by all team members. However, most saw this as a chore from the management, and as such, it was easily neglected or simply forgotten. Even if the information was written down, it just landed somewhere in our GoogleDrive, Asana, Jira, or some other tool. Principally available for everyone but found and looked at only by some.&lt;/p&gt;
&lt;p&gt;But now everyone needs this information as nobody has the occasional run-ins anymore, which creates a general urge to get more information. Instead of lengthy transcripts, people started sharing their results in Slack-channels and updating their daily to-dos in detail. Most importantly, it created awareness and partially converted a chore into something meaningful to the benefit of everyone. However, it is still far from perfect and we will continue to work on that.&lt;/p&gt;
&lt;h2 id=&quot;making-a-temporary-state-a-permanent-solution&quot;&gt;Making a temporary state a permanent solution&lt;/h2&gt;
&lt;p&gt;The taste of increased flexibility in your life and productivity at work leads us to consider making our temporary state a permanent solution.&lt;/p&gt;
&lt;p&gt;There are obvious strategic advantages for a tech company: The talent pool increases with a radically increased search radius. Also, we need less office space, a huge pain point we had recently.&lt;/p&gt;
&lt;p&gt;Still, there is a yin to the yang, and nothing comes on a silver platter. We now have to filter our talent pool for people that bring the right mindset in terms of expertise, structure, and seniority for remote work. Believe it or not, there are not so many left when applying such filters.&lt;/p&gt;
&lt;p&gt;We have to heavily invest in bringing our people together on a very regular basis because we are still a people business, and in-person interactions were key to our company’s success. We know about the perks of being an office-first company. According to &lt;a href=&quot;https://klinger.io/&quot;&gt;Andreas Klinger&lt;/a&gt;, “Head of Remote” at AngelList, remote work is great for iterations, while in-person meetings foster innovation. We can see that. It’s all solvable with the right process and mindset, but it’s important to be diligent about this.&lt;/p&gt;
&lt;p&gt;Thankfully, this topic has already been extensively covered with conferences, articles, and pioneer companies such as GitLab, Basecamp, and PSPDFKit. I can always recommend them as a reference when you start thinking about becoming a remote company. Of course, it’s easier when you’re a remote company from day one – nevertheless, we are convinced that this change is an opportunity for us to grow and thrive. So in the end, we made the best of the pandemic.&lt;/p&gt;</content:encoded><dc:creator>Daniel</dc:creator><dc:creator>Eray</dc:creator><media:content url="https://blog.img.ly/2020/06/DSC01546.jpg" medium="image"/><category>Company</category></item><item><title>An honest job description – img.ly is hiring a Senior Software Engineer</title><link>https://img.ly/blog/an-honest-job-description-img-ly-is-hiring-a-senior-software-engineer/</link><guid isPermaLink="true">https://img.ly/blog/an-honest-job-description-img-ly-is-hiring-a-senior-software-engineer/</guid><description>We are looking for a Senior Software Engineer to join us in building and shaping web-based User Interfaces of our products. We are setting up the foundation for a new graphic design tool to challenge the status quo that eases the creation of smashing design and collaboration with fellow creators.</description><pubDate>Tue, 19 May 2020 12:14:42 GMT</pubDate><content:encoded>&lt;p&gt;We are looking for a &lt;strong&gt;&lt;a href=&quot;https://img.ly/blog/titles-for-software-engineers-at-img-ly/&quot;&gt;Senior Software Engineer&lt;/a&gt;&lt;/strong&gt; to join us in building and shaping web-based &lt;strong&gt;User Interfaces&lt;/strong&gt; of our existing and novel products. We are setting up the foundation for a new graphic design tool to &lt;a href=&quot;https://img.ly/blog/on-the-democratization-of-design-ce731e9374f0/&quot;&gt;challenge the status quo&lt;/a&gt; that eases the creation of smashing design and collaboration with fellow creators.&lt;/p&gt;
&lt;h2 id=&quot;the-job-to-be-done&quot;&gt;The Job to be done&lt;/h2&gt;
&lt;p&gt;You will be joining our interdisciplinary team of software engineers and designers and work together with us on our vision to build the &lt;a href=&quot;https://img.ly/blog/building-the-creative-engine-of-the-world/&quot;&gt;creative engine of the digital world&lt;/a&gt;. You will mainly focus on further developing our &lt;strong&gt;Web Application Frontend&lt;/strong&gt; of our Photo- and Creative-Editing applications, but also be involved in adjacent engineering tasks and problems. Your job will be to work closely with the rendering/backend team as well as the design team to bring reliable and robust, as well as clean and vivid interfaces to life and help sustain and shape the experience of our User Interfaces.&lt;/p&gt;
&lt;p&gt;This position is hands-on &lt;strong&gt;ReactJS&lt;/strong&gt; based UI development ranging from developing reusable components for regular user interfaces as well as on canvas controls for the image-, text-, and design-element manipulation and editing. Also, it includes working with people from multiple fields, brainstorming, and prototyping potential solutions to yet unknown but interesting problems.&lt;/p&gt;
&lt;p&gt;The job will require some agility from your side and depending on the current priority you will need to switch between the following working modes: In production your focus should always be on stability, robustness, maintainability, performance, and most importantly good architecture. When prototyping we need fast roundtrips, sensible shortcuts to create proof of concepts and constructive discussions across various stakeholders.&lt;/p&gt;
&lt;p&gt;You can expect to work with a team of experts in various fields ranging from rendering to framework building in various programming languages such as C++, JavaScript, Objective-C, Swift, Kotlin, and, for sure &lt;strong&gt;TypeScript&lt;/strong&gt;. Your close teammates are tech enthusiasts with experience in not one but many fields who already have 5 years experience in bringing a successful software development kit to the market and sustain it, and are now working on a new even bigger endeavor.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Here is a list of tasks we have been working on in the team lately.&lt;/strong&gt; Note, we didn’t work on them all at once and so we don’t expect you to.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Redesigning and implementing our PhotoEditorSDK UI with multiple layouts and extension points, theming and i18n support, and much more.&lt;/li&gt;
&lt;li&gt;Conceptualizing and building a new cross-platform creative/graphics rendering engine written in C++ and compiled to WebAssembly.&lt;/li&gt;
&lt;li&gt;Building the basis for the User Interface of our new products that use the said engine.&lt;/li&gt;
&lt;li&gt;Setting up the whole development environment including rollup and the integration with the WebAssembly backend.&lt;/li&gt;
&lt;li&gt;Creating UI components and the design system to ease the development of the User Interface.&lt;/li&gt;
&lt;li&gt;Implementing the crop mode and various other image editing UI elements and wiring those to the engine.&lt;/li&gt;
&lt;li&gt;Prototyping a concept for dynamic inspector and on-canvas controls (our Gizmos).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;what-you-bring-to-the-table&quot;&gt;What you bring to the Table&lt;/h2&gt;
&lt;p&gt;We are looking for a candidate who has experience in building web applications, preferably with ReactJS but not necessarily. You should like to be challenged regularly. As your work will touch many areas of our products we hand over a lot of responsibilities to you. We don’t expect you to know everything from the get-go, just openness, and willingness to grow with the team. For this job it’s a plus to have a feeling for good usability and visual design, while you have expert designers helping you, it’s always a plus to be able to design a few things yourself.&lt;/p&gt;
&lt;p&gt;At img.ly we like to be able to work autonomously on our tasks and so should you. We keep in touch whenever necessary and everyone is available whenever input is necessary.&lt;/p&gt;
&lt;p&gt;We are all generalists, life-long learners, and tech enthusiasts who love what they do. We think and plan before we act while getting things done when needed. We believe that &lt;em&gt;done is better than perfect&lt;/em&gt; and iterate after we understand the problem. We all feel responsibility and ownership for what we do, we never let someone down, and we support each other.&lt;/p&gt;
&lt;p&gt;We want a candidate that recognizes themself in this description. We have built a team from diverse backgrounds and experiences and see the benefit of that. We don’t beat around the bush and also expect you to be direct and fair.&lt;/p&gt;
&lt;p&gt;Long term relationships are important to us, and as such we always look out for each other, we don’t believe in constant crunch modes but in a healthy equilibrium between work and life and enough regeneration times. We believe in work-life blending and as such, we work with people we respect and like and also like to spend quality time with.&lt;/p&gt;
&lt;p&gt;We generally don’t believe that certificates like CS degrees are what matters most. We care about what you do and how you do it. Building real stuff counts a lot more for us.&lt;/p&gt;
&lt;p&gt;We have an &lt;em&gt;office in Bochum, Germany&lt;/em&gt;, but we have always worked from where it’s best for us. We are currently migrating to a &lt;strong&gt;remote-first&lt;/strong&gt; company while still keeping our offices in Bochum, Germany. The caveat is that you must be a good communicator, and as such comfortable with effective writing and on-demand video calls with the team. While you can be anywhere you want, we require you to overlap at least 4 hours with a workday in Germany.&lt;/p&gt;
&lt;h2 id=&quot;benefits-and-pay&quot;&gt;Benefits and Pay&lt;/h2&gt;
&lt;p&gt;As we like to swap ideas on a daily basis and like to get to know our teammates better, we occasionally meet once or twice a year with everyone at a location to hang out for a week. We visit meetups and conferences and have remote workshops to different topics on a per interest basis. Our goto hardware is a MacBook and whatever everyone feels is necessary for themself.&lt;/p&gt;
&lt;p&gt;We work from where we work best and so should you, whether it’s our office in Bochum or your favorite coffee shop next to your home. We value transparency and as such all our numbers are open to everyone in the company. So, last but not least, the salary for this role ranges from 50.000 € to 65.000 € depending on your experience.&lt;/p&gt;
&lt;h2 id=&quot;how-to-apply&quot;&gt;How to Apply&lt;/h2&gt;
&lt;p&gt;We want to integrate people into our team that are as dedicated as we are. That doesn’t mean that we need a novel as a cover letter. A polished CV or your LinkedIn profile can be a safe bet.  But, we are far more interested in the projects you’ve been working on, some code, or anything that you want to show us. Rise above the noise. Surprise us.&lt;/p&gt;
&lt;p&gt;Our process then is plain and simple. You’ll have an initial chat with us over a cup of coffee to introduce ourselves to each other. Next up is a more sophisticated interview with colleagues from our team about all the technical questions that prey on your mind. In the last step, we set our whole team on meeting you. That means, you’ll have a trial project where you have the chance to get to know our team and our work better, and in turn, we want to see if you fit our motley bunch of people. If everything comes together, we are happy to welcome you to our pack!&lt;/p&gt;
&lt;p&gt;If you’re interested, drop us a line to &lt;a href=&quot;mailto:jobs@img.ly?subject=Application%20for%20Senior%20Software%20Engineer&quot;&gt;jobs@img.ly&lt;/a&gt;&lt;/p&gt;</content:encoded><dc:creator>Daniel</dc:creator><media:content url="https://blog.img.ly/2020/05/simon-abrams-k_T9Zj3SE8k-unsplash-1.jpg" medium="image"/><category>Company</category></item><item><title>Titles for Software Engineers at img.ly</title><link>https://img.ly/blog/titles-for-software-engineers-at-img-ly/</link><guid isPermaLink="true">https://img.ly/blog/titles-for-software-engineers-at-img-ly/</guid><description>At img.ly, we have simple criteria for our internal titles for a certain job. For each job, we define different stages from beginner to lead roles. We are aware that not everyone will fit each and every requirement for a stage, however, this guide should help in understanding our work. </description><pubDate>Mon, 18 May 2020 06:39:58 GMT</pubDate><content:encoded>&lt;p&gt;At &lt;a href=&quot;https://img.ly/&quot;&gt;IMG.LY&lt;/a&gt;, we have simple criteria for our internal titles for a certain job. For each job, we define different stages from beginner to lead roles.&lt;br&gt;
We are aware that not everyone will fit each and every requirement for a stage, however, this guide should help in understanding our work. Our mentality is hands-on and we believe that theory without building something only gets you so far. We iterate, refactor, and rebuild whenever necessary without losing focus of our bigger goal: “Building great products for us and our customers”.&lt;/p&gt;
&lt;h3 id=&quot;junior-software-engineer&quot;&gt;Junior Software Engineer&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Needs supervision and back and forth review before finishing a feature/task.&lt;/li&gt;
&lt;li&gt;Works on tightly scoped and straight forward features.&lt;/li&gt;
&lt;li&gt;Has a basic understanding of architectural patterns.&lt;/li&gt;
&lt;li&gt;Uses basic features of programming languages but advanced features have still to be mastered.&lt;/li&gt;
&lt;li&gt;Has usually less than two years of experience in professional software development.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;software-engineer&quot;&gt;Software Engineer&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Can work alone on a feature but needs occasional review loopback cycles from a senior.&lt;/li&gt;
&lt;li&gt;Can apply common architectural patterns in new environments.&lt;/li&gt;
&lt;li&gt;Works mostly on clearly defined features.&lt;/li&gt;
&lt;li&gt;Feels responsible for software quality and helps maintain high standards.&lt;/li&gt;
&lt;li&gt;Has usually between 2 to 4 years of experience in professional software development.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;senior-software-engineer&quot;&gt;Senior Software Engineer&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Can provide helpful and informative feedback to other Team members.&lt;/li&gt;
&lt;li&gt;Can work on vaguely defined features and helps to refine those features with fellow designers and engineers.&lt;/li&gt;
&lt;li&gt;Can work in complete autonomy as a sole engineer if necessary on a feature from ideation, over definition to full implementation with the help of a designer, and no further input.&lt;/li&gt;
&lt;li&gt;Has a deep expertise in at least a minimum of one programming environment.&lt;/li&gt;
&lt;li&gt;Has an understanding of architectural patterns and can apply them on a per need basis.&lt;/li&gt;
&lt;li&gt;Feels responsible for software, design, and product quality alike and enforces high standards.&lt;/li&gt;
&lt;li&gt;Has usually between 4 to 8 years of experience in professional software development.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;lead-software-engineer&quot;&gt;Lead Software Engineer&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Can work completely independently and autonomously with no need of any kind of supervision.&lt;/li&gt;
&lt;li&gt;Helps and supports fellow software engineers to get to work.&lt;/li&gt;
&lt;li&gt;Can work on a large chunk of features or complete software application without any kind of supervision.&lt;/li&gt;
&lt;li&gt;Is capable of executing projects across multiple domains.&lt;/li&gt;
&lt;li&gt;Can manage a team of engineers.&lt;/li&gt;
&lt;li&gt;Helps set new standards and introduce new technologies at img.ly.&lt;/li&gt;
&lt;li&gt;Has deep knowledge and experience in multiple programming environments.&lt;/li&gt;
&lt;li&gt;Has usually between 8 to 12 years of experience in professional software development.&lt;/li&gt;
&lt;li&gt;Is an evangelist of his and IMG.LY’s work.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;chief-software-engineer&quot;&gt;Chief Software Engineer&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Is able to set the direction of the entire department, software and product-wise.&lt;/li&gt;
&lt;li&gt;Has always a good oversight of cutting-edge technologies and knows when to introduce them beneficially.&lt;/li&gt;
&lt;li&gt;Can manage multiple teams of engineers.&lt;/li&gt;
&lt;li&gt;Can design, concept, build, and maintain novel software while maintaining and enforcing our standards.&lt;/li&gt;
&lt;li&gt;Has usually plus 8 years of experience in professional software development.&lt;/li&gt;
&lt;li&gt;Is an evangelist of his and img.ly’s work and shares knowledge at conferences, meetups, social media, and so forth.&lt;/li&gt;
&lt;/ul&gt;</content:encoded><dc:creator>Daniel</dc:creator></item><item><title>Building the Creative Engine of the Digital World</title><link>https://img.ly/blog/building-the-creative-engine-of-the-world/</link><guid isPermaLink="true">https://img.ly/blog/building-the-creative-engine-of-the-world/</guid><description>With UBQ we are creating a platform for creative editing. We double down on our core belief that design can benefit a lot from technological advancements.</description><pubDate>Wed, 22 Apr 2020 12:42:48 GMT</pubDate><content:encoded>&lt;p&gt;Since releasing our first &lt;a href=&quot;https://img.ly/products/photo-sdk/&quot;&gt;Software Development Kit (&lt;strong&gt;SDK&lt;/strong&gt;) for photo editing&lt;/a&gt; in 2015, it quickly found its way into the hands of thousands of application developers. The demand allowed us to ramp up our efforts to expand our SDK to cover more platforms, add features and launch &lt;a href=&quot;https://img.ly/products/video-sdk/&quot;&gt;VideoEditor SDK&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;At the same time, two very important things happened to us.&lt;/p&gt;
&lt;p&gt;First of all, we got experienced in building rendering engines, while learning in-depth about the requirements of processing photos for professional and semi-professional use-cases, on every platform. Our team leveled up big time, to a degree where we are confident there aren’t many teams with such a domain-specific expertise.&lt;/p&gt;
&lt;p&gt;Secondly, we gained critical insights into the visual creation process across many different industries, ranging from print services, social networks to marketing tools. In these processes, photo editing is only one part of the creative flow. There are topics like layouting, animation, generative design and many more, which go beyond the mere editing of an image, but are still essential to the business case.&lt;/p&gt;
&lt;p&gt;Our vision is to fill the obvious gap, providing a holistic solution that allows users to map entire creative flows into a tool. By leveraging our technology our customers will become a lot faster and more competitive in their markets.&lt;/p&gt;
&lt;p&gt;Six months ago, we decided to build the foundation for this vision and kicked off the development of &lt;strong&gt;UBQ,&lt;/strong&gt; an engine empowering a new generation of tools for creativity.&lt;/p&gt;
&lt;p&gt;It’s time to shed some light on our &lt;strong&gt;creative engine&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;what-is-a-creative-engine&quot;&gt;What is a Creative Engine?&lt;/h2&gt;
&lt;p&gt;Before we go forward, let’s establish what we mean by a &lt;strong&gt;creative engine&lt;/strong&gt;. In general, an engine is a platform that allows developers to create tools that support creators to perform specific tasks such as editing photos, creating visual appealing posters, or social media posts. From our perspective, a creative engine will ease the development of design tools for various niches and as such it must be easily adaptable for different usage and user requirements.&lt;/p&gt;
&lt;p&gt;To ensure that we don’t have to reinvent the wheel for each creative tool, a creative engine provides building blocks especially targeted to creative output. Some examples for these are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;High-quality image adjustment, editing, filtering, and manipulation.&lt;/li&gt;
&lt;li&gt;Automated layouting of design elements on a canvas.&lt;/li&gt;
&lt;li&gt;High-quality text rendering and layout algorithms.&lt;/li&gt;
&lt;li&gt;Support for various industry-standard assets, image, and video formats.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;However, these are only some of the basic features – there are far more advanced things that a creative engine can provide.&lt;/p&gt;
&lt;p&gt;On the one hand, this may include scripting tools to ease the generation of generative art or automation for tedious design tasks via automated image segmentation.&lt;/p&gt;
&lt;p&gt;On the other hand, there are also tools that not only help the individual creator but ease the cooperation and collaboration between multiple creators and editors. The details may vary, but it can be as simple as defining formats to exchange assets and designs between creators or even allow the simultaneous editing of their creation.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;introducing-the-ubq-creative-engine&quot;&gt;Introducing the UBQ Creative Engine&lt;/h2&gt;
&lt;p&gt;With &lt;strong&gt;UBQ&lt;/strong&gt; we strive to lay the groundwork for modern visual and communication design.&lt;/p&gt;
&lt;p&gt;Believing that these days, a good design tool has to be there for you every step of the way – it has to be &lt;strong&gt;ub&lt;/strong&gt;i&lt;strong&gt;q&lt;/strong&gt;uitous**.** Let us explain what this means for us.&lt;/p&gt;
&lt;h3 id=&quot;usable-on-any-platform&quot;&gt;Usable on any Platform&lt;/h3&gt;
&lt;p&gt;In this sense, we want it to be easily accessible to everyone, and as such the &lt;strong&gt;UBQ&lt;/strong&gt; stands for its availability across multiple platforms. It is conceptionally &lt;strong&gt;web-&lt;/strong&gt; and &lt;strong&gt;mobile-first&lt;/strong&gt; but is also available for classic operating systems such as macOS, Linux, and Windows, while being easily portable across &lt;strong&gt;various platforms&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;unified-rendering-generative-and-inference-engine&quot;&gt;Unified Rendering, Generative, and Inference Engine&lt;/h3&gt;
&lt;p&gt;While our previous products focused on processing a single image or video, our scope is greatly extended with &lt;strong&gt;UBQ&lt;/strong&gt;. Besides being able to process multiple images, with effects such as filters, adjustments, and so forth, in &lt;strong&gt;UBQ&lt;/strong&gt; we generalized images to a concept we call &lt;strong&gt;Design Blocks&lt;/strong&gt;. As such, static images are not the only source of data. It can be anything, even code that generates the visual input. In turn allowing that generative patterns and complex generative art is processed directly in the engine.&lt;/p&gt;
&lt;p&gt;We put a lot of work in the last years into modern tools for automation to help creators get rid of time-consuming tasks such as image segmentation, color adjustments, and many others. Our foundation for this stems from modern machine learning and neural network advancements. As such &lt;strong&gt;UBQ&lt;/strong&gt; supports executing neural networks and inferring information. Thus basically allowing any neural network to be part of a design generalized in what we call &lt;strong&gt;Compute Blocks*&lt;/strong&gt;.*&lt;/p&gt;
&lt;h3 id=&quot;collaboration--interact-in-realtime-with-other-creators&quot;&gt;Collaboration – Interact in Realtime with other Creators&lt;/h3&gt;
&lt;p&gt;The cooperation and collaboration between multiple creators are dear to our hearts. Therefore, we believe that creation is not only the effort of an individual but of many.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UBQ&lt;/strong&gt; will enable multiple &lt;strong&gt;creators&lt;/strong&gt; to &lt;strong&gt;work together&lt;/strong&gt;. Thus, allowing a design team to work together, share thoughts and assets instantly. Consequently, this constributes in accelerating their workflows and enriching their creative process.&lt;/p&gt;
&lt;p&gt;All that is reinforced due to the &lt;strong&gt;multiplayer&lt;/strong&gt; approach to design as well as &lt;strong&gt;reusable design elements&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Creators shall be enabled to work together &lt;strong&gt;locally as well as&lt;/strong&gt; &lt;strong&gt;remotely&lt;/strong&gt; and &lt;strong&gt;interact on the same design at the same time&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;cooperation--ease-exchange-of-designs-with-your-peers&quot;&gt;Cooperation – Ease Exchange of Designs with your Peers&lt;/h3&gt;
&lt;p&gt;Besides the collaborative aspect, &lt;strong&gt;UBQ&lt;/strong&gt; is built around the interaction of creators and non-designers – which we refer to as editors.&lt;/p&gt;
&lt;p&gt;Editors will be enabled to take existing designs and adapt it to their needs, by either just giving instant feedback to the creators, changing color palettes to fit the needs of their corporate design guidelines or changing images and text passages to make a design appealing to their audience.&lt;/p&gt;
&lt;h3 id=&quot;design-blocks--smart-and-reusable-design-element&quot;&gt;Design Blocks – Smart and Reusable Design Element&lt;/h3&gt;
&lt;p&gt;Another important design decision is the ability to exchange and reuse design elements between several projects. Therefore, &lt;strong&gt;UBQ&lt;/strong&gt;s foundation is built around the concept of &lt;strong&gt;smart design elements&lt;/strong&gt; that we call &lt;strong&gt;blocks&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Blocks&lt;/strong&gt; are reusable design elements that encapsulate complex and tedious design tasks.&lt;/p&gt;
&lt;p&gt;They currently come in two flavors, &lt;strong&gt;Design and Compute Blocks&lt;/strong&gt; ranging from simple predefined image adjustments settings to automated image segmentation as well as predefined adaptable design elements.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;A Design Block example showcasing automatic adaptable text layouts.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 5313px) 5313px, 100vw&quot; data-astro-image=&quot;constrained&quot; data-astro-image-pos=&quot;center&quot; width=&quot;5313&quot; height=&quot;3230&quot; src=&quot;https://img.ly/_astro/2004_img.ly_Engine_Blogpost_Visual_Designblock--1-_Z1bm8Xz.webp&quot; srcset=&quot;/_astro/2004_img.ly_Engine_Blogpost_Visual_Designblock--1-_2vz9rw.webp 640w, /_astro/2004_img.ly_Engine_Blogpost_Visual_Designblock--1-_1yLjN5.webp 750w, /_astro/2004_img.ly_Engine_Blogpost_Visual_Designblock--1-_1Ph6gR.webp 828w, /_astro/2004_img.ly_Engine_Blogpost_Visual_Designblock--1-_ZHWM9r.webp 1080w, /_astro/2004_img.ly_Engine_Blogpost_Visual_Designblock--1-_ZIwRrj.webp 1280w, /_astro/2004_img.ly_Engine_Blogpost_Visual_Designblock--1-_ZNRVRT.webp 1668w, /_astro/2004_img.ly_Engine_Blogpost_Visual_Designblock--1-_1YYsBS.webp 2048w, /_astro/2004_img.ly_Engine_Blogpost_Visual_Designblock--1-_Ze5EA7.webp 2560w, /_astro/2004_img.ly_Engine_Blogpost_Visual_Designblock--1-_Z1bm8Xz.webp 5313w&quot;&gt;&lt;/p&gt;
&lt;p&gt;From our point of view, creators should not have to spend their time with the recreation of preexisting designs. They should not have to watch tutorials just to get to the same output as someone else before. In &lt;strong&gt;UBQ&lt;/strong&gt;, these design blocks are the core foundation for building adaptable and interchangeable designs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Design blocks&lt;/strong&gt; respond to the available space, adapting their content accordingly and may include complex logical rules or just a combination of assets. &lt;strong&gt;UBQ&lt;/strong&gt; has all batteries included, providing a rich library of predefined blocks. By design, blocks can easily be built from a combination of other blocks or by using a scripting language similar to processing or p5.js to allow even generative and parametric design.&lt;/p&gt;
&lt;h3 id=&quot;final-words&quot;&gt;Final Words&lt;/h3&gt;
&lt;p&gt;As of April 2020, we are working on the &lt;strong&gt;UBQ&lt;/strong&gt; creative engine for almost half a year now incorporating knowledge from 5+ years developing our SDKs.&lt;/p&gt;
&lt;p&gt;We believe we can make an impact on how designs and design-tools are created, adapted and distributed. We are interested in your feedback and open to discussions, also we are looking for people who want to get involved as team members, early adopters or just want to play with it. Expect some demos during the end of summer showcasing what the &lt;strong&gt;UBQ&lt;/strong&gt; engine is capable of.&lt;/p&gt;
&lt;p&gt;Soon, we will get back to you with more exciting news.&lt;/p&gt;
&lt;p&gt;Stay tuned!&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;were-hiring&quot;&gt;We’re hiring!&lt;/h3&gt;
&lt;p&gt;Oh, and by the way, we’re hiring a Senior Frontend Developer at img.ly to reinforce our team and help shaping the frontend of our new design tool. Check out the job &lt;a href=&quot;https://img.ly/company/careers#job-openings&quot;&gt;here&lt;/a&gt; and drop us a line, if you are interested.&lt;/p&gt;</content:encoded><dc:creator>Daniel</dc:creator><dc:creator>Eray</dc:creator><media:content url="https://blog.img.ly/2020/04/2004_img.ly_Engine_Blogpost_Visual_Header--1-.png" medium="image"/><category>Design</category><category>Tech</category><category>Software Development</category><category>SaaS</category><category>How-To</category><category>Company</category></item><item><title>On the Democratization of Design</title><link>https://img.ly/blog/on-the-democratization-of-design-ce731e9374f0/</link><guid isPermaLink="true">https://img.ly/blog/on-the-democratization-of-design-ce731e9374f0/</guid><description>Creating appealing designs remains hard for most of us, and there are many reasons for that. </description><pubDate>Mon, 24 Jun 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Over the last century we have experienced the democratization of various domains of our lives:&lt;/p&gt;
&lt;p&gt;Key drivers have been technological advancements and lower barriers to leveraging those technologies. In turn, technology became more accessible to more people resulting in products, services, and tools that improve our lives every day.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Computers are a bicycle for the mind” — Steve Jobs&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Tools, such as computers, allow us to finish more tasks in a shorter amount of time and with fewer resources. Even more importantly, said tools also rid us from boring and repetitive work, thus enabling us to shift our attention to exciting and more creative tasks, paving the way for us to experiment and create rather than repeat.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;evolve-design-with-bettertools&quot;&gt;Evolve Design with better Tools&lt;/h2&gt;
&lt;p&gt;Proper visual design attracts, engages, and persuades; it helps convey stories and facilitates communication.&lt;/p&gt;
&lt;p&gt;Nowadays, design in all its facets like advertising, social stories, product presentations, or merchandise is omnipresent in our daily lives. As there is no arguing that appealing and beautiful design has an impact on us and our surrounding, consequently there is also a growing demand for good design and easy-to-use tools.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Use a picture. It’s worth a thousand words!” — Arthur Brisbamne&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Although the importance of design is unquestioned, creating appealing designs remains hard for most of us, and there are many reasons for that.&lt;/p&gt;
&lt;p&gt;First of all, design tools are still challenging to master, and while they empower professional designers to create stunning assets, they remain a closed book for most people.&lt;/p&gt;
&lt;p&gt;Secondly, even if we leave most of the creational part to professionals, the average user is still unable to use existing designs as a basis to create new assets or refine and update small details. Even for the slightest changes, one has to get familiar with the inner workings of sophisticated design tools.&lt;/p&gt;
&lt;p&gt;Also, when it comes to collaboration, the process with most tools is far from frictionless, to put it mildly. Still, most designs get shared as Photoshop, Sketch, or PowerPoint files, and there is no tool or platform that grants unhindered access for multiple stakeholders with varying degrees of experience with design solutions.&lt;/p&gt;
&lt;p&gt;As today’s design processes regularly involve multiple stakeholders like designers, marketers, copywriters, or product engineers, one has to acknowledge that prevalent design solutions simply lack features and workflows that reflect daily routines.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;make-design-accessible-through-technology&quot;&gt;Make Design Accessible through Technology&lt;/h2&gt;
&lt;p&gt;As we pointed out, the overall access to good visual design is still very limited, but with the growing need for compelling creatives in virtually every aspect of the digital and non-digital realm this shouldn’t be and it doesn’t have to. We believe in the democratization of design.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Better tools enable the democratization of design!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We believe that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We need to overhaul design processes and methods to cope with the ever growing design needs and the ever-rising number of stakeholders.&lt;/li&gt;
&lt;li&gt;Achieving elegant design must be made simple.&lt;/li&gt;
&lt;li&gt;Design can be made accessible through technology.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The question remains: How do we achieve that?&lt;/p&gt;
&lt;p&gt;We came to the conclusion that there are four key elements design tools should have that will make design more accessible:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Collaboration,&lt;/li&gt;
&lt;li&gt;building blocks of intelligent design components,&lt;/li&gt;
&lt;li&gt;automation of tedious design tasks, and&lt;/li&gt;
&lt;li&gt;bringing together Editing, Compositing, and Layouting.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Collaboration&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We hold as an opinion that design tools have to facilitate the collaboration between professionals and non-professionals, thus allowing an effective and frictionless design creation and adaption process. This includes direct collaboration on a design as well as the exchange of whole design templates, design components, and presets.&lt;/p&gt;
&lt;p&gt;While some solutions already offer templates for content creation, we think that design components as a more modular approach are going to be a necessity to simplify the creation of new complex assets for everyone.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Building Blocks of Intelligent Design Components&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If Lego™ taught us anything, then it is that creativity can flow when you base your work on a solid foundation.&lt;/p&gt;
&lt;p&gt;That said, one has to admit that while the basic elements of design such as text, shapes, or images can be creatively combined in millions of ways to create stunning designs, they also can be used in a trillion ways to create underwhelming output.&lt;/p&gt;
&lt;p&gt;Similar to modern UI design, complex building blocks will play a central role in the visual design process, allowing creators to be more efficient by removing repetitive tasks from the workflow and also allowing average users to create and adopt complex designs quickly. Intelligent design components will shift the focus to the composition by guiding the user in carefully chosen constraints.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Automation of Tedious Design Tasks&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Speaking of intelligent building blocks, we believe that said blocks must not be static but adaptive to fit into an effective and frictionless design process. That may include the automation of certain design tasks like text layout or even abstracting away the complexity of image editing.&lt;/p&gt;
&lt;p&gt;We envision that with the help of technology and specifically artificial intelligence, recurring and taunting tasks like for example, the separation of a picture into fore- and background can become totally interaction- and hassle-free. Even automatically choosing the right adjustments based on the image content will be possible.&lt;/p&gt;
&lt;p&gt;Altogether, intelligent design components are a necessity and will be the next step in design automation, fostering a flexible and fail-safe adaption and creation process and thus ensuring that even without professional knowledge designs will be created faster and look better.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bringing together Editing, Composition, and Layouting&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Photo editing and layouting are both central to the design process. That is why, in a holistic approach, combining both will yield exciting new possibilities, improved visual consistency, and a reduced amount of friction while going back and forth between layout and photo editing.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;closing-words&quot;&gt;Closing words&lt;/h2&gt;
&lt;p&gt;To sum it up: To democratize design, we need intelligent design tools and ecosystems that allow for the cooperation between all stakeholders, as well as a community that is open to share and learn from one another by building and sharing reusable and intelligent design components.&lt;/p&gt;</content:encoded><dc:creator>Daniel</dc:creator><media:content url="https://blog.img.ly/downloaded_images/On-the-Democratization-of-Design/1-UUXCltgfNnl3pabjCsjjGg.jpeg" medium="image"/><category>Creativity</category><category>Design</category><category>Image Processing</category><category>Photoshop</category><category>Photo Editing</category><category>Insights</category></item><item><title>Rebuild or Report?</title><link>https://img.ly/blog/rebuild-or-report-211d6ac6e787/</link><guid isPermaLink="true">https://img.ly/blog/rebuild-or-report-211d6ac6e787/</guid><description>On helping yourself and others through precise Bug Reports </description><pubDate>Thu, 26 Apr 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Nowadays, every code project depends on various third party and additional libraries. Truth be told, we wouldn’t be able to create apps or webpages that fast if we would have to build everything from scratch. Typically, we add a library via our favored package manager and give it a go. We start using that specific library, read the docs, figure out how it works and use it for our purposes. Best case, that’s it. Unfortunately, in practice, it may turn out differently.&lt;/p&gt;
&lt;h2 id=&quot;make-no-mistake-mistakeshappen&quot;&gt;&lt;strong&gt;Make no Mistake, Mistakes happen&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;While we work with a specific library, we may encounter some roadblocks. Sometimes that’s due to missing or bad documentation. Or it might be due to our missing knowledge about some things. Anyway, sometimes, we eventually realize that it is not us, it was them all along. We found a mistake, a so-called bug.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A (software) bug is an error, flaw, failure or fault in a computer program or system that causes it to produce an incorrect or unexpected result, or to behave in unintended ways.&lt;/p&gt;
&lt;p&gt;— Wikipedia&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If we’re honest, our first reaction may be that we get angry at the library itself or the author, but, after acknowledging that we never wrote flawless or bug-free code, we look for a solution.&lt;/p&gt;
&lt;h2 id=&quot;we-found-a-bug-nowwhat&quot;&gt;&lt;strong&gt;We found a Bug! Now what?&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Logically, some of us start to follow the most obvious path. We throw that library away and write a replacement ourselves…&lt;strong&gt;not&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Ok, honestly, we may think about that, but it in most cases that is neither the right nor the best way to go. Many authors put a lot of effort into creating software libraries and shared it with us. So, most undoubtedly, a lot of knowledge, work, testing and time has already gone into it.&lt;/p&gt;
&lt;p&gt;Therefore, there is a high chance that rewriting that library from scratch is the least favorable option.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;So, what should we do?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Worst case scenario: We don’t do anything and leave it be. But this way it won’t get fixed, the authors won’t be aware of it, and others will encounter the same bug and spend unnecessary time on it.&lt;/p&gt;
&lt;p&gt;Best case scenario: We track down the bug, propose a solution to the authors and hope they will acknowledge and accept it. But sometimes we don’t have the means, options or time to fix the bug. Consequently, the second best way is telling the authors about the bug you found. But wait, before we file a bug we should ask ourselves the following question&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Are we running the latest version of the library?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;writing-good-bug-reports-helps-yourself-andothers&quot;&gt;&lt;strong&gt;Writing good Bug Reports helps Yourself and Others&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;We at &lt;a href=&quot;https://img.ly/&quot;&gt;IMG.LY&lt;/a&gt; provide a software library for photo editing. Thus, we are both library authors as well as users.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I would like to say that we don’t ever make mistakes, but truth be told, everyone does.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As you can imagine, providing photo editing capabilities results in a lot of code for rendering, UI, or other business logic. Although all the usual quality checks are in place, mistakes or unthought-of use-cases manifest in bugs, no matter what.&lt;/p&gt;
&lt;p&gt;Consequently, we get bug reports. Now, unfortunately, an awful lot of said bug reports only contain a single line that literally says:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“XYZ does not work.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;While, this is far better than not reporting it at all, it doesn’t help much in hunting down the bug.&lt;/p&gt;
&lt;p&gt;With bug reports like this, we spend a lot of our time on trying to reproduce the bug or asking for details on how to reproduce it. That time would be better spent on improving the libraries or helping other users. However, with just a little help we’d be able to find bugs faster and be more effective. So, what should a proper bug report look like? From our point of view, bug reports should be comprised out of the following things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One bug at a time,&lt;/li&gt;
&lt;li&gt;the context of the bug,&lt;/li&gt;
&lt;li&gt;a minimal runnable example, and&lt;/li&gt;
&lt;li&gt;the steps to reproduce the bug.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;one-bug-at-atime&quot;&gt;&lt;strong&gt;One bug at a time&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;In reality, one may encounter multiple bugs at the same time, and might wish to drop them at the library authors all at once. However, it is far better not to combine multiple problems even if they seem to be alike. So, one should always report each bug individually.&lt;/p&gt;
&lt;h2 id=&quot;describing-thecontext&quot;&gt;&lt;strong&gt;Describing the context&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Often forgotten when reporting bugs is to describe the context the bug occurs in. For us, a good bug report contains at least the following specifications:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A description,&lt;/li&gt;
&lt;li&gt;the environment&lt;/li&gt;
&lt;li&gt;the actual and desired output, and&lt;/li&gt;
&lt;li&gt;attachments (e.g. Screenshots).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;description&quot;&gt;Description&lt;/h3&gt;
&lt;p&gt;First thing we need to know is what the bug is about. This includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A short meaningful &lt;em&gt;title&lt;/em&gt; of the bug (e.g. Exporting image after crop and rotate corrupts output), and&lt;/li&gt;
&lt;li&gt;a &lt;em&gt;description&lt;/em&gt; of the bug which explains the error in an understandable manner.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;environment&quot;&gt;Environment&lt;/h3&gt;
&lt;p&gt;Due to the nature of web and app development, software libraries can be used in many different environments. All of which have their own little differences and quirks. Thus, it is very helpful to include information about the environment, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the used &lt;em&gt;operating system’s&lt;/em&gt; version (e.g. iOS 10.1),&lt;/li&gt;
&lt;li&gt;the &lt;em&gt;device&lt;/em&gt; it is running on (e.g. iPhone 7 32GB),&lt;/li&gt;
&lt;li&gt;the &lt;em&gt;used browser or runtime environment&lt;/em&gt; and its version (e.g. Chrome 65.0.3325.181 (64-Bit) or Node.js 8.11.1 ), and not to forget&lt;/li&gt;
&lt;li&gt;the &lt;em&gt;name of the library&lt;/em&gt; and its version/variant (e.g. pesdk-html5 4.1.3).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;actual-output-and-expectedoutput&quot;&gt;Actual Output and Expected Output&lt;/h3&gt;
&lt;p&gt;Often, an experienced developer can classify the bug on the basis of the resulting error or error output only. Therefore, a useful bug report should provide:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the &lt;em&gt;actual output&lt;/em&gt; that is is observed, and&lt;/li&gt;
&lt;li&gt;the &lt;em&gt;desired output&lt;/em&gt; that should be generated&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;attachments&quot;&gt;Attachments&lt;/h3&gt;
&lt;p&gt;Additionally, attachments are very helpful to pinpoint the bug. Helpful attachments can be but are not limited to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;error output or logs&lt;/em&gt; generated by the compiler and build system, console output, and stack trace, and whenever the bug results in something that is visual recognizable, and&lt;/li&gt;
&lt;li&gt;&lt;em&gt;screenshots&lt;/em&gt; showing the issue.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;reproducibility-iskey&quot;&gt;&lt;strong&gt;&lt;em&gt;Reproducibility&lt;/em&gt;&lt;/strong&gt; &lt;strong&gt;is key&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;While all aforementioned greatly assists to narrow down the context in which the bug appears there is one thing that helps even more:&lt;/p&gt;
&lt;p&gt;Even if it seems trivial to reproduce, a good bug report should come with a &lt;em&gt;minimal runnable example&lt;/em&gt; that produces the bug in question and a description of how to trigger it.&lt;/p&gt;
&lt;h3 id=&quot;providing-a-minimal-runningexample&quot;&gt;Providing a minimal running Example&lt;/h3&gt;
&lt;p&gt;So, one should strip away everything from the current code that isn’t necessary and keep it simple. The faster we and other library maintainers can track down an error, the sooner it’s going to be fixed.&lt;/p&gt;
&lt;p&gt;Also, probably it was already necessary to narrow down the issue so stripping it out into a minimal example is not too much work. If possible, the Gist should be provided via a GitHub repository or any other similar sharing system.&lt;/p&gt;
&lt;h3 id=&quot;keep-it-simple-to-trigger-the-bug-and-be-specific-aboutit&quot;&gt;&lt;strong&gt;Keep it simple to trigger the Bug and be specific about it&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;While having a minimal example is already lovely, sometimes it needs a bit more than just code to trigger the bug. Writing down precise instructions on how to trigger it is not always easy but being specific dramatically helps to get to it.&lt;/p&gt;
&lt;p&gt;That is why one should summarize the problem in brevity and with utmost precision.&lt;/p&gt;
&lt;h2 id=&quot;conclusions&quot;&gt;Conclusions&lt;/h2&gt;
&lt;p&gt;From our point of view these are the most important things one needs to consider when reporting a bug. Most certainly, the requirements change and need to be adapted for different types of software. We’d really like your feedback on this. So, if you have any comments and additions please let us know.&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>Daniel</dc:creator><media:content url="https://blog.img.ly/2020/04/image-35.png" medium="image"/><category>Software Development</category><category>Bug Report</category><category>Support</category><category>Code</category><category>Software</category><category>Learning</category></item><item><title>Build or Buy?</title><link>https://img.ly/blog/build-or-buy-f09785ce1138/</link><guid isPermaLink="true">https://img.ly/blog/build-or-buy-f09785ce1138/</guid><description>We all know the deal; thoughts about new products bounce around in our heads and sometimes those thoughts yield ideas we want to pursue. Once that happens we start putting ourselves into action by building a prototype, ideally on the shortest path possible.</description><pubDate>Thu, 02 Nov 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;For many years, we at &lt;a href=&quot;https://img.ly&quot;&gt;IMG.LY&lt;/a&gt; and our partners at &lt;a href=&quot;https://9elements.com&quot;&gt;9elements&lt;/a&gt; have been developing various applications for customers and ourselves. Often, we had to decide whether to build everything from scratch or to consider third party components. Sounds familiar?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;As developers, makers and tinkerers we often tend to build everything ourselves.&lt;/strong&gt; It seems to be in our nature and part of who we are. Truth be told, this is the point where we often got irrational.&lt;/p&gt;
&lt;p&gt;Taking a good look at modern application development, we quickly realize that everything is getting more complex in a tremendous pace. While it was feasible to develop apps without any third party libraries back then, it has become more or less of a standard to employ third party libraries or tools that solve certain problems for us. Nowadays, there are a lot of features that are must haves and simply expected to be in your product.&lt;/p&gt;
&lt;p&gt;Thus, we are more aware than ever when it comes to the decision whether to build or buy.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;decisions&quot;&gt;&lt;strong&gt;Decisions&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Most often, our resources are not endless. With limited time, money, and labour power we always struggle to make the decision whether to build a certain component of our software ourselves or buy it from a third-party.&lt;/p&gt;
&lt;p&gt;But why do we struggle? Are we sure we can do it better than everybody else? Are we not trusting the third-party? Do we just think it is cheaper to do it ourselves? Or, do we just underestimate the amount of work that is required to build that one component?&lt;/p&gt;
&lt;p&gt;Most certainly we know that software, even a small app, can be a complex beast that is comprised out of a lot of components. Even more surely, our idea or product should stand out of the masses. So, should we really spend too much time building a component or rather focus on getting things done efficiently? How do we set the priorities?&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;priorities&quot;&gt;&lt;strong&gt;Priorities&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Probably, we want to focus on the things that set our product apart from all others, may it be a singular specific feature or a novel combination of already existing ones.&lt;/p&gt;
&lt;p&gt;Surely, most of us will never consider writing their own relational database like PostgreSQL. But, what about features such as payment, authentication or a content management system?&lt;/p&gt;
&lt;p&gt;Speaking from experience, most of us won’t even think about implementing payment themselves and eventually, we will use a popular SaaS such as &lt;a href=&quot;https://stripe.com&quot;&gt;Stripe&lt;/a&gt;. But, what about authentication? Would we build that ourselves?&lt;/p&gt;
&lt;p&gt;Thinking about all the details that you need to account for when building an authentication system, it becomes obvious that more is needed than just providing a simple registration with username and password. Depending on the software we are developing, people might expect to be able to login with their social logins via e.g. &lt;a href=&quot;https://facebook.com&quot;&gt;Facebook&lt;/a&gt; or &lt;a href=&quot;https://github.com&quot;&gt;GitHub&lt;/a&gt;. Also, we would need to provide a way to reset passwords, send emails on registration and so on. Over time, the list of requirements will grow and we will be forced to spend our precious resources on it, whether we want it or not.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So, why not just let someone else do the job for you and solve all these problems?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Don’t we trust services like &lt;a href=&quot;https://auth0.com&quot;&gt;Auth0&lt;/a&gt; to solve all these problems for us, or what is the reason we build those things ourselves? Evidently, if our product &lt;em&gt;is&lt;/em&gt; an authentication system we &lt;em&gt;should&lt;/em&gt; build it ourselves. But, let’s be honest, most of the time it is just something we &lt;em&gt;need&lt;/em&gt; for our product and nothing we care about deeply.&lt;/p&gt;
&lt;p&gt;Unfortunately, we know that everything comes at a price. In case of Auth0, the login data may not be any more in our possession. However, are we sure that it is really bad? We tell ourselves that we can protect our data in a way that no one else would have access, no data would be leaked and so on. At least, that is what we would be thinking, right? But, are we sure that we can protect the data better than the service whose one and only task is to care about exactly that? And what about backups? Do we really want to put our resources into creating and checking that our data is properly backed up and restorable in case of a server failure? Probably we won’t and in many cases it would be a good idea to let someone do the job who does it on a day to day basis. Being completely honest with ourselves, we realized that:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;By zeroing in on one specific problem, we can build better and more advanced tools than we could by trying to solve multiple problems at once.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We experienced first hand how much time and effort is required to tackle one specific problem when we needed a photo editing solution as part of one of our projects. In that particular case, we needed to go down the rabbit hole and build it ourselves. Back then, we didn’t have any other option as there was no component available that we could have used.&lt;/p&gt;
&lt;p&gt;Was it a good idea? Probably not for the project but while building the components we realized that others could benefit from our learnings. This is basically why we started building and advancing our &lt;a href=&quot;https://img.ly/products/photo-sdk&quot;&gt;PhotoEditor SDK&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Apart from the previous mentioned pros and cons about building and buying, there is also another important factor: These services cost money and most of us will look at the pricing and believe it may be too expensive. Especially, if you have to take out your credit card and start a subscription that may feel like slowly draining your bank account. Even more so if you’re a small business or startup and every additional expense poses a threat to your project as a whole. However, this is the time to really weigh your options.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Time is Money&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We always hear and rephrase the good old &lt;em&gt;time is money&lt;/em&gt; slogan. And this is true in many ways. Even if we don’t care much about the cost of our own time, we would still have to invest it to build said feature and by that might delay the whole product. Do we really want to spend that time and delay our whole product?&lt;/p&gt;
&lt;p&gt;Ok, assuming we don’t do it ourselves and we have a team of developers and parallelize our efforts, we still need to pay for it with, and let’s be honest … money.&lt;/p&gt;
&lt;p&gt;According to &lt;a href=&quot;https://www.payscale.com/research/DE/Job=Software_Developer/Salary&quot;&gt;PayScale&lt;/a&gt; the average salary of a software developer is around 45k€ in Germany. Considering that we work around 220 days per year, each day would at least cost us approximately 200€, but to be fair it will surely be more. Depending on the software component you are considering to build or the SaaS we consider to use, we most surely would get a lot more for our 200€ than what we could build in one day. And, if we are honest, 200€ are definitely not enough to develop any feature that requires more than just a few lines of code.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;final-words&quot;&gt;&lt;strong&gt;Final words&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Summing it up, we should definitely not just buy every component from a third party or subscribe to every SaaS, but we should weigh carefully in which cases we really have to build it ourselves or when buying is the better option.&lt;/p&gt;
&lt;p&gt;The whole point is that whether you buy some of your components or build everything yourself really doesn’t matter as long as it’s the smartest decision for your business. And if you automatically shy away from solutions that cost you something and decide to build it yourself no matter what, that decision might cost you a whole lot more.&lt;/p&gt;
&lt;p&gt;The good thing is, that there is a trend that third parties tend to focus on more granular problems, which allows us to make the distinct decision whether to build or buy a specific component of our application.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Thanks for reading! 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;/strong&gt;&lt;/p&gt;</content:encoded><dc:creator>Daniel</dc:creator><media:content url="https://blog.img.ly/2020/04/image-4.jpeg" medium="image"/><category>Developer Tools</category><category>Developer</category><category>Product Management</category><category>SaaS</category><category>Framework</category><category>Learning</category></item></channel></rss>