Migrate from Mux to Transloadit
Mux focuses on video ingest, encoding, playback, and analytics. Transloadit is a broader media processing platform: you can upload or import files, generate multiple renditions, create HLS or MPEG-DASH outputs, produce thumbnails, add subtitles, transcribe audio, and store the results in your own storage.
This guide covers ingest, encoding, thumbnails, and storage. Player integration, analytics, access control, and transferring platform metadata need separate planning; an Assembly is not a drop-in replacement for a Mux asset and playback ID.
Migration map
| Mux concept | Transloadit equivalent |
|---|---|
| Direct upload | 🤖/upload/handle through an SDK or Uppy |
| Asset creation | A Transloadit Assembly |
| Encoding profile | 🤖/video/encode preset |
| Adaptive playback | 🤖/video/adaptive or 🤖/video/ondemand (beta) |
| Poster image | 🤖/video/thumbs |
| Captions/subtitles | 🤖/speech/transcribe can produce SRT or WebVTT; 🤖/video/subtitle can add those subtitles to video |
| Asset ready webhook | Assembly Notification |
| Playback URL | Exported HLS manifest served by your storage/CDN, or a Smart CDN URL |
Choose upfront or on-demand encoding
For predictable catalogs, encode variants up front with /video/encode and /video/adaptive. For
large catalogs where only a fraction of videos are watched, evaluate /video/ondemand with Smart
CDN so HLS assets are generated as viewers request them. This beta Robot needs a separate compatible
Smart CDN Template whose response branch ends in /file/serve. Sign the URLs on your backend to
protect your encoding budget from abuse. The upload-and-export
Template below is for upfront encoding, not Smart CDN.
Example adaptive video Template
This Template receives a video, encodes three renditions, segments them, writes variant playlists and a multivariant playlist, creates a thumbnail, and stores the package on S3. Use one source video per Assembly for this example and choose renditions appropriate to its resolution; the three presets do not add missing detail to a low-resolution source:
{
"steps": {
":original": {
"robot": "/upload/handle"
},
"encoded_480p": {
"use": ":original",
"robot": "/video/encode",
"preset": "hls/480p",
"ffmpeg_stack": "v7"
},
"encoded_720p": {
"use": ":original",
"robot": "/video/encode",
"preset": "hls/720p",
"ffmpeg_stack": "v7"
},
"encoded_1080p": {
"use": ":original",
"robot": "/video/encode",
"preset": "hls/1080p",
"ffmpeg_stack": "v7"
},
"hls": {
"use": {
"steps": ["encoded_480p", "encoded_720p", "encoded_1080p"],
"bundle_steps": true
},
"robot": "/video/adaptive",
"technique": "hls",
"playlist_name": "playlist.m3u8",
"result": true
},
"poster": {
"use": ":original",
"robot": "/video/thumbs",
"count": 1,
"result": true
},
"exported_hls": {
"use": "hls",
"robot": "/s3/store",
"credentials": "YOUR_AWS_CREDENTIALS",
"path": "videos/${assembly.id}/${file.meta.relative_path}/${file.name}",
"url_prefix": "https://cdn.example.com/",
"acl": "bucket-default"
},
"exported_poster": {
"use": "poster",
"robot": "/s3/store",
"credentials": "YOUR_AWS_CREDENTIALS",
"path": "videos/${assembly.id}/posters/${file.url_name}",
"url_prefix": "https://cdn.example.com/",
"acl": "bucket-default"
}
}
}
/video/adaptive sets relative_path on its outputs. Preserve it in the export path so the playlist
references resolve. Configure Third-party Credentials and a CDN
that can read the bucket root; url_prefix does not configure delivery or grant access.
acl: "bucket-default" sends no object ACL; configure access through
your bucket policy and CDN origin access.
Set notify_url in your signed Assembly request, verify notification signatures, and require
ASSEMBLY_COMPLETED. Export updates URLs under the producing Steps: results.hls lists the
segments and playlists; select the entry named playlist.m3u8 with an empty meta.relative_path.
Read the thumbnail from results.poster, checking is_temp_url: false before persisting
them. Temporary Transloadit URLs expire after 24 hours and must not be used for playback; see
saving conversion results. Test the exported manifest, variant
playlists, and segments through your CDN in the intended HLS player before switching traffic.
Import existing Mux source files
If you still have source video files in S3, use 🤖/s3/import. If your
application stores temporary HTTPS source URLs, use 🤖/http/import.
Save a backfill variant of the Template: replace the :original upload Step with an import Step
named imported, and change all four use: ":original" references (three encodes and the poster)
to use: "imported". Configure that import Step with one authorized source URL or S3 key per
Assembly. For /s3/import, configure its own source credentials and path; for /http/import,
configure url. After a successful export and playback check, write the new playback URL to your database
while retaining the source asset ID for reconciliation.
Checklist
- Decide whether videos should be encoded up front or on demand.
- Create a Template for your required renditions, thumbnails, captions, and exports.
- Configure storage credentials, CDN access, and CORS for HLS playback.
- Store exported storage URLs from Assembly Notifications.
- Run a backfill for existing source videos.
- Switch your player from Mux playback IDs to the exported manifest or Smart CDN URL.