Configure CE.SDK to load engine and content assets from your own servers instead of the IMG.LY CDN for production deployments.
Self-hosting assets is required for production use. The IMG.LY CDN is intended for development and prototyping only—you’ll see a console warning when using the default CDN configuration. Hosting assets yourself gives you control over performance, availability, and compliance requirements.
Use the switch below to choose your setup: the full Editor (@cesdk/cesdk-js), which registers asset sources through editor plugins, or a Headless custom UI (@cesdk/engine), which registers them directly with the engine API.
The full editor registers asset sources through plugins imported from @cesdk/cesdk-js/plugins, each of which accepts a baseURL option.
Download Assets (v1.77.1)
Quick Start#
Download and extract the essential assets for your SDK version:
# Download assets for current SDK versioncurl -O https://cdn.img.ly/packages/imgly/cesdk-js/1.77.1/imgly-assets.zip
# Create versioned directory and extract assetsmkdir -p public/cesdk/1.77.1unzip imgly-assets.zip -d public/cesdk/1.77.1/rm imgly-assets.zipThen configure CE.SDK to use your self-hosted assets:
import CreativeEditorSDK from '@cesdk/cesdk-js';import { BlurAssetSource, ImageColorsAssetSource, ColorPaletteAssetSource, CropPresetsAssetSource, DemoAssetSources, EffectsAssetSource, FiltersAssetSource, PagePresetsAssetSource, StickerAssetSource, TextAssetSource, TextComponentAssetSource, TypefaceAssetSource, UploadAssetSources, VectorShapeAssetSource} from '@cesdk/cesdk-js/plugins';
const config = { license: 'YOUR_CESDK_LICENSE_KEY', baseURL: `https://cdn.yourdomain.com/cesdk/${CreativeEditorSDK.version}/`};
CreativeEditorSDK.create(container, config).then(async (cesdk) => { const assetBaseURL = `https://cdn.yourdomain.com/cesdk/${CreativeEditorSDK.version}/`;
// Add default asset source plugins await cesdk.addPlugin(new BlurAssetSource({ baseURL: assetBaseURL })); await cesdk.addPlugin(new ColorPaletteAssetSource({ baseURL: assetBaseURL })); await cesdk.addPlugin(new CropPresetsAssetSource({ baseURL: assetBaseURL })); await cesdk.addPlugin(new EffectsAssetSource({ baseURL: assetBaseURL })); await cesdk.addPlugin(new FiltersAssetSource({ baseURL: assetBaseURL })); await cesdk.addPlugin(new PagePresetsAssetSource({ baseURL: assetBaseURL })); await cesdk.addPlugin(new StickerAssetSource({ baseURL: assetBaseURL })); await cesdk.addPlugin(new TextAssetSource({ baseURL: assetBaseURL })); await cesdk.addPlugin( new TextComponentAssetSource({ baseURL: assetBaseURL }) ); await cesdk.addPlugin(new TypefaceAssetSource({ baseURL: assetBaseURL })); await cesdk.addPlugin(new VectorShapeAssetSource({ baseURL: assetBaseURL }));
// Add demo and upload sources await cesdk.addPlugin( new UploadAssetSources({ include: ['ly.img.image.upload'] }) ); await cesdk.addPlugin( new DemoAssetSources({ include: [ 'ly.img.templates.blank.*', 'ly.img.templates.presentation.*', 'ly.img.templates.print.*', 'ly.img.templates.social.*', 'ly.img.image.*' ] }) );});Configuration Options#
Browser configuration involves three settings: baseURL, core.baseURL, and the baseURL option for asset sources.
Editor Configuration#
Pass configuration to CreativeEditorSDK.create():
import CreativeEditorSDK from '@cesdk/cesdk-js';
const config = { baseURL: `https://cdn.yourdomain.com/cesdk/${CreativeEditorSDK.version}/`, core: { baseURL: 'core/' }};
CreativeEditorSDK.create(container, config).then((cesdk) => { // Editor initialized with self-hosted assets});baseURL — Base path for all engine assets. Can be an absolute URL or a relative path. Relative paths resolve against window.location.href. Defaults to the IMG.LY CDN.
core.baseURL — Path to WASM files. Defaults to core/ relative to baseURL. Usually you don’t need to change this unless hosting WASM files separately.
Asset Sources Configuration#
Each asset-source plugin accepts a baseURL option pointing at your self-hosted assets:
await cesdk.addPlugin(new StickerAssetSource({ baseURL: assetBaseURL }));await cesdk.addPlugin(new TypefaceAssetSource({ baseURL: assetBaseURL }));The baseURL must be an absolute URL. The engine looks up each source’s definition at {baseURL}/{sourceId}/content.json and references files like {baseURL}/{sourceId}/images/example.png. Register the full set the same way—the Quick Start above shows the complete list.
Default Asset Sources#
Adding the default asset source plugins registers these asset sources:
ly.img.sticker- Stickersly.img.sticker.misc- Additional stickersly.img.vector.shape- Shapes and arrowsly.img.typeface- Font definitionsly.img.color.palette- Color palettesly.img.filter- Filter effectsly.img.effect- Visual effectsly.img.blur- Blur presetsly.img.crop.presets- Crop aspect ratiosly.img.page.presets- Page format presetsly.img.page.presets.video- Video page presetsly.img.caption.presets- Caption formattingly.img.text- Text style presets (Plain Text)ly.img.text.styles- Text style presets (Text Styles)ly.img.text.curves- Text style presets (Curved Text)ly.img.text.components- Text combinationsly.img.animation- Animation presetsly.img.animation.text- Text animation presets
Demo Asset Sources#
Adding the DemoAssetSources and UploadAssetSources plugins registers sample content sources for development:
ly.img.image- Sample imagesly.img.video- Sample videosly.img.audio- Sample audioly.img.template- Design templatesly.img.video.template- Video templatesly.img.image.upload,ly.img.video.upload,ly.img.audio.upload- Upload sources
These are intended for development and prototyping—replace them with your own content in production.
Excluding Unused Asset Sources#
If you only need a subset of default assets, simply omit the plugins you don’t need. For example, to skip stickers and video page presets, add all plugins except StickerAssetSource and the video page presets:
// Only add the plugins you needawait cesdk.addPlugin(new BlurAssetSource());await cesdk.addPlugin(new ImageColorsAssetSource());await cesdk.addPlugin(new ColorPaletteAssetSource());await cesdk.addPlugin(new CropPresetsAssetSource());await cesdk.addPlugin(new EffectsAssetSource());await cesdk.addPlugin(new FiltersAssetSource());await cesdk.addPlugin(new PagePresetsAssetSource());// StickerAssetSource omittedawait cesdk.addPlugin(new TextAssetSource());await cesdk.addPlugin(new TextComponentAssetSource());await cesdk.addPlugin(new TypefaceAssetSource());await cesdk.addPlugin(new VectorShapeAssetSource());This reduces initial load time by not fetching unused asset definitions.
When you build your own UI on the headless @cesdk/engine, don’t use the @cesdk/cesdk-js/plugins asset-source plugins—they are coupled to the editor and pull it in. Instead, set baseURL when initializing the engine and register each content asset source directly through the engine API.
Download Assets (v1.77.1)
Quick Start#
Download and extract the assets for your SDK version:
# Download assets for current SDK versioncurl -O https://cdn.img.ly/packages/imgly/cesdk-engine/1.77.1/imgly-assets.zip
# Create versioned directory and extract assetsmkdir -p public/cesdk/1.77.1unzip imgly-assets.zip -d public/cesdk/1.77.1/rm imgly-assets.zipInitialize with a Base URL#
Set baseURL to the location where you extracted the archive. The engine loads core/, fonts/, and emoji/ from this location, and resolves each asset source relative to it.
import CreativeEngine from '@cesdk/engine';
const engine = await CreativeEngine.init({ license: 'YOUR_CESDK_LICENSE_KEY', baseURL: `https://cdn.yourdomain.com/cesdk/${CreativeEngine.version}/`});The engine’s default baseURL already points at the cesdk-engine CDN, so you only need to set it when self-hosting for production.
Register Asset Sources#
Register the content sources you need by pointing each one at its content.json under the base URL. engine.getBaseURL() returns the configured base:
const baseURL = engine.getBaseURL();
for (const sourceId of [ 'ly.img.sticker', 'ly.img.vector.shape', 'ly.img.typeface', 'ly.img.color.palette']) { await engine.asset.addLocalAssetSourceFromJSONURI( `${baseURL}${sourceId}/content.json` );}Pass a matcher to load only a subset of a source’s assets:
await engine.asset.addLocalAssetSourceFromJSONURI( `${baseURL}ly.img.sticker/content.json`, { matcher: ['*emoji*'] });For user uploads, register a local source with the MIME types it accepts:
engine.asset.addLocalSource('ly.img.image.upload', ['image/png', 'image/jpeg']);For the full list of source IDs and matcher filtering, see the Default Assets guide.
Understanding CE.SDK Assets#
CE.SDK assets are distributed in an imgly-assets.zip file available for download from the IMG.LY CDN. Understanding what’s in this archive helps you decide which assets to host and how to keep them updated. Both packages use the same archive layout; only the download location differs (cesdk-js for the editor, cesdk-engine for the headless engine).
Asset Categories#
The ZIP file contains directories organized by function:
| Directory | Contents | Version-Locked? | Required? |
|---|---|---|---|
core/ | WASM engine files (.wasm, .data, worker-host.js) | Yes | Yes |
ui/ | UI resources (audio waveform, fonts, stylesheets) | Yes | Yes |
emoji/ | Emoji assets | Yes | Yes |
fonts/ | System fonts | Yes | Yes |
i18n/ | Translations | Yes | No (bundled in SDK) |
ly.img.sticker/ | Stickers | No | If using default assets |
ly.img.sticker.misc/ | Additional stickers | No | If using default assets |
ly.img.vector.shape/ | Shapes and arrows | No | If using default assets |
ly.img.typeface/ | Font definitions | No | If using default assets |
ly.img.filter/ | Filter effects (LUT and duotone) | No | If using default assets |
ly.img.effect/ | Visual effects | No | If using default assets |
ly.img.blur/ | Blur presets | No | If using default assets |
ly.img.color.palette/ | Color palettes | No | If using default assets |
ly.img.crop.presets/ | Crop aspect ratios | No | If using default assets |
ly.img.page.presets/ | Page format presets | No | If using default assets |
ly.img.page.presets.video/ | Video page presets | No | If using default assets |
ly.img.caption.presets/ | Caption formatting presets | No | If using default assets |
ly.img.text/ | Text style presets (Plain Text) | No | If using default assets |
ly.img.text.styles/ | Text style presets (Text Styles) | No | If using default assets |
ly.img.text.curves/ | Text style presets (Curved Text) | No | If using default assets |
ly.img.text.components/ | Text combinations | No | If using default assets |
ly.img.animation/ | Animation presets | No | If using default assets |
ly.img.animation.text/ | Text animation presets | No | If using default assets |
ly.img.image/ | Sample images (demo content) | No | No |
ly.img.video/ | Sample videos (demo content) | No | No |
ly.img.audio/ | Sample audio (demo content) | No | No |
ly.img.template/ | Design templates (demo content) | No | No |
ly.img.video.template/ | Video templates (demo content) | No | No |
For most integrations, you need core/, ui/, emoji/, fonts/, and the ly.img.* asset sources you use.
Version-Locked vs. Independent Assets#
Version-locked assets (core/, ui/, i18n/) must match your SDK version. Mismatched versions cause load errors—the engine will fail to initialize if core files don’t match.
Independent assets (ly.img.* directories) can be updated separately. Register each one as an asset source that points at its content.json under your baseURL. Check the changelog when upgrading to see if asset versions have changed.
Engine-Level Assets#
The engine uses additional assets for font fallback (Unicode character coverage) and emoji rendering. When you configure baseURL for self-hosting, the engine automatically uses the same location for these assets:
- Font fallback files — Used when text contains characters not covered by the selected font. Located at
{baseURL}/fonts/font-{index}.ttf. - Emoji font — The default emoji font (NotoColorEmoji.ttf). Located at
{baseURL}/emoji/NotoColorEmoji.ttf.
The fonts/ and emoji/ directories are already included in the imgly-assets.zip download, so no additional configuration is needed when self-hosting—just ensure these directories are present at your baseURL location.
Troubleshooting#
WASM Load Errors#
If the engine fails to initialize with missing .wasm or .data errors, verify:
- The assets ZIP version matches your SDK version
- The
core.baseURLpoints to the correct directory - Your server returns correct MIME types for
.wasmfiles (application/wasm)
404 Errors for Assets#
If the console shows 404 errors for content.json files:
- Verify the
baseURLyour asset sources resolve against is correct - Check that asset directories exist at the expected paths
- Configure CORS headers if serving assets from a different domain
CDN Warning in Console#
The warning “You’re using the IMG.LY CDN” appears when using default configuration. Set baseURL in your config to use self-hosted assets and remove the warning.
API Reference#
Editor (@cesdk/cesdk-js)#
| Method/Config | Purpose |
|---|---|
CreativeEditorSDK.create(container, config) | Initialize editor with configuration |
config.baseURL | Base path for all engine assets (including fonts and emoji) |
config.core.baseURL | Path to WASM/core files (relative to baseURL) |
cesdk.addPlugin(new XyzAssetSource()) | Add individual asset source plugins |
CreativeEditorSDK.version | Get current SDK version string |
Custom UI (@cesdk/engine)#
| Method/Config | Purpose |
|---|---|
CreativeEngine.init(config) | Initialize the headless engine with configuration |
config.baseURL | Base path for engine and content assets |
engine.getBaseURL() | Return the configured base URL |
engine.asset.addLocalAssetSourceFromJSONURI(contentURI, options?) | Register a content asset source from its content.json |
engine.asset.addLocalSource(id, supportedMimeTypes?) | Register a local source for uploads |
CreativeEngine.version | Get current SDK version string |