FAQ
Short answers to questions that come up often. For hands-on guides, see the Getting Started pages.
Getting Started
Do I need a server to use the SDK?
No. By default, the SDK runs entirely in the browser, decoding, rendering, and encoding all happen on the client. Use server-side rendering only when you need batch export or centralized compute.
What browsers are supported?
The SDK runs in any modern browser. Hardware-accelerated encoding and decoding through WebCodecs.
Where do I get a license?
Free evaluation licenses are available at app.rendleysdk.com. For production, contact the Rendley team for a domain-locked key.
Authoring
How do I animate a property?
Use the Property Animator. Two keyframes on the same property give you linear interpolation; add bezier handles for ease curves.
How do I add a GLSL shader to a clip?
Register it in the Library with addEffect({ fragmentSrc }), then call clip.addEffect(libraryEffectId) on the target clip. The effect can be animated through the Property Animator using the effect:{instanceId}:{property} track key.
How do I fade a clip in and out?
Animate the alpha property with the Property Animator. See the Fade In / Fade Out snippet, and Playback Speed & Fades for audio fades.
How do I make text reveal one letter at a time?
Add one hold keyframe per letter on the text property. See Hold Keyframes.
How do I reuse the same asset on multiple clips?
Upload it once with addMedia and reference the returned mediaDataId from every addClip call. The SDK deduplicates by content hash, so even if you upload the same file twice you don't pay extra memory.
Media & Library
How do I know when a media file finished loading?
Listen for library:media:ready on the Engine event bus. The payload has { mediaDataId }. See Listening to Events.
How do I extract audio from a video clip?
Either call videoClip.extractAudioClip() to clone the audio onto a new layer, or library.extractAudioFromMedia(mediaId) to create a new standalone audio entry in the Library.
Can I persist media between page reloads?
Yes, plug in a Storage provider. The SDK ships with StorageIndexedDB for local persistence; bring your own for server-side storage (S3 with presigned URLs, GCS, etc.).
Why do large files take a long time to hash?
SHA-256 is slow on big inputs. For files larger than a few hundred megabytes, switch to xxhash via setMediaHashAlgorithm. Not cryptographically secure, but sufficient for content addressing.
Rendering
How do I track export progress?
Listen for the time event during export, the payload is the current render time in seconds. Divide by the composition duration for a percentage. See Track Export Progress.
How do I export a video larger than 2 GB?
Enable chunked output in the Settings. The export returns an outputChunkHelper instead of a blob, and you stream each chunk to disk or a network endpoint.
Can I preview the render without actually rendering?
Call Engine.getInstance().play() to play the composition in real time with the same pipeline used for export. The output matches bit-for-bit in most cases (except for some quality trade-offs in the preview path).
Why does my WebM export not have transparency?
Transparent WebM output needs the WASM renderer. Set setEncoderUseWebCodecs(false) and setEncoderUseAlpha(true) with codec vp8 or vp9. See Rendering Videos with Alpha.
Playback & Timeline
Can I play a video in reverse?
No. Playback speed is positive only, in the range [0.25, 4] ([0.25, 2] on Safari).
How do I freeze the last frame of a video?
Use VideoClip.setFreezeTime. Pass the source timestamp you want to hold on.
State & Persistence
How do I save a project?
Call Engine.getInstance().serialize() to get a JSON snapshot, then send it to your backend. Before saving, check Engine.isSafeToSerialize() to avoid writing mid-transcode.
How do I load a project on a fresh page?
Call Engine.deserialize(state) after Engine.init. See Save & Restore.
How do I auto-save?
Listen to SDK events, debounce changes, and call serialize() when the user has been idle briefly. Gate every save on isSafeToSerialize(). See the full autosave pattern.
Extending the SDK
How do I build a custom clip type?
Extend the CustomClip base class, override update(time), and register it with Engine.getInstance().registerCustomClip(YourClass, "your-type") before any deserialization.
Can I bring my own transcoder?
Yes. Implement the ITranscodeProvider interface and pass your instance as the transcoder option to Engine.init. Useful for server-side transcoding or when you need a codec the built-in transcoder doesn't support.
Can I use a different font than what's loaded by default?
Yes. Load it with fontRegistry.loadFromCssUrl or loadFromUrl, then reference the family name in a text clip's style.fontFamily.