Render your videos
without a phone.
The ExpoCut Render Engine is a single-binary command-line tool that takes the same projects and .ectpl templates the mobile app produces and renders them — pixel-for-pixel identical — on macOS, Windows, and Linux. Build batch pipelines, automate from a script, run on a server, render 4K on hardware your phone could never touch.
What you get
One small executable. Six commands. Identical output to the mobile app — because the engine reads the same project JSON the app writes when you tap Export Project, and the same .ectpl templates you save from the gallery.
Same project, same pixels
Export a project from your phone, drop the JSON onto your laptop, run one command — you get the finished MP4 with every layer, effect, transition, mask, animation, and lower-third intact.
Templates on the command line
Apply a .ectpl template and fill its slots from a JSON file, a CSV, or a database. The engine inflates the template and renders the finished video — perfect for bulk product cuts, real-estate listings, or AI-generated reels.
MP4, HLS, frame sequences
Render straight to MP4 for upload, an HLS playlist for streaming, a folder of PNG / JPEG frames for downstream pipelines, or a single frame at any timestamp for thumbnails.
Deterministic by design
Same project + same engine version = byte-identical pixels every time. Safe for CI, snapshot tests, and reproducible automation. No hidden randomness, no GPU vendor drift.
Live preview server
Spin up a tiny HTTP server that streams the rendered timeline as MJPEG — point a browser, an OBS source, or your AI agent at http://localhost:8787 and watch the engine paint in real time.
Scriptable from anywhere
It is a normal CLI. Drive it from a shell, a Python script, a Node task, a Makefile, GitHub Actions, or an AI agent over the MCP server. Exit codes are honest; stderr is structured.
Install on your operating system
The engine is distributed as a single self-contained executable. Pick your platform, drop the binary on your PATH, and you are done. To produce MP4 / HLS or to read source video files you also need ffmpeg on your PATH — install it once from your package manager, and the engine uses it automatically.
macOS
Apple Silicon (M-series) and Intel. Install ffmpeg with Homebrew, then drop the engine on your PATH.
# 1. install ffmpeg once brew install ffmpeg # 2. install the engine curl -L https://expocut.com/download/expocut-engine-macos.tgz \ | tar -xz -C /usr/local/bin chmod +x /usr/local/bin/expocut-engine # 3. verify expocut-engine --version
Windows
Windows 10, 11, and Server 2019+. Use winget for ffmpeg, then add the engine folder to PATH.
:: 1. install ffmpeg once winget install Gyan.FFmpeg :: 2. download & unzip the engine curl -L -o engine.zip https://expocut.com/download/expocut-engine-windows.zip tar -xf engine.zip -C "%ProgramFiles%\ExpoCut" :: 3. add to PATH, then in a new shell expocut-engine.exe --version
Linux
x86_64 and arm64, glibc-based distros. Install ffmpeg with your package manager, then drop the binary in ~/.local/bin.
# 1. install ffmpeg once (Debian / Ubuntu) sudo apt-get install -y ffmpeg # 2. install the engine curl -L https://expocut.com/download/expocut-engine-linux.tgz \ | tar -xz -C ~/.local/bin chmod +x ~/.local/bin/expocut-engine # 3. verify expocut-engine --version
Heads up. The engine ships as a single executable with no installer, no system services, and no background daemon. Delete the file and it is gone. It runs entirely on your machine and never phones home.
The commands
Six commands cover the whole workflow — from "I exported a project on my phone" to "I have an MP4." Type expocut-engine --help for the live reference.
| Command | What it does |
|---|---|
import | Take a mobile-app project export (the file you get from Export Project) and convert it to canonical engine JSON. Optional — every other command also accepts the engine JSON directly. |
render | The umbrella command. Reads a project JSON and renders to the format you ask for. render mp4 …, render hls …, render sequence …, render frame … are all sub-modes. |
mp4 | Render the whole timeline to a single .mp4 file. The most common command. |
hls | Render to an HLS playlist (.m3u8 + segmented .ts files) ready for streaming. |
sequence | Render every frame as a numbered PNG or JPEG in a folder — perfect for VFX hand-off, thumbnails, or feeding another pipeline. |
frame | Render a single frame at a specific timestamp. Great for thumbnails, posters, social cards. |
serve | Start a local HTTP server that streams the live preview as MJPEG so you can watch the render in a browser or feed it to OBS. |
Your first render in three steps
From a phone-exported project to a finished MP4 in less than a minute.
-
Export a project from the mobile app
In ExpoCut, open any project, tap the menu, and choose Export Project. You get a small JSON file — call it
my-promo.json. Send it to your computer however you usually do (AirDrop, email, cloud drive). -
Convert it to engine JSON (optional)
The engine accepts the mobile export directly, but if you want a clean canonical form for source control, run:
expocut-engine import my-promo.json --out project.json -
Render to MP4
One command. The engine reads the project, paints every frame, and asks
ffmpegto mux the result into a standard H.264 MP4.expocut-engine mp4 project.json --out my-promo.mp4That is it. Open
my-promo.mp4in any player. Pixel-for-pixel the same video you would have got from the phone — just faster, in 4K if you ask for it, and without filling your phone's storage.
Common workflows
A few patterns most ExpoCut users land on within their first week.
Bulk-render a template from a CSV
Design a .ectpl template once in the mobile app — for example a Just Listed real-estate promo — then fill it for every row of a spreadsheet on your laptop. Each render is independent, so you can parallelize with your shell's xargs -P or a build tool.
# listings.csv: address, photo_1, photo_2, photo_3, agent_name, agent_logo while IFS=, read address p1 p2 p3 agent logo; do expocut-engine mp4 templates/just-listed.ectpl \ --slot title="$address" \ --slot media_1="$p1" --slot media_2="$p2" --slot media_3="$p3" \ --slot agent_name="$agent" --slot logo="$logo" \ --out "out/$address.mp4" done < listings.csv
Generate a thumbnail at a specific timestamp
For social cards, email previews, or YouTube posters. The engine takes an exact millisecond and paints just that one frame.
expocut-engine frame project.json --at 2500ms --out thumb.png
Stream the render live in a browser
Great for previewing changes while you tweak a template, or for plugging the canvas into OBS as a virtual camera. The engine paints frames on demand and ships them as a low-latency MJPEG stream.
expocut-engine serve project.json --port 8787 # open http://localhost:8787 in any browser
Wire it into CI
Because the engine is deterministic, you can commit a project JSON and a reference frame to your repo, then assert in CI that any change still produces the same pixels. Use --exit-code on a frame diff to fail the build on regressions. Examples for GitHub Actions, GitLab CI, and CircleCI live in the automation guide.
Everything the engine renders
The engine ships with the same compositor the mobile app uses, so every layer kind, every animation, and every effect that works in the app works here too.
Every layer kind
Video, image, audio, text (with per-glyph entrances — wave, rise, scatter, typewriter), shapes, lower thirds with accent shapes and staggered reveals, gradients, collages, captions, progress bars, and Lottie animations with mattes, gradients, trim paths, and animated morphs.
The full effect catalogue
Masks (geometric, freeform, rotated, sub-rect), chroma key, color filters (the same 3D LUT pipeline the app uses, including vignette, grain, and a per-channel mixer), transitions (fade, dissolve, slides, wipes — all with custom easing).
Keyframes & motion
Linear, ease-in / ease-out, ease-in-out, hold, and cubic-bezier curves. Position, scale, rotation, opacity, and per-layer animation tracks. Plus the engine honours every entrance / exit animation the mobile app defines.
Audio & voiceover
Multiple audio layers, per-layer volume keyframes, and the voiceover script that .ectpl templates carry are all included in the muxed MP4 / HLS output.
FAQ
Will the engine ever drift from what the mobile app produces?
No. The engine and the app share their compositor contract through a versioned project JSON schema, and every release runs a pixel-parity test suite against reference frames from the mobile app. When the schema changes the engine ships the new behaviour in the same release the app does.
Can I render a video on a headless server?
Yes. The engine has no GUI dependency. It runs on Linux without an X display, inside Docker, in GitHub Actions, on AWS Lambda (within the function size limit), and on any modern build server. The MP4 / HLS path needs ffmpeg on the box; the PNG / JPEG / raw path does not.
Is the rendering hardware-accelerated?
By default the engine renders on the CPU — that is what makes it deterministic and portable. An optional accelerator path can engage the GPU for the heavy per-pixel work (mask / filter / transition / chroma bakes for image and video layers) when one is available, and falls back to the CPU automatically otherwise.
Can my AI assistant drive the engine for me?
Yes — that is exactly what the new automation guide is about. Combine the engine with ExpoCut's in-app MCP server and an assistant can design a video on your phone, export it, render it on your laptop, and re-render it for every row of a spreadsheet — all without you switching apps.
Where can I get help?
Read the automation guide for end-to-end recipes, the .ectpl format specification for the full schema, caps and agent doctrine (machine-readable at spec.json), the .ectpl guide for a gentler introduction, or email [email protected]. Bugs and feature requests go to the in-app reporter, which is mirrored on the public bugs page.
Render on your terms.
Free plan available. Single binary. No accounts, no upload, no surprises.