--- title: "Overview" description: "Learn about CE.SDK Renderer, the native Linux processing tool for high-performance automated image and design editing." platform: renderer url: "https://img.ly/docs/cesdk/renderer/cesdk-renderer-overview-7f3e9a/" --- > This is one page of the CE.SDK Renderer documentation. For a complete overview, see the [Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md). For all docs in one file, see [llms-full.txt](https://img.ly/docs/cesdk/renderer/llms-full.txt). **Navigation:** [Get Started](https://img.ly/docs/cesdk/renderer/get-started/overview-e18f40/) > [Overview](https://img.ly/docs/cesdk/renderer/cesdk-renderer-overview-7f3e9a/) --- ## What is CE.SDK Renderer? The **CE.SDK Renderer** brings the powerful design engine behind CreativeEditor SDK (CE.SDK) for fully automated image and design editing to your high performance Linux server environment. Whether you're enabling AI-powered design workflows, template-based creation, or dynamic content generation, CE.SDK offers the flexibility, performance, and developer control you need — all with minimal integration overhead. [Get Started](https://img.ly/docs/cesdk/renderer/get-started/commandline-4230bf/) Trusted by leading organizations worldwide, CE.SDK powers the creative editors used in best-in-class applications, including those from Shopify, Semrush, HP, Shutterfly, Ticketmaster, and Swiss Post. ## File Format Support CE.SDK supports a wide range of file types to ensure maximum flexibility for developers: ### Importing Media | Category | Supported Formats | | ------------- | -------------------------------------------------------------- | | **Images** | `.png`, `.jpeg`, `.jpg`, `.gif`, `.webp`, `.svg`, `.bmp` | | **Video** | `.mp4` (H.264/AVC, H.265/HEVC), `.mov` (H.264/AVC, H.265/HEVC) | | **Audio** | `.mp3`, `.m4a`, `.mp4` (AAC or MP3), `.mov` (AAC or MP3) | | **Animation** | `.json` (Lottie) | > **Note:** **Note that CE.SDK Renderer does not yet support WebM (`.webm`) imports.** ### Exporting Media ### Importing Templates For detailed information, see the [full file format support list](https://img.ly/docs/cesdk/renderer/file-format-support-3c4b2a/). --- ## More Resources - **[Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md)** - Browse all Renderer documentation - **[Complete Documentation](https://img.ly/docs/cesdk/renderer/llms-full.txt)** - Full documentation in one file (for LLMs) - **[Web Documentation](https://img.ly/docs/cesdk/renderer/)** - Interactive documentation with examples - **[Support](mailto:support@img.ly)** - Contact IMG.LY support --- --- title: "System Compatibility" description: "Learn how device performance and hardware limits affect CE.SDK editing, rendering, and export capabilities." platform: renderer url: "https://img.ly/docs/cesdk/renderer/compatibility-139ef9/" --- > This is one page of the CE.SDK Renderer documentation. For a complete overview, see the [Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md). For all docs in one file, see [llms-full.txt](https://img.ly/docs/cesdk/renderer/llms-full.txt). **Navigation:** [Compatibility & Security](https://img.ly/docs/cesdk/renderer/compatibility-fef719/) > [System Compatibility](https://img.ly/docs/cesdk/renderer/compatibility-139ef9/) --- ## Recommended Platform | Component | Recommended specifications | | --------------------- | ------------------------------------------------------------------------ | | Processor (CPU) | x86-64 Server CPU with SSE4.1 support | | System Memory (RAM) | 4 GiB minimum, more depending on scene complexity and output resolution | | Graphics Card (GPU) | NVIDIA GPU, optionally with H264 video codec support for further speedup | | Operating System (OS) | Ubuntu Server 24.04 LTS | A NVIDIA GPU is highly recommended for making graphics exports faster, and required for video export. NVIDIA L4 is an affordable data center model available from many infrastructure and cloud providers that fits the system recommendations. ## Export Limitations The export size is limited by the hardware capabilities of the device, specifically the available RAM and GPU framebuffer size. CE.SDK makes use of hardware acceleration provided within that environment. Therefore, the hardware always acts as an upper bound of what’s achievable. Unlike the client-side rendering done by the other platforms, CE.SDK Renderer can make use of server hardware and is not limited by interactivity performance constraints. Therefore scenes of any complexity should be supported, limited only by the memory and GPU limits of the host hardware. --- ## More Resources - **[Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md)** - Browse all Renderer documentation - **[Complete Documentation](https://img.ly/docs/cesdk/renderer/llms-full.txt)** - Full documentation in one file (for LLMs) - **[Web Documentation](https://img.ly/docs/cesdk/renderer/)** - Interactive documentation with examples - **[Support](mailto:support@img.ly)** - Contact IMG.LY support --- --- title: "Compatibility & Security" description: "Learn about CE.SDK's compatibility and security features." platform: renderer url: "https://img.ly/docs/cesdk/renderer/compatibility-fef719/" --- > This is one page of the CE.SDK Renderer documentation. For a complete overview, see the [Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md). For all docs in one file, see [llms-full.txt](https://img.ly/docs/cesdk/renderer/llms-full.txt). **Navigation:** [Compatibility & Security](https://img.ly/docs/cesdk/renderer/compatibility-fef719/) --- CE.SDK provides robust compatibility and security features across platforms. Learn about supported browsers, frameworks, file formats, language support, and how CE.SDK ensures secure operation in your applications. --- ## Related Pages - [System Compatibility](https://img.ly/docs/cesdk/renderer/compatibility-139ef9/) - Learn how device performance and hardware limits affect CE.SDK editing, rendering, and export capabilities. - [File Format Support](https://img.ly/docs/cesdk/renderer/file-format-support-3c4b2a/) - See which image, video, audio, font, and template formats CE.SDK supports for import and export. - [Security](https://img.ly/docs/cesdk/renderer/security-777bfd/) - Learn how CE.SDK keeps your data private with client-side processing, secure licensing, and GDPR-compliant practices. - [Error codes](https://img.ly/docs/cesdk/renderer/error-codes-677bef/) - A summary of the possible error conditions and how to handle them --- ## More Resources - **[Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md)** - Browse all Renderer documentation - **[Complete Documentation](https://img.ly/docs/cesdk/renderer/llms-full.txt)** - Full documentation in one file (for LLMs) - **[Web Documentation](https://img.ly/docs/cesdk/renderer/)** - Interactive documentation with examples - **[Support](mailto:support@img.ly)** - Contact IMG.LY support --- --- title: "Concepts" description: "Key concepts and principles of CE.SDK" platform: renderer url: "https://img.ly/docs/cesdk/renderer/concepts-c9ff51/" --- > This is one page of the CE.SDK Renderer documentation. For a complete overview, see the [Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md). For all docs in one file, see [llms-full.txt](https://img.ly/docs/cesdk/renderer/llms-full.txt). **Navigation:** [Concepts](https://img.ly/docs/cesdk/renderer/concepts-c9ff51/) --- Key Concepts and principles of CE.SDK. --- ## Related Pages - [Key Concepts](https://img.ly/docs/cesdk/renderer/key-concepts-21a270/) - Explore CE.SDK’s key features—manual editing, automation, templates, AI tools, and full UI and API control. - [Key Capabilities](https://img.ly/docs/cesdk/renderer/key-capabilities-dbb5b1/) - Explore CE.SDK’s key features—manual editing, automation, templates, AI tools, and full UI and API control. --- ## More Resources - **[Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md)** - Browse all Renderer documentation - **[Complete Documentation](https://img.ly/docs/cesdk/renderer/llms-full.txt)** - Full documentation in one file (for LLMs) - **[Web Documentation](https://img.ly/docs/cesdk/renderer/)** - Interactive documentation with examples - **[Support](mailto:support@img.ly)** - Contact IMG.LY support --- --- title: "Error codes" description: "A summary of the possible error conditions and how to handle them" platform: renderer url: "https://img.ly/docs/cesdk/renderer/error-codes-677bef/" --- > This is one page of the CE.SDK Renderer documentation. For a complete overview, see the [Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md). For all docs in one file, see [llms-full.txt](https://img.ly/docs/cesdk/renderer/llms-full.txt). **Navigation:** [Compatibility & Security](https://img.ly/docs/cesdk/renderer/compatibility-fef719/) > [Error codes](https://img.ly/docs/cesdk/renderer/error-codes-677bef/) --- The CE.SDK renderer can return and print a variety of errors that can happen due to invalid inputs, resource constraints, host device issues, etc. Any error MUST be accompanied with a non-zero exit code from the process to indicate failure and SHOULD print diagnostic information to the standard error output. The operating system may terminate the process in case of an out of memory scenario, illegal memory access due to a program bug or a number of other reasons, in that case diagnostic information cannot be reliably printed. The error types with recommended handling strategy are summarized in the following table: | Error | Process exit code | Handling strategy | | --------------------------------------------------- | ----------------- | ---------------------------------------------------------------------------------------------------------------------------- | | No error | 0 | No handling needed | | Invalid CLI arguments | 1 | Check invocation and fix the argument syntax | | Unknown file extension, could not guess MIME type | 1 | Specify the desired output MIME type directly via the -T/--output-mime-type flag | | Received an interrupt signal | 1 | The termination was requested by sending a SIGINT signal to the process, intended behavior | | Could not create render context | 1 | Check GPU setup according to the Server Setup guide, most likely a GPU driver initialization failure due to misconfiguration | | Engine creation error | 1 | Check the settings passed via CLI flags for validity | | Assets base path is not a directory | 1 | Make sure to pass a valid path to a directory to the --base-path flag, or skip the flag to use the default | | License-related errors | 1 | Check that your license is still valid, and that the concurrency limit is not exceeded in your infrastructure. | | Could not open/read input file | -1 | System IO error, check the input file path for validity and disk device for issues | | Input file did not contain a valid scene | 1 | The input provided needs to be a valid CE.SDK scene or archive, exported from the same or older CE.SDK version | | Page X not available, loaded scene only has N pages | -2 | Pass a valid page number to the --page CLI argument | | Export failed | 1 | The detailed error message should contain more information, retries can be a valid solution to some hardware/driver issues | | Could not write to output file | 1 | Make sure the output directory is writable and has enough free space to hold the output file | | Max concurrency reached | 1 | Limit the maximum deployment scaling in your orchestration system, or contact IMG.LY to acquire a higher limit | --- ## More Resources - **[Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md)** - Browse all Renderer documentation - **[Complete Documentation](https://img.ly/docs/cesdk/renderer/llms-full.txt)** - Full documentation in one file (for LLMs) - **[Web Documentation](https://img.ly/docs/cesdk/renderer/)** - Interactive documentation with examples - **[Support](mailto:support@img.ly)** - Contact IMG.LY support --- --- title: "File Format Support" description: "See which image, video, audio, font, and template formats CE.SDK supports for import and export." platform: renderer url: "https://img.ly/docs/cesdk/renderer/file-format-support-3c4b2a/" --- > This is one page of the CE.SDK Renderer documentation. For a complete overview, see the [Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md). For all docs in one file, see [llms-full.txt](https://img.ly/docs/cesdk/renderer/llms-full.txt). **Navigation:** [Compatibility & Security](https://img.ly/docs/cesdk/renderer/compatibility-fef719/) > [File Format Support](https://img.ly/docs/cesdk/renderer/file-format-support-3c4b2a/) --- CreativeEditor SDK (CE.SDK) supports a wide range of modern file types for importing assets and exporting final content. Whether you're working with images, documents, or fonts, CE.SDK provides an editing environment with excellent media compatibility and performance—optimized for modern hardware. This guide outlines supported formats and known limitations across media types. ## Importing Media ### SVG Limitations ## Exporting Media ## Importing Templates ## Font Formats ## Size Limits ### Image Resolution Limits The maximum input and output image size of the CE.SDK renderer is limited only by the GPU hardware limits, which for most server hardware is 32,768 x 32,768 pixels. --- ## More Resources - **[Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md)** - Browse all Renderer documentation - **[Complete Documentation](https://img.ly/docs/cesdk/renderer/llms-full.txt)** - Full documentation in one file (for LLMs) - **[Web Documentation](https://img.ly/docs/cesdk/renderer/)** - Interactive documentation with examples - **[Support](mailto:support@img.ly)** - Contact IMG.LY support --- --- title: "Benchmarks" description: "Performance benchmarks and metrics for CE.SDK Renderer" platform: renderer url: "https://img.ly/docs/cesdk/renderer/get-started/benchmarks-b3n4ch/" --- > This is one page of the CE.SDK Renderer documentation. For a complete overview, see the [Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md). For all docs in one file, see [llms-full.txt](https://img.ly/docs/cesdk/renderer/llms-full.txt). **Navigation:** [Get Started](https://img.ly/docs/cesdk/renderer/get-started/overview-e18f40/) > [Benchmarks](https://img.ly/docs/cesdk/renderer/get-started/benchmarks-b3n4ch/) --- To better gauge the capabilities of CE.SDK Renderer we provide a set of benchmarks covering both our evaluation and production variants. ## Pipeline Options | Pipeline | Use Case | License | | -------------- | ------------------------- | ------------------------- | | **Evaluation** | Testing, prototypes, POCs | Open-source, free | | **Production** | Commercial deployments | Commercial with AV codecs | > **Note:** **Production Pipeline required for all commercial use, see > [Patents & Acknowledgements](https://img.ly/docs/cesdk/renderer/get-started/patents-acknowledgements-9k2p4m/) for details.** ## Performance Factors Rendering performance depends on: - **Scene complexity**: Video duration, asset count, effects, transitions - **Archive size**: Larger files with high-resolution assets take longer - **Network speed**: Asset download and result upload times - **Hardware**: GPU acceleration and CPU cores available - **Output settings**: Resolution, bitrate, codec settings ## Benchmarks | Scene | Output Resolution | Archive Size | Duration | Evaluation | Production | | ----------------------------------------------------------------------------------------------------------------------- | ----------------- | ------------ | -------- | ---------- | ---------- | | [template-red-dot](https://cdn.img.ly/assets/demo/v3/ly.img.video.template/templates/red-dot.scene) | 1080x1920 | 27.5 MB | 17.7s | 9.6s | 12.7s | | [template-milli-surf-school](https://cdn.img.ly/assets/demo/v3/ly.img.video.template/templates/milli-surf-school.scene) | 1080x1920 | 22.6 MB | 20.5s | 7.0s | 12.6s | | [template-monthly-review](https://cdn.img.ly/assets/demo/v3/ly.img.video.template/templates/monthly-review.scene) | 1080x1920 | 30.6 MB | 13.5s | 5.6s | 8.8s | | [template-my-plants](https://cdn.img.ly/assets/demo/v3/ly.img.video.template/templates/my-plants.scene) | 1080x1920 | 39.2 MB | 15.2s | 5.7s | 9.8s | | [template-milli-surf-school](https://cdn.img.ly/assets/demo/v3/ly.img.video.template/templates/milli-surf-school.scene) | 2160x3840 (4K) | 22.6 MB | 20.5s | 66.3s | 33.2s | Tested on a fal.ai cloud GPU instance with an Nvidia L4. Additional license handshakes currently slightly decrease production execution time. ## Expected Processing Times | Scene Type | Estimated Time | | ------------------------------------------- | -------------- | | Simple template, \<15s, minimal assets | 5-10s | | Medium complexity, 15-30s, some clips | 10-15s | | High complexity, 30-60s, many clips/effects | 15-30s | | Very complex, 60s+, heavy effects | 30s+ | ## Optimization Tips 1. **Assets**: Host on fast CDNs, compress files, use appropriate resolutions 2. **Scene Design**: Minimize layers, optimize effects, avoid over-resolution 3. **Output**: Choose appropriate resolution/bitrate for your use case 4. **Network**: Ensure stable, high-bandwidth connection ## Getting Started ### Evaluation 1. Sign up for CE.SDK trial or use with watermark 2. Use public Docker deployment (hub.docker.com/imgly/cesdk-renderer) 3. Test with your scenes ### Production 1. Contact sales@img.ly for licensing 2. Receive production image access details 3. Test with your scenes *** *Benchmarks: October 2025, Nvidia L4 on fal.ai. Contact sales@img.ly for licensing or custom testing.* --- ## More Resources - **[Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md)** - Browse all Renderer documentation - **[Complete Documentation](https://img.ly/docs/cesdk/renderer/llms-full.txt)** - Full documentation in one file (for LLMs) - **[Web Documentation](https://img.ly/docs/cesdk/renderer/)** - Interactive documentation with examples - **[Support](mailto:support@img.ly)** - Contact IMG.LY support --- --- title: "Build with AI" description: "Give your AI coding assistant context about CE.SDK to generate accurate code and get instant answers." platform: renderer url: "https://img.ly/docs/cesdk/renderer/get-started/build-with-ai-k7m9p2/" --- > This is one page of the CE.SDK Renderer documentation. For a complete overview, see the [Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md). For all docs in one file, see [llms-full.txt](https://img.ly/docs/cesdk/renderer/llms-full.txt). **Navigation:** [Get Started](https://img.ly/docs/cesdk/renderer/get-started/overview-e18f40/) > [Build with AI](https://img.ly/docs/cesdk/renderer/get-started/build-with-ai-k7m9p2/) --- Give your AI coding assistant full context about CE.SDK to generate accurate code and get instant answers. Choose the integration that fits your workflow. ## Choose Your Approach ### Using an AI-Powered IDE? Connect your IDE to our **MCP Server** for real-time documentation search. Works with Claude Desktop, Cursor, VS Code Copilot, Windsurf and any MCP-compatible tool. [Connect MCP Server](https://img.ly/docs/cesdk/renderer/get-started/mcp-server-fde71c/) ### Need Raw Documentation for AI? Download our **LLMs.txt** files to manually load CE.SDK documentation into any AI tool. Available as a compact index or full documentation bundle. [Download LLMs.txt](https://img.ly/docs/cesdk/renderer/llms-txt-eb9cc5/) --- ## Related Pages - [MCP Server](https://img.ly/docs/cesdk/renderer/get-started/mcp-server-fde71c/) - Connect AI assistants to CE.SDK documentation using the Model Context Protocol (MCP) server. - [LLMs.txt](https://img.ly/docs/cesdk/renderer/llms-txt-eb9cc5/) - Our documentation is available in LLMs.txt format --- ## More Resources - **[Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md)** - Browse all Renderer documentation - **[Complete Documentation](https://img.ly/docs/cesdk/renderer/llms-full.txt)** - Full documentation in one file (for LLMs) - **[Web Documentation](https://img.ly/docs/cesdk/renderer/)** - Interactive documentation with examples - **[Support](mailto:support@img.ly)** - Contact IMG.LY support --- --- title: "Setup and Command-line Export" description: "Getting started with CE.SDK Renderer" platform: renderer url: "https://img.ly/docs/cesdk/renderer/get-started/commandline-4230bf/" --- > This is one page of the CE.SDK Renderer documentation. For a complete overview, see the [Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md). For all docs in one file, see [llms-full.txt](https://img.ly/docs/cesdk/renderer/llms-full.txt). **Navigation:** [Get Started](https://img.ly/docs/cesdk/renderer/get-started/overview-e18f40/) > [Server setup](https://img.ly/docs/cesdk/renderer/get-started/commandline-4230bf/) --- This guide walks you through exporting sample **CreativeEditor SDK (CE.SDK)** scenes on **Linux using the CE.SDK Renderer Docker container**. > **Reading time:** 5 minutes > > **Resources:** > > - [View source on GitHub](https://github.com/imgly/cesdk-renderer-examples/blob/v$UBQ_VERSION$/simple/README.md) ## Who is This Guide For? This guide is for developers who: - Need to **perform image exporting programmatically** in a **Linux server environment**. - Want to use an **NVIDIA GPU** for accelerating the export time of CE.SDK scenes and archives. ## What You'll Achieve - Install and configure **Docker** and the **NVIDIA Container Runtime** for **Ubuntu Linux**. - Fetch the **CE.SDK Renderer** container and learn how to configure scene exports. - Export designs as **PNG images** and **MP4 videos** on the server. > **Note:** Please note that there are special licensing requirements needed for patent > coverage of H.264 and H.265 video codecs, using open-source H.264 codecs at > your own risk is possible. ## Prerequisites Before getting started, ensure you have a server or virtual machine running **Ubuntu 24.04 LTS**. The server should preferably have a GPU, image exports are possible but significantly slower without GPU acceleration. You can explore the full hardware requirements [here](https://img.ly/docs/cesdk/renderer/compatibility-139ef9/). ## Container variants We offer four container variants which are useful in different deployment scenarios: open-source and licensed codec variants, each having a variant that bundles our default assets and one that does not. The demos provided use open-source codecs to get you up and running quickly, but these codecs do not come with patent license coverage which is required for legal AAC, H.264 and H.265 encoding and decoding. For production deployments, we offer [licensed codec](https://img.ly/docs/cesdk/renderer/get-started/commandline-4231be/) container variants, switching to them after your evaluation requires only authenticating with our private container registry and switching out the container image names in your deployment. The other choice available to you is bundled assets vs assetless containers. `cesdk-renderer` containers that bundle the CDN assets in a local directory `/opt/cesdk-renderer/assets`, this allows for quicker exports as no CDN access is required, and gets you up and running quickly by having access to demo scenes for testing with simple commands. If you have customized your assets tree with custom sources and want to build your own version of the container, or you want to access them over http(s), we offer `assetless` container versions that only bundle the core assets required to run the renderer, saving about 300 MB in container size. ## Step 1: Install the CE.SDK Renderer and see the available options To fetch the current version of the CE.SDK Renderer, use the following command: ```bash sudo docker pull docker.io/imgly/cesdk-renderer:$UBQ_VERSION$ ``` ```bash sudo docker pull docker.io/imgly/cesdk-renderer-assetless:$UBQ_VERSION$ ``` ```bash sudo docker login container.img.ly -u "oauth" -p "YOUR-API-KEY" sudo docker pull container.img.ly/imgly/cesdk-renderer-avlicensed:$UBQ_VERSION$ ``` ```bash sudo docker login container.img.ly -u "oauth" -p "YOUR-API-KEY" sudo docker pull container.img.ly/imgly/cesdk-renderer-avlicensed-assetless:$UBQ_VERSION$ ``` Then list the available command-line options by running the container with a `--help` flag: ```bash sudo docker run docker.io/imgly/cesdk-renderer:$UBQ_VERSION$ --help ``` ```bash sudo docker run docker.io/imgly/cesdk-renderer-assetless:$UBQ_VERSION$ --help ``` ```bash sudo docker run container.img.ly/imgly/cesdk-renderer-avlicensed:$UBQ_VERSION$ --help ``` ```bash sudo docker run container.img.ly/imgly/cesdk-renderer-avlicensed-assetless:$UBQ_VERSION$ --help ``` You should get a list of available options: ``` Renders a CE.SDK scene or archive to an image or video file. Environment variables: - CESDK_LICENSE - the license to unlock the engine (present) ./cesdk_cli [OPTIONS] OPTIONS: -h, --help Print this help message and exit -i, --input design.scene|archive.zip REQUIRED Input file name -o, --output FILE|DIR Output file name, automatically generated based on the scene type if not provided. If only a directory is specified, the generated output file is placed there, otherwise it defaults to the input directory. -T, --output-mime-type MIME Manually specify a MIME type of the output instead of relying on extension-based detection, e.g. image/png, video/mp4, etc. -v, --verbose Verbose output -j, --json-progress JSON progress output to stdout -b, --base-path DIR|URL [/opt/cesdk-renderer/assets] Assets root directory path. This can be an absolute file path, a path relative to the current working directory, or a URL pointing to an assets server. [... advanced options listed here ...] ``` ## Step 2: Install the Docker and NVIDIA runtimes on the server For production use, you will need to have a working container runtime and the NVIDIA Container Toolkit on the target server. If you can already run `sudo docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi` in the context of your target server and successfuly get information about the host GPU, you can skip this step.
NVIDIA Container Toolkit setup on a bare metal server This step closely follows the official [NVIDIA guide](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html) for installing the Container Toolkit. If you haven't installed a compatible container engine yet, we recommend installing the [Docker Engine](https://docs.docker.com/engine/install/) first. Run the following command to install the required packages and start the Docker daemon, you can skip the GPU runtime commands if only CPU rendering of images is needed: ```bash # Install GPU video decoding drivers sudo apt-get install -y vdpau-driver-all libvdpau-va-gl1 # Install the NVIDIA container runtime curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \ && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \ sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \ sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list \ && sudo apt-get update -y \ && export NVIDIA_CONTAINER_TOOLKIT_VERSION=1.18.0-1 \ && sudo apt-get install -y \ nvidia-container-toolkit=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \ nvidia-container-toolkit-base=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \ libnvidia-container-tools=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \ libnvidia-container1=${NVIDIA_CONTAINER_TOOLKIT_VERSION} # Configure the GPU runtime for the Docker daemon sudo nvidia-ctk runtime configure --runtime=docker && sudo systemctl restart docker # Test if the GPU runtime was properly configured and can see the GPU hardware sudo docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi ``` ```bash # Install GPU video decoding drivers and curl sudo dnf install -y libva-vdpau-driver libvdpau-va-gl curl # Install the NVIDIA container runtime curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo | \ sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo \ && export NVIDIA_CONTAINER_TOOLKIT_VERSION=1.18.0-1 \ && sudo dnf install -y \ nvidia-container-toolkit-${NVIDIA_CONTAINER_TOOLKIT_VERSION} \ nvidia-container-toolkit-base-${NVIDIA_CONTAINER_TOOLKIT_VERSION} \ libnvidia-container-tools-${NVIDIA_CONTAINER_TOOLKIT_VERSION} \ libnvidia-container1-${NVIDIA_CONTAINER_TOOLKIT_VERSION} # Configure the GPU runtime for the Docker daemon sudo nvidia-ctk runtime configure --runtime=docker && sudo systemctl restart docker # Test if the GPU runtime was properly configured and can see the GPU hardware sudo docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi ``` ```bash # Install GPU video decoding drivers sudo zypper install -y mesa-vdpau-drivers # Install the NVIDIA container runtime sudo zypper ar https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo \ && export NVIDIA_CONTAINER_TOOLKIT_VERSION=1.18.0-1 \ && sudo zypper --gpg-auto-import-keys install -y \ nvidia-container-toolkit-${NVIDIA_CONTAINER_TOOLKIT_VERSION} \ nvidia-container-toolkit-base-${NVIDIA_CONTAINER_TOOLKIT_VERSION} \ libnvidia-container-tools-${NVIDIA_CONTAINER_TOOLKIT_VERSION} \ libnvidia-container1-${NVIDIA_CONTAINER_TOOLKIT_VERSION} # Configure the GPU runtime for the Docker daemon sudo nvidia-ctk runtime configure --runtime=docker && sudo systemctl restart docker # Test if the GPU runtime was properly configured and can see the GPU hardware sudo docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi ```
`nvidia-smi` run inside Docker should provide output similar to this: ``` +-----------------------------------------------------------------------------------------+ | NVIDIA-SMI 570.133.07 Driver Version: 570.133.07 CUDA Version: 12.8 | |-----------------------------------------+------------------------+----------------------+ | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=========================================+========================+======================| | 0 NVIDIA L4 Off | 00000000:00:04.0 Off | 0 | | N/A 40C P8 12W / 72W | 0MiB / 23034MiB | 0% Default | | | | N/A | +-----------------------------------------+------------------------+----------------------+ +-----------------------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=========================================================================================| | No running processes found | +-----------------------------------------------------------------------------------------+ ``` The next steps assume that your current user is not part of the `docker` group for security reasons, if you did add it then you can skip the `sudo` before `sudo docker` invocations. However, this exposes you to the risk of enabling [full root access](https://docs.docker.com/engine/security/#docker-daemon-attack-surface) from a regular user account, so we do not recommend doing it in production systems. ## Step 3: Set up the project structure Create the following file and directory structure: ``` /my-processor-project ├── .env ├── demo.sh ├── input/ ├── output/ ``` ### Optional: .env (License key) If you already have a license key, put it in the `.env` file for later usage by the container. If you don't, you can skip this step and you'll get a watermarked output file. ```bash CESDK_LICENSE=my.license.key ``` ### demo.sh The following shell script demonstrates how to directly run a one-off instance CE.SDK Renderer CLI via Docker: ```bash file=@cesdk_renderer_examples/simple/demo.sh #!/bin/bash set -euo pipefail # Load the license from the .env file if it exists (optional) if [[ -f .env ]]; then . .env fi # Set the CESDK_RENDERER_VERSION to the latest version if not explicitly overridden CESDK_RENDERER_VERSION=${CESDK_RENDERER_VERSION:-latest} # Create the input and output directories if missing and set permissions mkdir -p input output chmod 0777 input output # Run the renderer on one of the template scenes # Remove `--runtime=nvidia --gpus all` if running on a system without NVIDIA GPU. docker run --rm --runtime=nvidia --gpus all -it \ -e "CESDK_LICENSE=${CESDK_LICENSE:-}" \ -v "$(pwd)/output:/output" -v "$(pwd)/input:/input" \ "docker.io/imgly/cesdk-renderer:${CESDK_RENDERER_VERSION}" \ --input "${INPUT_FILE:-/opt/cesdk-renderer/assets/demo/v3/ly.img.template/templates/cesdk_postcard_1.scene}" \ --output "${OUTPUT_FILE:-/output/}" "$@" ``` ```bash file=@cesdk_renderer_examples/simple/demo-assetless.sh #!/bin/bash set -euo pipefail # Load the license from the .env file if it exists (optional) if [[ -f .env ]]; then . .env fi # Set the CESDK_RENDERER_VERSION to the latest version if not explicitly overridden CESDK_RENDERER_VERSION=${CESDK_RENDERER_VERSION:-latest} # Create the input and output directories if missing and set permissions mkdir -p input output chmod 0777 input output # Run the renderer on one of the template scenes # Remove `--runtime=nvidia --gpus all` if running on a system without NVIDIA GPU. docker run --rm --runtime=nvidia --gpus all -it \ -e "CESDK_LICENSE=${CESDK_LICENSE:-}" \ -v "$(pwd)/output:/output" -v "$(pwd)/input:/input" \ "docker.io/imgly/cesdk-renderer-assetless:${CESDK_RENDERER_VERSION}" \ --input "${INPUT_FILE:?INPUT_FILE must be provided}" \ --output "${OUTPUT_FILE:-/output/}" "$@" ``` ```bash file=@cesdk_renderer_examples/simple/demo-avlicensed.sh #!/bin/bash set -euo pipefail # Load the license from the .env file if it exists (required) if [[ -f .env ]]; then . .env fi # Set the CESDK_RENDERER_VERSION to the latest version if not explicitly overridden CESDK_RENDERER_VERSION=${CESDK_RENDERER_VERSION:-latest} # Create the input and output directories if missing and set permissions mkdir -p input output chmod 0777 input output # Run the renderer on one of the template scenes # Remove `--runtime=nvidia --gpus all` if running on a system without NVIDIA GPU. docker run --rm --runtime=nvidia --gpus all -it \ -e "CESDK_LICENSE=${CESDK_LICENSE:?CESDK_LICENSE must be provided to use licensed codecs}" \ -v "$(pwd)/output:/output" -v "$(pwd)/input:/input" \ "container.img.ly/imgly/cesdk-renderer-avlicensed:${CESDK_RENDERER_VERSION}" \ --input "${INPUT_FILE:-/opt/cesdk-renderer/assets/demo/v3/ly.img.template/templates/cesdk_postcard_1.scene}" \ --output "${OUTPUT_FILE:-/output/}" "$@" ``` ```bash file=@cesdk_renderer_examples/simple/demo-avlicensed-assetless.sh #!/bin/bash set -euo pipefail # Load the license from the .env file if it exists (required) if [[ -f .env ]]; then . .env fi # Set the CESDK_RENDERER_VERSION to the latest version if not explicitly overridden CESDK_RENDERER_VERSION=${CESDK_RENDERER_VERSION:-latest} # Create the input and output directories if missing and set permissions mkdir -p input output chmod 0777 input output # Run the renderer on one of the template scenes # Remove `--runtime=nvidia --gpus all` if running on a system without NVIDIA GPU. docker run --rm --runtime=nvidia --gpus all -it \ -e "CESDK_LICENSE=${CESDK_LICENSE:?CESDK_LICENSE must be provided to use licensed codecs}" \ -v "$(pwd)/output:/output" -v "$(pwd)/input:/input" \ "container.img.ly/imgly/cesdk-renderer-avlicensed-assetless:${CESDK_RENDERER_VERSION}" \ --input "${INPUT_FILE:?INPUT_FILE must be provided}" \ --output "${OUTPUT_FILE:-/output/}" "$@" ``` ## Step 4: Run the Script Once everything is set up, run your script using: ```bash ./demo.sh ``` This will process the scene and generate an image file named **`output/postcard.jpg`** in your project directory: ![A postcard with text "Layout, text and photo editing. All in one" on the left and a red-tinted photo of a woman on the right](postcard.png) > **Note:** We run the docker container via a `sudo` invocation, which might ask you for > your user password. In a production deployment, the script starting the > container should be given appropriate permissions to execute the processor > without user interaction. If you have your own scene files to test, copy them into the `input/` directory and export to various formats: ```bash INPUT_FILE=/input/my-scene.scene OUTPUT_FILE=/output/my-scene.png ./demo.sh INPUT_FILE=/input/my-scene.scene OUTPUT_FILE=/output/my-scene.jpg ./demo.sh INPUT_FILE=/input/my-scene.scene OUTPUT_FILE=/output/my-scene.pdf ./demo.sh INPUT_FILE=/input/my-archive.zip OUTPUT_FILE=/output/my-archive.png ./demo.sh INPUT_FILE=/input/my-video.scene OUTPUT_FILE=/output/my-video.mp4 ./demo.sh ``` ### Expected Output When successful, you should see: ``` {"status":"loading","fractionComplete":0.0} {"status":"exporting","fractionComplete":0.0} {"status":"done","fractionComplete":1.0} ``` The `--json-output` flags will generate single-line JSON status reports periodically, these can be monitored on the process standard output to determine the progress of the export. The default demo scene should output a `output/postcard.jpg` image. ## Troubleshooting & Common Errors **❌ Error encountered while creating an EGL hardware-accelerated context, falling back to CPU rendering: EGL initialize error: UNKNOWN** - Make sure the GPU setup instructions were followed, this error indicates that a hardware OpenGL context could not be created inside the container. - When using `docker run`, ensure you're using **both** `--runtime=nvidia` and `--gpus all` flags together. Using only `--gpus all` without `--runtime=nvidia` can cause this error. - This could also be expected if testing the container on a machine without a GPU. **❌ Error: `Invalid license key`** - Verify that your **license key** is correct and not expired, or remove the key entirely to get watermarked output. ## Next Steps Congratulations! You've successfully exported a scene with the **CE.SDK Renderer** using **a simple shell script**. Next, explore: - [Integrating with an Express.js web API](https://img.ly/docs/cesdk/renderer/get-started/expressjs-9f25eb/) - [Integrating with CE.SDK for Node.js to combine programmatic scene manipulation with efficient exports](https://img.ly/docs/cesdk/renderer/get-started/node-processing-a2e4dc/) --- ## More Resources - **[Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md)** - Browse all Renderer documentation - **[Complete Documentation](https://img.ly/docs/cesdk/renderer/llms-full.txt)** - Full documentation in one file (for LLMs) - **[Web Documentation](https://img.ly/docs/cesdk/renderer/)** - Interactive documentation with examples - **[Support](mailto:support@img.ly)** - Contact IMG.LY support --- --- title: "Licensed codec setup" description: "Setting up the avlicensed variant of CE.SDK Renderer" platform: renderer url: "https://img.ly/docs/cesdk/renderer/get-started/commandline-4231be/" --- > This is one page of the CE.SDK Renderer documentation. For a complete overview, see the [Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md). For all docs in one file, see [llms-full.txt](https://img.ly/docs/cesdk/renderer/llms-full.txt). **Navigation:** [Get Started](https://img.ly/docs/cesdk/renderer/get-started/overview-e18f40/) > [Licensed codec setup](https://img.ly/docs/cesdk/renderer/get-started/commandline-4231be/) --- The **avlicensed** commercial variant of CE.SDK Renderer includes products, performing audio and video encoding and decoding functions, which are provided by and are copyright of Fluendo S.A.. See the [Patents & Acknowledgements](https://img.ly/docs/cesdk/renderer/get-started/patents-acknowledgements-9k2p4m/) section for more details on the proprietary technologies. This version can only be obtained through our dashboard and after signing up for a CE.SDK subscription from a private container registry we provide. It's also subject to a concurrency limit as negotiated in your contract, only a specified number of CE.SDK Renderer instances can be running simultaneously. ## Authenticating with the private IMG.LY Container Registry Assuming you've already set up a valid Docker daemon on your system, you can log into our private registry with the API key associated with your Linux codec license from the Dashboard: ```bash sudo docker login container.img.ly -u "oauth" -p "YOUR-API-KEY" ``` The login will locally store an authentication token in your user's docker configuration file, valid for 1 hour without automatic renewal. After one hour, the authentication step has to be done again if further access to the container registry is needed. We recommend fetching and mirroring the containers you need to your own private container registry, like the Elastic Container Registry in Amazon Web Services or the Google Artifact Registry if using the Google Cloud Platform. ### Fetching the AV-licensed containers Container variants with proprietary codec technology are pushed to that registry and can be fetched with these tags: ```bash # Assetless variant for use with your own assets tree or CDN sudo docker pull container.img.ly/imgly/cesdk-renderer-avlicensed-assetless:$UBQ_VERSION$ # Variant with bundled assets for faster exports without a network round-trip needed for most scene elements sudo docker pull container.img.ly/imgly/cesdk-renderer-avlicensed:$UBQ_VERSION$ ``` ### Usage of the AV-licensed containers The containers can be used exactly like their non-avlicensed counterparts, the only difference is the requirement for a codec license API key to unlock the patented codec technology. ## Troubleshooting & Common Errors **❌ Error encountered while creating an EGL hardware-accelerated context, falling back to CPU rendering: EGL initialize error: UNKNOWN** - Make sure the GPU setup instructions were followed, this error indicates that a hardware OpenGL context could not be created inside the container. - This could also be expected if testing the container on a machine without a GPU. **❌ Error: `Invalid license key`** - Verify that your **license key** is correct and not expired, or remove the key entirely to get watermarked output. **❌ Error: `Max concurrency reached`** - The avlicensed variant of the Renderer only allows up to a certain number of instances running simultaneously, as negotiated in your contract. To avoid running into the limit, limit your max deployment size to below this limit, or implement an exponential backoff retry system. --- ## More Resources - **[Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md)** - Browse all Renderer documentation - **[Complete Documentation](https://img.ly/docs/cesdk/renderer/llms-full.txt)** - Full documentation in one file (for LLMs) - **[Web Documentation](https://img.ly/docs/cesdk/renderer/)** - Interactive documentation with examples - **[Support](mailto:support@img.ly)** - Contact IMG.LY support --- --- title: "Integrating into an Express.js Web Application" description: "Invoking CE.SDK Renderer from Node.js" platform: renderer url: "https://img.ly/docs/cesdk/renderer/get-started/expressjs-9f25eb/" --- > This is one page of the CE.SDK Renderer documentation. For a complete overview, see the [Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md). For all docs in one file, see [llms-full.txt](https://img.ly/docs/cesdk/renderer/llms-full.txt). **Navigation:** [Guides](https://img.ly/docs/cesdk/renderer/guides-8d8b00/) > [Express.js Webservice](https://img.ly/docs/cesdk/renderer/get-started/expressjs-9f25eb/) --- This guide walks you through integrating export functionality via the **CE.SDK Renderer** inside an **Express.js web app**. We strongly recommend following the [server setup guide](https://img.ly/docs/cesdk/renderer/get-started/commandline-4230bf/) first. > **Reading time:** 10 minutes > > **Resources:** > > - [View source on GitHub](https://github.com/imgly/cesdk-renderer-examples/blob/v$UBQ_VERSION$/expressapi/README.md) ## Who is This Guide For? This guide is for developers who: - Need to **perform image exporting programmatically** in a **Linux server environment**. - Want to use a **NVIDIA GPU** for accelerating the export time of CE.SDK Designs. - Use **Node.js** to create a web app that needs image or video export functionality. ## What You'll Achieve - Create a Docker container adding a Node.js runtime on top of the CE.SDK Renderer system image. - Wire up a HTTP endpoint in Express.js to export an image with the CE.SDK Renderer. > **Note:** Please note that there are special licensing requirements needed for patent > coverage of H.264 and H.265 video codecs, using open-source H.264 codecs at > your own risk is possible but requires opt-in via an override environment > variable. ## Prerequisites Before getting started, ensure you have: - A server or virtual machine running **Ubuntu 24.04 LTS**, preferably with a GPU (Image exports are possible without GPU acceleration) - Ability to run the **CE.SDK Renderer** Docker container on your server and a pulled copy of the container image on your development machine. - **Node.js** (v20 or later) and **npm** installed. ## Step 1: Create a new Express project Create a new JavaScript project and add Express.js as a dependency: ```bash # Write app/main.mjs when asked for the entrypoint npm init --init-type module npm install express@5 --save # For HTML form parsing npm install multer@2 --save ``` Create a simple hello world API endpoint in `app/main.mjs`: ```js import express from 'express'; import multer from 'multer'; const app = express(); const port = 8080; app.use(express.static('public')); app.listen(port, () => { console.log(`CE.SDK Renderer Express API demo listening on port ${port}`); }); ``` And create the corresponding `public/index.html` file: ```html CE.SDK Renderer Express API Demo Hello, world! ``` Start the server with `node src/app.mjs` and make sure the `index.html` file gets correctly served. ## Step 2: Package into a Docker container In order to make use of the CE.SDK Renderer from the web app, we can install Node.js into a new container based on the Processor container and copy our app into it. Create the following `Dockerfile` to achieve this goal: ```dockerfile file=@cesdk_renderer_examples/expressapi/Dockerfile FROM docker.io/imgly/cesdk-renderer:latest USER root ARG NODE_VERSION=20.19.4 RUN mkdir -p /opt/node WORKDIR /opt/node RUN curl -fsSL https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.xz -o node.tar.xz \ && tar -Jxf node.tar.xz --strip-components=1 \ && rm node.tar.xz \ && /opt/node/bin/node --version ENV PATH="/opt/node/bin:$PATH" COPY . /app WORKDIR /app RUN npm install --production RUN mkdir -p /uploads /exports RUN chmod 0777 /uploads /exports USER containeruser EXPOSE 8080 ENTRYPOINT [ "/bin/sh", "-c", "/opt/node/bin/node src/app.mjs" ] ``` We will also need a `.dockerignore` file to exclude unnecessary files from polluting the container: ``` Dockerfile .gitignore node_modules docker-compose.yml ``` For convenience, we can use [Docker Compose](https://docs.docker.com/compose/) with a `docker-compose.yml` file to quickly rebuild and start an updated version of the container: ```yaml file=@cesdk_renderer_examples/expressapi/docker-compose.yml services: app: platform: linux/amd64 build: . environment: - CESDK_LICENSE=${CESDK_LICENSE} ports: - "8080:8080" # GPU acceleration - remove if running on a system without NVIDIA GPU runtime: nvidia ``` ### Optional: .env (License key) If you already have a license key, put it in the `.env` file for later usage by the container. If you don't, you can skip this step and you'll get a watermarked output file. ```bash CESDK_LICENSE=my.license.key ``` ### Build and start the container Run the following command to build and start the container, making use of our compose file: ```bash sudo docker compose up --build ``` Then, navigate to http://localhost:8080/index.html and make sure you can see the webpage we have created. You can terminate the server at any point with `Ctrl+C` in the shell. ## Step 3: Invoke the processor from Node.js Let's walk through the steps needed to create a simple HTML POST form where the user can submit a scene file or archive, and get an exported png in return. First, we'll need to import some additional library functions: ```js file=@cesdk_renderer_examples/expressapi/src/app.mjs reference-only /* eslint-disable no-console */ import express from 'express'; import multer from 'multer'; import { execFile } from 'node:child_process'; import fs from 'node:fs'; import { promisify } from 'node:util'; const rendererPath = process.env.CESDK_RENDERER_PATH || '/opt/cesdk-renderer/cesdk-renderer'; const rendererPwd = process.env.CESDK_RENDERER_PATH || '/opt/cesdk-renderer/'; const execFileAsync = promisify(execFile); const app = express(); const port = 8080; const upload = multer({ dest: '/uploads/' }); app.post('/export', upload.single('scene'), async (req, res) => { const sceneFile = req.file; const inputPath = `/uploads/${sceneFile.filename}`; const outputPath = `/exports/${sceneFile.filename}.png`; const { error, stdout, stderr } = await execFileAsync( rendererPath, ['--input', inputPath, '--output', outputPath], { cwd: rendererPwd } ); if (error) { console.error(error); res.status(500).send(`Error processing scene file: ${stderr}`); try { fs.unlinkSync(inputPath); fs.unlinkSync(outputPath); } catch (error) { console.error(`Error deleting files: ${error}`); } return; } try { fs.unlinkSync(inputPath); } catch (error) { console.error(`Error deleting input file: ${error}`); } res.setHeader('Content-Type', 'image/png'); res.setHeader( 'Content-Disposition', `inline; filename="${sceneFile.originalname.replace('.scene', '.png')}"` ); res.sendFile(outputPath, (err) => { try { fs.unlinkSync(outputPath); } catch (error) { console.error(`Error deleting output file: ${error}`); } }); }); app.use(express.static('public')); app.listen(port, () => { console.log(`CE.SDK Renderer Express API demo listening on port ${port}`); }); ``` ```js highlight-imports import express from 'express'; import multer from 'multer'; import { execFile } from 'node:child_process'; import fs from 'node:fs'; import { promisify } from 'node:util'; ``` Let's define a few helpful top-level constants: ```js highlight-constants const rendererPath = process.env.CESDK_RENDERER_PATH || '/opt/cesdk-renderer/cesdk-renderer'; const rendererPwd = process.env.CESDK_RENDERER_PATH || '/opt/cesdk-renderer/'; const execFileAsync = promisify(execFile); const app = express(); const port = 8080; const upload = multer({ dest: '/uploads/' }); ``` Now we can start on a POST route handler for scene exports: ```js highlight-post app.post('/export', upload.single('scene'), async (req, res) => { const sceneFile = req.file; const inputPath = `/uploads/${sceneFile.filename}`; const outputPath = `/exports/${sceneFile.filename}.png`; ``` The middleware handles file upload and unique naming for us, so at this point we are ready to execute the Processor and generate a png image: ```js highlight-exec const { error, stdout, stderr } = await execFileAsync( rendererPath, ['--input', inputPath, '--output', outputPath], { cwd: rendererPwd } ); ``` We specify the input and output paths explicity, and for this example we override the scene DPI to value of 300 to be ready for a low-resolution print. For more flexibility of where this demo can be ran, we allow the use of any render device - by default GPU rendering is enforced to prevent falling into a low performance mode by accidental misconfiguration. The Processor accepts both scene files and full archives, and it automatically detects the input file type based on its contents. Because we await the `execFileAsync` call, we are now ready to proceed with simple error handling: ```js highlight-error if (error) { console.error(error); res.status(500).send(`Error processing scene file: ${stderr}`); try { fs.unlinkSync(inputPath); fs.unlinkSync(outputPath); } catch (error) { console.error(`Error deleting files: ${error}`); } return; } ``` And if the export succeeds, we want to delete the input file, forward the output file in the output response and delete the output file once the response has been sent to avoid polluting the filesystem: ```js highlight-result try { fs.unlinkSync(inputPath); } catch (error) { console.error(`Error deleting input file: ${error}`); } res.setHeader('Content-Type', 'image/png'); res.setHeader( 'Content-Disposition', `inline; filename="${sceneFile.originalname.replace('.scene', '.png')}"` ); res.sendFile(outputPath, (err) => { try { fs.unlinkSync(outputPath); } catch (error) { console.error(`Error deleting output file: ${error}`); } }); }); ``` Now we just need to modify the body of the `index.html` file to have a simple file upload form matching our API definition: ```html

``` ### Testing Once again, we can rebuild and start the container with the form: ```bash sudo docker compose up --build ``` Then, navigate to http://localhost:8080/index.html and upload a scene or archive file exported from the CE.SDK Editor to get a png rendered in our browser in return. ## Troubleshooting & Common Errors **❌ Error encountered while creating an EGL hardware-accelerated context, falling back to CPU rendering: EGL initialize error: UNKNOWN** - Make sure the GPU setup instructions were followed, this error indicates that a hardware OpenGL context could not be created inside the container. - When using Docker Compose, ensure your `docker-compose.yml` includes `runtime: nvidia`. - When using `docker run`, ensure you're using **both** `--runtime=nvidia` and `--gpus all` flags together. - This could also be expected if testing the container on a machine without a GPU. **❌ Error: `Invalid license key`** - Verify that your **license key** is correct and not expired, or remove the key entirely to get watermarked output. **❌ Error: `Max concurrency reached`** - The avlicensed variant of the Renderer only allows up to a certain number of instances running simultaneously, as negotiated in your contract. To avoid running into the limit, limit your max deployment size to below this limit, or implement an exponential backoff retry system. ## Next Steps Congratulations! You've successfully exported a scene with the **CE.SDK Renderer** from **a Node.js API**. Next, explore: - [Integrating with CE.SDK for Node.js to combine programmatic scene manipulation with efficient exports](https://img.ly/docs/cesdk/renderer/get-started/node-processing-a2e4dc/) --- ## More Resources - **[Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md)** - Browse all Renderer documentation - **[Complete Documentation](https://img.ly/docs/cesdk/renderer/llms-full.txt)** - Full documentation in one file (for LLMs) - **[Web Documentation](https://img.ly/docs/cesdk/renderer/)** - Interactive documentation with examples - **[Support](mailto:support@img.ly)** - Contact IMG.LY support --- --- title: "MCP Server" description: "Connect AI assistants to CE.SDK documentation using the Model Context Protocol (MCP) server." platform: renderer url: "https://img.ly/docs/cesdk/renderer/get-started/mcp-server-fde71c/" --- > This is one page of the CE.SDK Renderer documentation. For a complete overview, see the [Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md). For all docs in one file, see [llms-full.txt](https://img.ly/docs/cesdk/renderer/llms-full.txt). **Navigation:** [Get Started](https://img.ly/docs/cesdk/renderer/get-started/overview-e18f40/) > [Build with AI](https://img.ly/docs/cesdk/renderer/get-started/build-with-ai-k7m9p2/) > [MCP Server](https://img.ly/docs/cesdk/renderer/get-started/mcp-server-fde71c/) --- The CE.SDK MCP server provides a standardized interface that allows any compatible AI assistant to search and access our documentation. This enables AI tools like Claude, Cursor, and VS Code Copilot to provide more accurate, context-aware help when working with CE.SDK. ## What is MCP? The [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) is an open standard that enables AI assistants to securely connect to external data sources. By connecting your AI tools to our MCP server, you get: - **Accurate answers**: AI assistants can search and retrieve the latest CE.SDK documentation - **Context-aware help**: Get platform-specific guidance for your development environment - **Up-to-date information**: Always access current documentation without relying on training data ## Available Tools The MCP server exposes two tools: | Tool | Description | |------|-------------| | `search` | Search documentation by query string | | `fetch` | Retrieve the full content of a document by ID | ## Server Endpoint | URL | Transport | |-----|-----------| | `https://mcp.img.ly/mcp` | Streamable HTTP | No authentication is required. ## Setup Instructions ### Claude Code Add the MCP server with a single command: ```bash claude mcp add --transport http imgly_docs https://mcp.img.ly/mcp ``` ### Claude Desktop 1. Open Claude Desktop and go to **Settings** (click your profile icon) 2. Navigate to **Connectors** in the sidebar 3. Click **Add custom connector** 4. Enter the URL: `https://mcp.img.ly/mcp` 5. Click **Add** to connect ### Cursor Add the following to your Cursor MCP configuration. You can use either: - **Project-specific**: `.cursor/mcp.json` in your project root - **Global**: `~/.cursor/mcp.json` ```json { "mcpServers": { "imgly_docs": { "url": "https://mcp.img.ly/mcp" } } } ``` ### VS Code Add to your workspace configuration at `.vscode/mcp.json`: ```json { "servers": { "imgly_docs": { "type": "http", "url": "https://mcp.img.ly/mcp" } } } ``` ### Windsurf Add the following to your Windsurf MCP configuration at `~/.codeium/windsurf/mcp_config.json`: ```json { "mcpServers": { "imgly_docs": { "serverUrl": "https://mcp.img.ly/mcp" } } } ``` ### Other Clients For other MCP-compatible clients, use the endpoint `https://mcp.img.ly/mcp` with HTTP transport. Refer to your client's documentation for the specific configuration format. ## Usage Once configured, your AI assistant will automatically have access to CE.SDK documentation. You can ask questions like: - "How do I add a text block in CE.SDK?" - "Show me how to export a design as PNG" - "What are the available blend modes?" The AI will search our documentation and provide answers based on the latest CE.SDK guides and API references. --- ## More Resources - **[Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md)** - Browse all Renderer documentation - **[Complete Documentation](https://img.ly/docs/cesdk/renderer/llms-full.txt)** - Full documentation in one file (for LLMs) - **[Web Documentation](https://img.ly/docs/cesdk/renderer/)** - Interactive documentation with examples - **[Support](mailto:support@img.ly)** - Contact IMG.LY support --- --- title: "Headless Automation using the Node.js API before Export" description: "Invoking CE.SDK Renderer from Node.js after processing a scene with the Node.js API" platform: renderer url: "https://img.ly/docs/cesdk/renderer/get-started/node-processing-a2e4dc/" --- > This is one page of the CE.SDK Renderer documentation. For a complete overview, see the [Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md). For all docs in one file, see [llms-full.txt](https://img.ly/docs/cesdk/renderer/llms-full.txt). **Navigation:** [Guides](https://img.ly/docs/cesdk/renderer/guides-8d8b00/) > [Headless Automation](https://img.ly/docs/cesdk/renderer/get-started/node-processing-a2e4dc/) --- This guide builds upon the web app developed in [the Express.js walkthrough](https://img.ly/docs/cesdk/renderer/get-started/expressjs-9f25eb/) by adding size variant generation for the exported scenes using the **Node.js API** for CreativeEditor SDK. > **Reading time:** 10 minutes > > **Resources:** > > - [View source on GitHub](https://github.com/imgly/cesdk-renderer-examples/blob/v$UBQ_VERSION$/expressapi_variants/README.md) ## Who is This Guide For? This guide is for developers who: - Need to **perform image exporting programmatically** in a **Linux server environment**. - Make use of the powerful **scene manipulation capabilities** of the **Node.js SDK** for CreativeEditor SDK. - Want to use a **NVIDIA GPU** for accelerating the export time of CE.SDK Designs. - Use **Node.js** to create a web app that needs image or video export functionality. ## What You'll Achieve - Generate multiple scene variants based on a reference scene file uploaded by the user. - Apply text variable substitutions when exporting the scene variants. - Generate a zip file of image exports of all the size variants of the input scene file. > **Note:** Please note that there are special licensing requirements needed for patent > coverage of H.264 and H.265 video codecs, using open-source H.264 codecs at > your own risk is possible but requires opt-in via an override environment > variable. ## Prerequisites Before getting started, ensure you have: - A working web app developed in the [previous guide](https://img.ly/docs/cesdk/renderer/get-started/expressjs-9f25eb/) ## Step 1: Add a CE.SDK Node.js dependency In order to manipulate the scene files and change their sizes according to size presets, we will need the CE.SDK Node.js API. Install it with npm: ```bash npm install @cesdk/node@$UBQ_VERSION$ --save ``` ## Step 2: Implement the new feature First, we import body-parser and CE.SDK in the main JavaScript file: ```js file=@cesdk_renderer_examples/expressapi_variants/src/app.mjs reference-only /* eslint-disable no-console */ import express from 'express'; import multer from 'multer'; import { execFile } from 'node:child_process'; import fs from 'node:fs'; import { promisify } from 'node:util'; import CreativeEngine from '@cesdk/node'; const rendererPath = process.env.CESDK_RENDERER_PATH || '/opt/cesdk-renderer/cesdk-renderer'; const rendererPwd = process.env.CESDK_RENDERER_PATH || '/opt/cesdk-renderer/'; const execFileAsync = promisify(execFile); const app = express(); const port = 8080; const engineConfig = { license: process.env.CESDK_LICENSE }; const upload = multer({ dest: '/uploads/' }); app.post('/export', upload.single('scene'), async (req, res) => { const sceneFile = req.file; const inputPath = `/uploads/${sceneFile.filename}`; const variants = []; const engine = await CreativeEngine.init(engineConfig); try { const scene = await engine.scene.loadFromURL(`file://${inputPath}`); // Generate the scene files for all variable substitutions for (const firstName of ['Alice', 'Bob', 'Charlotte', 'David']) { engine.variable.setString('firstName', firstName); const newScene = await engine.scene.saveToArchive(); const variantScene = `${inputPath}-${firstName}.zip`; const variantPng = `/exports/${sceneFile.filename}-${firstName}.png`; await promisify(fs.writeFile)(variantScene, newScene); variants.push({ scene: variantScene, png: variantPng }); } } catch (error) { console.error(`Error loading scene file: ${error}: ${error.stack}`); res.status(500).send(`Error loading scene file: ${error}: ${error.stack}`); return; } finally { engine.dispose(); } // Export each scene file to a png in parallel await Promise.all( variants.map(async (variant) => { const { error, stdout, stderr } = await execFileAsync( rendererPath, ['--input', variant.scene, '--output', variant.png], { cwd: rendererPwd } ); if (error) { console.error(error); res.status(500).send(`Error processing scene file: ${stderr}`); try { fs.unlinkSync(variant.scene); fs.unlinkSync(variant.png); } catch (error) { console.error(`Error deleting files: ${error}`); } throw error; } try { fs.unlinkSync(variant.scene); } catch (error) { console.error(`Error deleting input file: ${error}`); } }) ); // Zip the variants together const zipPath = `/exports/${sceneFile.filename}-variants.zip`; const { error, stdout, stderr } = await execFileAsync('/usr/bin/zip', [ '-j', zipPath, ...variants.map((variant) => variant.png) ]); if (error) { console.error(error); res.status(500).send(`Error zipping variants: ${stderr}`); return; } res.setHeader('Content-Type', 'application/zip'); res.setHeader( 'Content-Disposition', `attachment; filename="${sceneFile.originalname.replace('.scene', '.zip')}"` ); res.sendFile(zipPath, (err) => { try { fs.unlinkSync(zipPath); } catch (error) { console.error(`Error deleting output file: ${error}`); } }); // End of app.post( ... }); app.use(express.static('public')); app.listen(port, () => { console.log( `CE.SDK Renderer Express variant generation API demo listening on port ${port}` ); }); ``` ```js highlight-new-imports import CreativeEngine from '@cesdk/node'; ``` We will need a new top-level constant for the CE.SDK Engine configuration: ```js highlight-new-setup const engineConfig = { license: process.env.CESDK_LICENSE }; ``` We now have one input scene, but multiple intermediary scene files and output image files combined into a zip file, so we need to adjust the export endpoint: ```js highlight-endpoint app.post('/export', upload.single('scene'), async (req, res) => { const sceneFile = req.file; const inputPath = `/uploads/${sceneFile.filename}`; const variants = []; ``` Let's intialize a new Engine for each request, in a highly loaded production setting you should consider caching the engine instances and reusing them once requests are handled: ```js highlight-engine-init const engine = await CreativeEngine.init(engineConfig); try { const scene = await engine.scene.loadFromURL(`file://${inputPath}`); ``` Now, we can use the engine to generate new scene variants with changed text variable values and export each into an independent archive: ```js highlight-engine-vars // Generate the scene files for all variable substitutions for (const firstName of ['Alice', 'Bob', 'Charlotte', 'David']) { engine.variable.setString('firstName', firstName); const newScene = await engine.scene.saveToArchive(); const variantScene = `${inputPath}-${firstName}.zip`; const variantPng = `/exports/${sceneFile.filename}-${firstName}.png`; await promisify(fs.writeFile)(variantScene, newScene); variants.push({ scene: variantScene, png: variantPng }); } } catch (error) { console.error(`Error loading scene file: ${error}: ${error.stack}`); res.status(500).send(`Error loading scene file: ${error}: ${error.stack}`); return; } finally { engine.dispose(); } ``` We have saved all the scenes to export to the `variants` array, now we can export each one just like in the previous guide. We make use of Promise parallelism to run multiple exports in parallel: ```js highlight-export // Export each scene file to a png in parallel await Promise.all( variants.map(async (variant) => { const { error, stdout, stderr } = await execFileAsync( rendererPath, ['--input', variant.scene, '--output', variant.png], { cwd: rendererPwd } ); if (error) { console.error(error); res.status(500).send(`Error processing scene file: ${stderr}`); try { fs.unlinkSync(variant.scene); fs.unlinkSync(variant.png); } catch (error) { console.error(`Error deleting files: ${error}`); } throw error; } try { fs.unlinkSync(variant.scene); } catch (error) { console.error(`Error deleting input file: ${error}`); } }) ); ``` The input files are also cleaned up immediately to avoid wasting disk space. Downloading multiple files is not very convenient for the user, so let's zip the new scene files first into an archive using the system `zip` command: ```js highlight-zip // Zip the variants together const zipPath = `/exports/${sceneFile.filename}-variants.zip`; const { error, stdout, stderr } = await execFileAsync('/usr/bin/zip', [ '-j', zipPath, ...variants.map((variant) => variant.png) ]); if (error) { console.error(error); res.status(500).send(`Error zipping variants: ${stderr}`); return; } ``` We can then return the zip to the user and clean up afterwards: ```js highlight-return res.setHeader('Content-Type', 'application/zip'); res.setHeader( 'Content-Disposition', `attachment; filename="${sceneFile.originalname.replace('.scene', '.zip')}"` ); res.sendFile(zipPath, (err) => { try { fs.unlinkSync(zipPath); } catch (error) { console.error(`Error deleting output file: ${error}`); } }); // End of app.post( ... }); ``` For more details on the Node.js API, please check the Node.js platform documentation. ## Step 3: Testing Once again, we can rebuild and start the container with the form: ```bash sudo docker compose up --build ``` Then, navigate to http://localhost:8080/index.html and upload a scene or archive file exported from the CE.SDK Editor. It should use a text variable named `firstName` for the variant generation to work. Then press `Generate variants` and soon, a zip file should being downloading in your browser with all the exported image variants. ## Troubleshooting & Common Errors **❌ Error encountered while creating an EGL hardware-accelerated context, falling back to CPU rendering: EGL initialize error: UNKNOWN** - Make sure the GPU setup instructions were followed, this error indicates that a hardware OpenGL context could not be created inside the container. - When using Docker Compose, ensure your `docker-compose.yml` includes `runtime: nvidia`. - When using `docker run`, ensure you're using **both** `--runtime=nvidia` and `--gpus all` flags together. - This could also be expected if testing the container on a machine without a GPU. **❌ Error: `Invalid license key`** - Verify that your **license key** is correct and not expired, or remove the key entirely to get watermarked output. **❌ Error: `Max concurrency reached`** - The avlicensed variant of the Renderer only allows up to a certain number of instances running simultaneously, as negotiated in your contract. To avoid running into the limit, limit your max deployment size to below this limit, or implement an exponential backoff retry system. --- ## More Resources - **[Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md)** - Browse all Renderer documentation - **[Complete Documentation](https://img.ly/docs/cesdk/renderer/llms-full.txt)** - Full documentation in one file (for LLMs) - **[Web Documentation](https://img.ly/docs/cesdk/renderer/)** - Interactive documentation with examples - **[Support](mailto:support@img.ly)** - Contact IMG.LY support --- --- title: "Get Started" description: "Start integrating CE.SDK into your application—from understanding the SDK to running your first editor." platform: renderer url: "https://img.ly/docs/cesdk/renderer/get-started/overview-e18f40/" --- > This is one page of the CE.SDK Renderer documentation. For a complete overview, see the [Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md). For all docs in one file, see [llms-full.txt](https://img.ly/docs/cesdk/renderer/llms-full.txt). **Navigation:** [Get Started](https://img.ly/docs/cesdk/renderer/get-started/overview-e18f40/) --- Everything you need to integrate CE.SDK into your application. Learn what the SDK offers, get up and running with starter kits, explore AI-powered workflows, and understand our licensing model. --- ## Related Pages - [Overview](https://img.ly/docs/cesdk/renderer/cesdk-renderer-overview-7f3e9a/) - Learn about CE.SDK Renderer, the native Linux processing tool for high-performance automated image and design editing. - [Setup and Command-line Export](https://img.ly/docs/cesdk/renderer/get-started/commandline-4230bf/) - Getting started with CE.SDK Renderer - [Licensed codec setup](https://img.ly/docs/cesdk/renderer/get-started/commandline-4231be/) - Setting up the avlicensed variant of CE.SDK Renderer - [Benchmarks](https://img.ly/docs/cesdk/renderer/get-started/benchmarks-b3n4ch/) - Performance benchmarks and metrics for CE.SDK Renderer - [Troubleshooting](https://img.ly/docs/cesdk/renderer/get-started/troubleshooting-0t9fl1/) - Common issues and solutions when deploying and running the CE.SDK Renderer - [Patents & Acknowledgements](https://img.ly/docs/cesdk/renderer/get-started/patents-acknowledgements-9k2p4m/) - Patent information and third-party acknowledgements for CE.SDK Renderer - [Build with AI](https://img.ly/docs/cesdk/renderer/get-started/build-with-ai-k7m9p2/) - Give your AI coding assistant context about CE.SDK to generate accurate code and get instant answers. - [Licensing](https://img.ly/docs/cesdk/renderer/licensing-8aa063/) - Understand CE.SDK’s flexible licensing, trial options, and how keys work across dev, staging, and production. --- ## More Resources - **[Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md)** - Browse all Renderer documentation - **[Complete Documentation](https://img.ly/docs/cesdk/renderer/llms-full.txt)** - Full documentation in one file (for LLMs) - **[Web Documentation](https://img.ly/docs/cesdk/renderer/)** - Interactive documentation with examples - **[Support](mailto:support@img.ly)** - Contact IMG.LY support --- --- title: "Patents & Acknowledgements" description: "Patent information and third-party acknowledgements for CE.SDK Renderer" platform: renderer url: "https://img.ly/docs/cesdk/renderer/get-started/patents-acknowledgements-9k2p4m/" --- > This is one page of the CE.SDK Renderer documentation. For a complete overview, see the [Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md). For all docs in one file, see [llms-full.txt](https://img.ly/docs/cesdk/renderer/llms-full.txt). **Navigation:** [Get Started](https://img.ly/docs/cesdk/renderer/get-started/overview-e18f40/) > [Patents & Acknowledgements](https://img.ly/docs/cesdk/renderer/get-started/patents-acknowledgements-9k2p4m/) --- ## Why Patent Licensing Matters CE.SDK Renderer is a Linux-based tool distributed via Docker that performs audio and video encoding and decoding operations. Modern video codecs such as H.264 (MP4) and H.265 (HEVC) are protected by numerous patents held by various patent pools and licensing organizations. Unlike some proprietary operating systems that may include licensed codecs, Linux distributions and Docker containers typically do not include these codecs due to licensing restrictions and costs. To provide our customers with a fully legal, patent-safe solution that can be used commercially without risk of patent infringement, we have partnered with Fluendo S.A. Fluendo manages the complex patent licensing requirements on behalf of our users, ensuring that all necessary codec licenses are properly obtained and maintained. This allows you to use CE.SDK Renderer in commercial applications with confidence, knowing that all patent obligations are fulfilled. ## Codec Technologies The **avlicensed** commercial variant of CE.SDK Renderer includes products, performing audio and video encoding and decoding functions, which are provided by and are copyright of Fluendo S.A., and include the following technologies. This version can only be obtained through our dashboard and after signing up for a CE.SDK subscription. ### Notices **With respect to AVC (h.264)** THIS PRODUCT IS LICENSED UNDER THE AVC PATENT PORTFOLIO LICENSE FOR THE PERSONAL AND NONCOMMERCIAL USE OF A CONSUMER TO (i) ENCODE VIDEO IN COMPLIANCE WITH THE AVC STANDARD ("AVC VIDEO") AND/OR (ii) DECODE AVC VIDEO THAT WAS ENCODED BY A CONSUMER ENGAGED IN A PERSONAL AND NON-COMMERCIAL ACTIVITY AND/OR WAS OBTAINED FROM A VIDEO PROVIDER LICENSED TO PROVIDE AVC VIDEO. NO LICENSE IS GRANTED OR SHALL BE IMPLIED FOR ANY OTHER USE. ADDITIONAL INFORMATION MAY BE OBTAINED FROM MPEG LA, L.L.C. SEE HTTP://WWW.MPEGLA.COM
![Powered by Fluendo](fluendo_powered.png) --- ## More Resources - **[Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md)** - Browse all Renderer documentation - **[Complete Documentation](https://img.ly/docs/cesdk/renderer/llms-full.txt)** - Full documentation in one file (for LLMs) - **[Web Documentation](https://img.ly/docs/cesdk/renderer/)** - Interactive documentation with examples - **[Support](mailto:support@img.ly)** - Contact IMG.LY support --- --- title: "Troubleshooting" description: "Common issues and solutions when deploying and running the CE.SDK Renderer" platform: renderer url: "https://img.ly/docs/cesdk/renderer/get-started/troubleshooting-0t9fl1/" --- > This is one page of the CE.SDK Renderer documentation. For a complete overview, see the [Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md). For all docs in one file, see [llms-full.txt](https://img.ly/docs/cesdk/renderer/llms-full.txt). **Navigation:** [Get Started](https://img.ly/docs/cesdk/renderer/get-started/overview-e18f40/) > [Troubleshooting](https://img.ly/docs/cesdk/renderer/get-started/troubleshooting-0t9fl1/) --- This page covers common issues you may encounter when deploying and running the CE.SDK Renderer, along with solutions and diagnostic steps. ## Verifying Your Environment Before debugging specific issues, verify that your server meets all requirements by running our GPU requirements checker script inside your deployment environment (not inside the container). Download [`check-requirements.sh`](https://github.com/imgly/cesdk-renderer-examples/blob/$UBQ_VERSION$/check-requirements.sh) and run it: ```bash bash check-requirements.sh ``` The script checks for: - NVIDIA driver and GPU detection - NVENC hardware encoder availability - EGL context support (required for GPU-accelerated rendering) - Required system libraries - Docker GPU runtime configuration All items marked with a red X need to be addressed before the Renderer can use GPU acceleration. See the [Server setup guide](https://img.ly/docs/cesdk/renderer/get-started/commandline-4230bf/) for installation instructions. ### Reproduction baseline Our [live demo](https://img.ly/showcases/cesdk/export-using-renderer/web) is powered by a reference deployment of the CE.SDK Renderer. You can upload your scene or archive there to compare results against a known-good baseline before investigating further. ## GPU and Rendering Issues ### GPU is not being used for rendering **Symptoms**: Exports are significantly slower than expected, or verbose logs show `falling back to CPU rendering`. **Possible causes and solutions**: - **Missing `--runtime=nvidia` flag**: When using `docker run`, you must pass **both** `--runtime=nvidia` and `--gpus all`. Using only `--gpus all` is not sufficient. ```bash # Correct sudo docker run --runtime=nvidia --gpus all ... # Incorrect - GPU will not be available for rendering sudo docker run --gpus all ... ``` ```` - **Missing `runtime: nvidia` in Docker Compose**: When using Docker Compose, add `runtime: nvidia` to your service configuration: ```yaml services: renderer: image: docker.io/imgly/cesdk-renderer:$UBQ_VERSION$ runtime: nvidia deploy: resources: reservations: devices: - driver: nvidia count: all capabilities: [gpu] ```` - **NVIDIA Container Runtime not installed or configured**: Run the requirements checker script to verify. If missing, install the NVIDIA Container Toolkit and configure the runtime: ```bash sudo nvidia-ctk runtime configure --runtime=docker sudo systemctl restart docker ``` ```` - **Kubernetes / containerd environments**: If you're using containerd instead of Docker, ensure the NVIDIA device plugin is installed and your pod spec requests GPU resources. The `docker` and `nvidia-container-runtime` checks from the script may show failures, which is expected in a Kubernetes environment. ### EGL context creation failure **Error**: `Error encountered while creating an EGL hardware-accelerated context, falling back to CPU rendering: EGL initialize error: UNKNOWN` This means the Renderer could not create a hardware-accelerated OpenGL context. The Renderer will still work but will fall back to CPU rendering, which is significantly slower for video exports. - Verify the NVIDIA driver is installed on the host: `nvidia-smi` - Verify the NVIDIA EGL libraries are available: check for `libEGL_nvidia.so` and the vendor config at `/usr/share/glvnd/egl_vendor.d/10_nvidia.json` - Ensure the container has GPU access (see above) - If running on a machine without a GPU, this message is expected. Image exports will work but be slower, and video exports depend on available CPU resources. ### Forcing GPU-only rendering for validation To verify GPU acceleration is working correctly, pass `--render-device gpu` to the Renderer. This will cause the export to fail if GPU acceleration is unavailable, rather than silently falling back to CPU: ```bash sudo docker run --runtime=nvidia --gpus all \ docker.io/imgly/cesdk-renderer:$UBQ_VERSION$ \ --render-device gpu \ -i /input/scene.scene -o /output/result.mp4 ```` If this command fails, your GPU setup needs to be fixed before you can benefit from GPU acceleration. ## Video Encoding Performance ### Video exports are slower than expected The CE.SDK Renderer uses the CPU for video encoding by default, because CPU encoding supports higher output bitrates than GPU-based NVIDIA NVENC encoding. **Key factors that affect encoding performance**: | Factor | Impact | | --- | --- | | **Output bitrate** | Higher bitrates require more CPU processing power | | **CPU cores** | More cores speed up CPU-based encoding | | **Scene complexity** | More layers, effects and transitions increase rendering time | | **Output resolution** | Higher resolutions (4K) take longer | **If exports are taking much longer than expected**: 1. **Check that GPU rendering is active**: The EGL fallback warning is always printed to the output when GPU acceleration is unavailable. If you see it, GPU rendering is not being used. 2. **Compare against the baseline**: Export the same scene using our [live demo](https://img.ly/showcases/cesdk/export-using-renderer/web) to establish a reference time. 3. **Consider your CPU power**: If your instance has few CPU cores, CPU-based encoding at high bitrates will be slow. Options: - Use an instance with more CPU cores - Force GPU-based encoding (bitrate limited by resolution, see below) - Lower the requested output bitrate ### Forcing GPU-based video encoding You can force the Renderer to use the GPU for H.264 encoding by setting the `UBQ_AV_OVERRIDE_H264_ENCODER` environment variable. This speeds up encoding but limits the maximum output bitrate depending on the output resolution, due to NVIDIA NVENC hardware constraints: ```bash sudo docker run --runtime=nvidia --gpus all \ -e UBQ_AV_OVERRIDE_H264_ENCODER=vulkanh264enc \ docker.io/imgly/cesdk-renderer:$UBQ_VERSION$ \ -i /input/scene.scene -o /output/result.mp4 ``` ```bash sudo docker run --runtime=nvidia --gpus all \ -e UBQ_AV_OVERRIDE_H264_ENCODER=fluhwvanvench264enc \ docker.io/imgly/cesdk-renderer-avlicensed:$UBQ_VERSION$ \ -i /input/scene.scene -o /output/result.mp4 ``` > **Note:** GPU encoding limits the maximum output bitrate depending on the output resolution. If the requested bitrate exceeds what NVENC supports at a given resolution, you need to use CPU-based encoding with sufficient CPU resources. ### Choosing between CPU and GPU encoding | Encoding Mode | Bitrate Limit | Speed | When to Use | | --- | --- | --- | --- | | **CPU (default)** | Unlimited | Depends on CPU cores | High-quality output at any bitrate | | **GPU (NVENC)** | Resolution-dependent | Fast | Fast exports where the NVENC bitrate limit is acceptable | ## Licensed Codec Issues ### Open-source vs. licensed codec differences | Aspect | Open-source (`cesdk-renderer`) | Licensed (`cesdk-renderer-avlicensed`) | | --- | --- | --- | | **Patent coverage** | None (use at own risk) | H.264, H.265, AAC covered | | **Output quality** | Standard | Higher quality encoding | | **Performance** | Faster | Slower due to higher quality encoding and license handshake | | **Network requirement** | None when using archives or bundled assets | License activation requires network access | | **Use case** | Evaluation, prototyping | Production, commercial use | For details, see the [Licensed codec setup](https://img.ly/docs/cesdk/renderer/get-started/commandline-4231be/) page. ## Container and Deployment Issues ### Container fails to start - **Image not found**: Verify you are pulling the correct image name and tag. Licensed codec images require authentication: ```bash sudo docker login container.img.ly -u "oauth" -p "YOUR-API-KEY" ``` ``` - **Architecture mismatch**: The CE.SDK Renderer is built for `x86_64` (AMD64) Linux only. ARM-based instances (e.g. AWS Graviton) are not supported. ### Using containerd instead of Docker If your environment uses containerd (common in Kubernetes), the Docker-specific checks from the requirements script will fail. This is expected. Ensure: - The NVIDIA device plugin for Kubernetes is installed - Your pod spec requests `nvidia.com/gpu` resources - The container runtime is configured to use the NVIDIA runtime class ## Getting Help If you've verified your environment, compared results against the baseline, and still encounter issues: 1. Run the requirements checker script and include the output 2. Include the `--verbose` logs from the Renderer 3. Note the Renderer container version and variant you're using 4. Contact support at [support@img.ly](mailto:support@img.ly) ``` --- ## More Resources - **[Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md)** - Browse all Renderer documentation - **[Complete Documentation](https://img.ly/docs/cesdk/renderer/llms-full.txt)** - Full documentation in one file (for LLMs) - **[Web Documentation](https://img.ly/docs/cesdk/renderer/)** - Interactive documentation with examples - **[Support](mailto:support@img.ly)** - Contact IMG.LY support --- --- title: "Guides" description: "Documentation for Guides" platform: renderer url: "https://img.ly/docs/cesdk/renderer/guides-8d8b00/" --- > This is one page of the CE.SDK Renderer documentation. For a complete overview, see the [Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md). For all docs in one file, see [llms-full.txt](https://img.ly/docs/cesdk/renderer/llms-full.txt). **Navigation:** [Guides](https://img.ly/docs/cesdk/renderer/guides-8d8b00/) --- --- ## Related Pages - [Integrating into an Express.js Web Application](https://img.ly/docs/cesdk/renderer/get-started/expressjs-9f25eb/) - Invoking CE.SDK Renderer from Node.js - [Headless Automation using the Node.js API before Export](https://img.ly/docs/cesdk/renderer/get-started/node-processing-a2e4dc/) - Invoking CE.SDK Renderer from Node.js after processing a scene with the Node.js API --- ## More Resources - **[Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md)** - Browse all Renderer documentation - **[Complete Documentation](https://img.ly/docs/cesdk/renderer/llms-full.txt)** - Full documentation in one file (for LLMs) - **[Web Documentation](https://img.ly/docs/cesdk/renderer/)** - Interactive documentation with examples - **[Support](mailto:support@img.ly)** - Contact IMG.LY support --- --- title: "Key Capabilities" description: "Explore CE.SDK’s key features—manual editing, automation, templates, AI tools, and full UI and API control." platform: renderer url: "https://img.ly/docs/cesdk/renderer/key-capabilities-dbb5b1/" --- > This is one page of the CE.SDK Renderer documentation. For a complete overview, see the [Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md). For all docs in one file, see [llms-full.txt](https://img.ly/docs/cesdk/renderer/llms-full.txt). **Navigation:** [Concepts](https://img.ly/docs/cesdk/renderer/concepts-c9ff51/) > [Key Capabilities](https://img.ly/docs/cesdk/renderer/key-capabilities-dbb5b1/) --- This guide gives you a high-level look at what CreativeEditor SDK (CE.SDK) can do—and how deeply it can integrate into your workflows. Whether you’re building a design editor into your product, enabling automation, or scaling personalized content creation, CE.SDK provides a flexible and future-ready foundation. [Launch Web Demo](https://img.ly/showcases/cesdk) It’s designed for developers, product teams, and technical decision-makers evaluating how CE.SDK fits their use case. - Custom-built rendering engine for consistent cross-platform performance - Flexible enough for both low-code and fully custom implementations ## Multi-modal CE.SDK supports a wide range of content types and formats: - Input types: images, video, audio, structured data, templates - Output formats: PNG, JPEG, WebP, PDF, raw data ## Content Libraries CE.SDK ships with a robust system for managing reusable content: - Built-in libraries of stickers, icons, overlays, and fonts - Integration with third-party providers like Getty Images, Unsplash, or Airtable - Programmatic filtering and categorization - Organize by brand, user, or use case This makes it easy to deliver a seamless editing experience—no matter how many assets you manage. --- ## More Resources - **[Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md)** - Browse all Renderer documentation - **[Complete Documentation](https://img.ly/docs/cesdk/renderer/llms-full.txt)** - Full documentation in one file (for LLMs) - **[Web Documentation](https://img.ly/docs/cesdk/renderer/)** - Interactive documentation with examples - **[Support](mailto:support@img.ly)** - Contact IMG.LY support --- --- title: "Key Concepts" description: "Explore CE.SDK’s key features—manual editing, automation, templates, AI tools, and full UI and API control." platform: renderer url: "https://img.ly/docs/cesdk/renderer/key-concepts-21a270/" --- > This is one page of the CE.SDK Renderer documentation. For a complete overview, see the [Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md). For all docs in one file, see [llms-full.txt](https://img.ly/docs/cesdk/renderer/llms-full.txt). **Navigation:** [Concepts](https://img.ly/docs/cesdk/renderer/concepts-c9ff51/) > [Key Concepts](https://img.ly/docs/cesdk/renderer/key-concepts-21a270/) --- CE.SDK is built on two distinct technical layers that work together seamlessly: - **User Interface** — Pre-built editors optimized for different use cases - **Engine Interface** — Core rendering and processing engine ![The different layers CE.SDK is made of, see description below.](layers.png) This intentional separation gives you powerful advantages: 1. **Cross-platform consistency** – The engine is cross-compiled to native web, iOS, Android, and Node.js, ensuring identical output everywhere 2. **Custom UI** – Build your own UI for simpler tools and workflows 3. **Headless automation** – Run the engine independently for automations and batch processing, both client-side and server-side ## Creative Engine The Creative Engine powers all core editing operations. It handles rendering, processing, and manipulation across images, layouts, text, video, audio, and vectors. **What the Engine Does:** - Maintains the scene file (your structured content) - Renders the canvas in real-time - Handles block positioning and resizing - Applies filters and effects to images - Manages text editing and typography - Controls templates with role-based permissions - Displays smart guides and snap lines Every engine capability is exposed through a comprehensive API, letting you build custom UIs, workflows, and automations. ## Headless / Engine only Use the engine without any UI for powerful automation scenarios: **Client-side automation** Perfect for in-browser batch operations and dynamic content generation without server dependencies. **Server-side automation with Node.js** Use the [Node.JS SDK](#broken-link-2e7acd) for following scenarios: - **High-resolution processing** – Edit on the client with preview quality, then render server-side with full-resolution assets - **Bulk generation** – Create a large volume of design variations for variable data printing - **Non-blocking workflows** – Let users continue designing while exports process in the background **Server-side export with the CE.SDK Renderer** When exporting complex graphics and videos, the [CE.SDK Renderer](https://img.ly/docs/cesdk/renderer/cesdk-renderer-overview-7f3e9a/) can make use of GPU acceleration and video codecs on Linux server environments. **Plugin development** When building CE.SDK plugins, you get direct API access to manipulate canvas elements programmatically. ## User Interface Components CE.SDK includes pre-built UI configurations optimized for different use cases: - **Photo editing** — Advanced image editing tools and filters - **Video editing** — Timeline-based video editing and effects - **Design editing** — Layout and graphic design tools (similar to Canva) - **2D product design** — Apparel, postcards, and custom product templates More configurations are coming based on customer needs. ## UI Customization While UI configurations provide a solid foundation, you maintain control over the user experience: - Apply **custom color schemes** and branding to match your product - Add **custom asset libraries** with your own fonts, images, graphics, videos, and audio The plugin architecture lets you add custom buttons and panels throughout the interface, ensuring the editor feels native to your product. --- ## More Resources - **[Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md)** - Browse all Renderer documentation - **[Complete Documentation](https://img.ly/docs/cesdk/renderer/llms-full.txt)** - Full documentation in one file (for LLMs) - **[Web Documentation](https://img.ly/docs/cesdk/renderer/)** - Interactive documentation with examples - **[Support](mailto:support@img.ly)** - Contact IMG.LY support --- --- title: "Licensing" description: "Understand CE.SDK’s flexible licensing, trial options, and how keys work across dev, staging, and production." platform: renderer url: "https://img.ly/docs/cesdk/renderer/licensing-8aa063/" --- > This is one page of the CE.SDK Renderer documentation. For a complete overview, see the [Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md). For all docs in one file, see [llms-full.txt](https://img.ly/docs/cesdk/renderer/llms-full.txt). **Navigation:** [Get Started](https://img.ly/docs/cesdk/renderer/get-started/overview-e18f40/) > [Licensing](https://img.ly/docs/cesdk/renderer/licensing-8aa063/) --- Thanks for your interest in CreativeEditor SDK (CE.SDK). We offer flexible commercial licensing options to support teams and projects of all sizes. Whether you're building a new product or scaling an existing one, our goal is to provide the best creative editing experience—backed by a licensing model that aligns with your needs. Get in touch with us through our [contact sales form](https://img.ly/forms/contact-sales). ## Commercial Licensing CE.SDK is offered through a subscription-based commercial model. This allows us to: - Deliver ongoing updates and performance improvements - Ensure compatibility with new browsers and devices - Provide dedicated technical support - Build long-term partnerships with our customers ## How Licensing Works CE.SDK licenses are tied to a single commercial product instance, verified by the hostname for web apps and bundle/app ID for mobile apps. Licensing typically uses remote validation and includes lightweight event tracking. It’s possible to disable tracking or use offline-compatible options. To explore these options, [contact our sales team](https://img.ly/forms/contact-sales). ## Trial License Key Trial licenses are available for evaluation and testing and are valid for **30 days**. They provide full access to CE.SDK’s features so you can explore its capabilities in your environment. If you need more time to evaluate, [contact our sales team](https://img.ly/forms/contact-sales). ## Testing and Production Paid license keys can be used across development, staging, and production environments. Multiple domains or app identifiers can be added to support this setup. --- ## More Resources - **[Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md)** - Browse all Renderer documentation - **[Complete Documentation](https://img.ly/docs/cesdk/renderer/llms-full.txt)** - Full documentation in one file (for LLMs) - **[Web Documentation](https://img.ly/docs/cesdk/renderer/)** - Interactive documentation with examples - **[Support](mailto:support@img.ly)** - Contact IMG.LY support --- --- title: "LLMs.txt" description: "Our documentation is available in LLMs.txt format" platform: renderer url: "https://img.ly/docs/cesdk/renderer/llms-txt-eb9cc5/" --- > This is one page of the CE.SDK Renderer documentation. For a complete overview, see the [Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md). For all docs in one file, see [llms-full.txt](https://img.ly/docs/cesdk/renderer/llms-full.txt). **Navigation:** [Get Started](https://img.ly/docs/cesdk/renderer/get-started/overview-e18f40/) > [Build with AI](https://img.ly/docs/cesdk/renderer/get-started/build-with-ai-k7m9p2/) > [LLMs.txt](https://img.ly/docs/cesdk/renderer/llms-txt-eb9cc5/) --- > **Note:** You can also connect your AI assistant directly to our documentation using our [MCP Server](https://img.ly/docs/cesdk/renderer/get-started/mcp-server-fde71c/). This enables real-time search and retrieval without downloading large files. Our documentation is now available in LLMs.txt format, optimized for AI reasoning engines. To better support platform-specific development, we've created separate documentation files for each platform. For developers, this means you can now access documentation tailored to your specific platform, whether it's iOS, Android, Web, or any other supported platform. This approach allows for a more focused and efficient use of AI tools in your development workflow. [Download](getFullUrl\(`/$\{props.platform.slug}/llms-full.txt`\)) These documentation files are substantial in size, with token counts exceeding the context windows of many AI models. This guide explains how to download and effectively use these platform-specific documentation files with AI tools to accelerate your development process. ## What are LLMs.txt files? LLMs.txt is an emerging standard for making documentation AI-friendly. Unlike traditional documentation formats, LLMs.txt: - Presents content in a clean, markdown-based format - Eliminates extraneous HTML, CSS, and JavaScript - Optimizes content for AI context windows - Provides a comprehensive view of documentation in a single file By using our platform-specific LLMs.txt files, you'll ensure that AI tools have the most relevant and complete context for helping with your development tasks. ## Markdown Content Negotiation Our documentation pages also serve clean markdown directly when requested with the `Accept: text/markdown` HTTP header. AI agents and tools that support content negotiation can fetch any documentation page and receive a markdown response instead of HTML — no separate download required. ```bash curl -H "Accept: text/markdown" https://img.ly/docs/cesdk/react/get-started/overview/ ``` This means AI tools like web-browsing agents can access individual pages in a format optimized for their context windows without needing the full LLMs.txt bundle. ## Handling Large Documentation Files Due to the size of our documentation files (upward of 500 000 tokens) most AI tools will face context window limitations. Standard models typically have context windows ranging from 8,000 to 200,000 tokens, making it challenging to process our complete documentation in a single session. ### Using Large Documentation Files To work with our complete documentation files, use an AI model with a large context window. Many current models support 200,000+ tokens, and some support over 1 million tokens. Check your model's context window limits when loading the full documentation file. --- ## More Resources - **[Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md)** - Browse all Renderer documentation - **[Complete Documentation](https://img.ly/docs/cesdk/renderer/llms-full.txt)** - Full documentation in one file (for LLMs) - **[Web Documentation](https://img.ly/docs/cesdk/renderer/)** - Interactive documentation with examples - **[Support](mailto:support@img.ly)** - Contact IMG.LY support --- --- title: "Security" description: "Learn how CE.SDK keeps your data private with client-side processing, secure licensing, and GDPR-compliant practices." platform: renderer url: "https://img.ly/docs/cesdk/renderer/security-777bfd/" --- > This is one page of the CE.SDK Renderer documentation. For a complete overview, see the [Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md). For all docs in one file, see [llms-full.txt](https://img.ly/docs/cesdk/renderer/llms-full.txt). **Navigation:** [Compatibility & Security](https://img.ly/docs/cesdk/renderer/compatibility-fef719/) > [Security](https://img.ly/docs/cesdk/renderer/security-777bfd/) --- This document provides a comprehensive overview of CE.SDK's security practices, focusing on data handling, privacy, and our commitment to maintaining the highest standards of security for our customers and their end users. ## Key Security Features - **Client-Side Processing**: All image and design processing occurs directly on the user's device or your servers, not on our servers - **No Data Transmission**: Your content (e.g. images, designs, templates, videos, audio, etc.) is never uploaded to or processed on IMG.LY servers - **Minimal Data Collection**: We only collect device identifiers and count exports for licensing purposes - **GDPR Compliance**: Our data collection practices adhere to GDPR regulations - **Secure Licensing**: Enterprise licenses are secured with RSA SHA256 encryption ## Data Protection & Access Controls ### Data Collection CE.SDK requires minimal data to provide its services. The only potentially personally identifiable information (PII) collected includes device-specific identifiers such as `identifierForVendor` on iOS and `ANDROID_ID` on Android. These identifiers are: - Used solely for tracking monthly active users for our usage-based pricing models - Reset when the user reinstalls the app or resets their device - Collected under GDPR's legitimate interest provision (no explicit consent required as they are necessary for our licensing system) Additionally, we track export operations for billing purposes in usage-based pricing models. For enterprise customers who prefer more accurate tracking, integrators can provide their own userID. This allows for more precise measurement of usage without requiring additional device identifiers. ### Data Storage & Encryption **We do not collect or store user data beyond the device identifiers and export counts mentioned above.** Since CE.SDK operates entirely client-side: - All content processing happens on the user's device - No images, designs, or user content is transmitted to IMG.LY servers - No content data is stored on IMG.LY infrastructure We use standard HTTPS (SSL/TLS) encryption for all communications between CE.SDK instances and our licensing backend. ### Access Controls We are using established industry standard practices to handle sensitive customer data. Therefore access control concerns are minimized. The limited data we do handle is protected as follows: - Billing information is stored in Stripe and accessed only by members of our finance team and C-level executives - API keys and credentials are stored securely in 1Password or GitHub with granular access levels - All employees sign Confidentiality Agreements to protect customer information This refers to data of our direct customers, not their users or customers. ## Licensing System CE.SDK uses a licensing system that works as follows: 1. During instantiation, an API key is provided to the CE.SDK instance 2. This API key is held in memory (never stored permanently on the device) 3. The SDK validates the key with our licensing backend 4. Upon successful validation, the backend returns a temporary local license 5. This license is periodically refreshed to maintain valid usage For browser implementations, we protect licenses against misuse by pinning them to specific domains. For mobile applications, licenses are pinned to the application identifiers to prevent unauthorized use. For enterprise customers, we offer an alternative model: - A license file is passed directly to the instance - No communication with our licensing service is required - Licenses are secured using RSA SHA256 encryption ### CE.SDK Renderer CE.SDK Renderer is a specialized variant of CE.SDK that consists of a native Linux binary bundled in a Docker container. It uses GPU acceleration and native code to render scenes and archives to various export formats. Due to bundled third-party codecs (mainly H.264 & H.265) and their associated patent requirements, CE.SDK Renderer implements additional licensing communication beyond the standard licensing handshake: 1. **Initial License Validation**: The tool performs the standard license validation with our licensing backend 2. **Periodic Heartbeats**: After successful validation, it sends periodic heartbeats to our licensing backend to track the number of active instances 3. **Instance Limits**: We limit the maximum number of active instances per license based on the settings in your dashboard 4. **Activation Control**: If the instance limit is exceeded, further activations (launches) of the tool will fail with a descriptive error message This additional communication allows us to ensure compliance with codec licensing requirements while providing transparent usage tracking for your organization. As with all CE.SDK products, no user data (images, videos, designs, or other content) is transmitted to IMG.LY servers - only device identifiers and instance counts are collected for licensing purposes. ## Security Considerations for User Input As CE.SDK deals primarily with arbitrary user input, we've implemented specific security measures to handle data safely: - The CreativeEngine reads files from external resources to fetch images, fonts, structured data, and other sources for designs. These reads are safeguarded by platform-specific default measures. - The engine never loads executable code or attempts to execute any data acquired from dynamic content. It generally relies on provided mime types to decode image data or falls back to byte-level inspection to choose the appropriate decoder. - For data writing operations, we provide a callback that returns a pointer to the to-be-written data. The engine itself never unconditionally writes to an externally defined path. If it writes to files directly, these are part of internal directories and can't be modified externally. - Generated PDFs may have original image files embedded if the image was not altered via effects or blurs and the `exportPdfWithHighCompatibility` option was **not** enabled. This means a malicious image file could theoretically be included in the exported PDF. - Inline text-editing allows arbitrary input of strings by users. The engine uses platform-specific default inputs and APIs and doesn't apply additional sanitization. The acquired strings are stored and used exclusively for text rendering - they are neither executed nor used for file operations. ## Security Infrastructure ### Vulnerability Management We take a proactive approach to security vulnerability management: - We use GitHub to track dependency vulnerabilities - We regularly update affected dependencies - We don't maintain a private network, eliminating network vulnerability concerns in that context - We don't manually maintain servers or infrastructure, as we don't have live systems beyond those required for licensing - For storage and licensing, we use virtual instances in Google Cloud which are managed by the cloud provider - All security-related fixes are published in our public changelog at [https://img.ly/docs/cesdk/changelog/](https://img.ly/docs/cesdk/changelog/) ### Security Development Practices Our development practices emphasize security: - We rely on established libraries with proven security track records - We don't directly process sensitive user data in our code - Secrets (auth tokens, passwords, API credentials, certificates) are stored in GitHub or 1Password with granular access levels - We use RSA SHA256 encryption for our enterprise licenses - We rely on platform-standard SSL implementations for HTTPS communications ### API Key Management API keys for CE.SDK are handled securely: - Keys are passed during instantiation and held in memory only - Keys are never stored permanently on client devices - For web implementation, keys are pinned to specific domains to prevent unauthorized use - Enterprise licenses use a file-based approach that doesn't require API key validation ## Compliance IMG.LY complies with the General Data Protection Regulation (GDPR) in all our operations, including CE.SDK. Our Privacy Policy is publicly available at [https://img.ly/privacy-policy](https://img.ly/privacy-policy). Our client-side approach to content processing significantly reduces privacy and compliance concerns, as user content never leaves their device environment for processing. ## FAQ ### Does CE.SDK upload my images or designs to IMG.LY servers? No. CE.SDK processes all content locally on the user's device. Your images, designs, and other content are never transmitted to IMG.LY servers. ### What data does IMG.LY collect through CE.SDK? CE.SDK only collects device identifiers (such as identifierForVendor on iOS or ANDROID\_ID on Android) for licensing purposes and export counts. No user content or personal information is collected. ### How does IMG.LY protect API keys? API keys are never stored permanently; they are held in memory during SDK operation. For web implementations, keys are pinned to specific domains to prevent unauthorized use. ### Has IMG.LY experienced any security breaches? No, IMG.LY has not been involved in any cybersecurity breaches in the last 12 months. ### Does IMG.LY conduct security audits? As we don't store customer data directly, but rely on third parties to do so, we focus our security efforts on dependency tracking and vulnerability management through GitHub's security features. We don't conduct security audits. ## Additional Information For more detailed information about our data collection practices, please refer to our Data Privacy and Retention information below. Should you have any additional questions regarding security practices or require more information, please contact our team at [support@img.ly](mailto:support@img.ly). ## Data Privacy and Retention At IMG.LY, we prioritize your data privacy and ensure that apart from a minimal contractually stipulated set of interactions with our servers all other operations take place on your local device. Below is an overview of our data privacy and retention policies: ### **Data Processing** All data processed by CE.SDK remains strictly on your device. We do not transfer your data to our servers for processing. This means that operations such as rendering, editing, and other in-app functionalities happen entirely locally, ensuring that sensitive project or personal data stays with you. ### **Data Retention** We do not store any project-related data on our servers. Since all data operations occur locally, no information about your edits, images, or video content is retained by CE.SDK. The only data that interacts with our servers is related to license validation and telemetry related to usage tied to your pricing plan. ### **License Validation** CE.SDK performs a license validation check with our servers once upon initialization to validate the software license being used. This interaction is minimal and does not involve the transfer of any personal, project, or media data. ### **Event Tracking** While CE.SDK does not track user actions other than the exceptions listed below through telemetry or analytics by default, there are specific events tracked to manage customer usage, particularly for API key usage tracking. We gather the following information during these events: - **When the engine loads:** App identifier, platform, engine version, user ID (provided by the client), device ID (mobile only), and session ID. - **When a photo or video is exported:** User ID, device ID, session ID, media type (photo/video), resolution (width and height), FPS (video only), and duration (video only). This tracking is solely for ensuring accurate usage calculation and managing monthly active user billing. Enterprise clients can opt out of this tracking under specific agreements. ### **Personal Identifiable Information (PII)** The only PII that is potentially collected includes device-specific identifiers such as `identifierForVendor` on iOS and `ANDROID_ID` on Android. These IDs are used for tracking purposes and are reset when the user reinstalls the app or resets the device. No consent is required for these identifiers because they are crucial for our usage-based pricing models. This is covered by the GDPR as legitimate interest. ### **User Consent** As mentioned above, user consent is not required when solely using the CE.SDK. However, this may change depending on the specific enterprise agreement or additional regulatory requirements. IMG.LY is committed to maintaining compliance with **GDPR** and other applicable data protection laws, ensuring your privacy is respected at all times. For details consult our [privacy policy](https://img.ly/privacy-policy). --- ## More Resources - **[Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md)** - Browse all Renderer documentation - **[Complete Documentation](https://img.ly/docs/cesdk/renderer/llms-full.txt)** - Full documentation in one file (for LLMs) - **[Web Documentation](https://img.ly/docs/cesdk/renderer/)** - Interactive documentation with examples - **[Support](mailto:support@img.ly)** - Contact IMG.LY support --- --- title: "Upgrade" description: "Learn how to upgrade CE.SDK and apply required changes when migrating between major SDK versions." platform: renderer url: "https://img.ly/docs/cesdk/renderer/upgrade-4f8715/" --- > This is one page of the CE.SDK Renderer documentation. For a complete overview, see the [Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md). For all docs in one file, see [llms-full.txt](https://img.ly/docs/cesdk/renderer/llms-full.txt). **Navigation:** [Upgrading](https://img.ly/docs/cesdk/renderer/upgrade-4f8715/) --- --- ## More Resources - **[Renderer Documentation Index](https://img.ly/docs/cesdk/renderer.md)** - Browse all Renderer documentation - **[Complete Documentation](https://img.ly/docs/cesdk/renderer/llms-full.txt)** - Full documentation in one file (for LLMs) - **[Web Documentation](https://img.ly/docs/cesdk/renderer/)** - Interactive documentation with examples - **[Support](mailto:support@img.ly)** - Contact IMG.LY support