๐ชผ Aether Renderer Core
Turn a folder (or zip) of transparent PNG frames into a WebM, MOV, GIF or MP4, with the transparency intact.
Exported an animation from Blender, After Effects, a canvas or an AI tool as a PNG sequence and need it on a website, in a video editor or in a chat? One command:

Project page ยท Download ยท GUI app ยท Changelog
โจ Features
- ๐ซง Transparent output in WebM (VP9), MOV (ProRes 4444) and GIF; MP4 for when you don't need alpha
- ๐ฆ Frames from a folder or a ZIP (macOS
__MACOSX/._files are skipped) - ๐ข Frames in natural order:
frame_2.pngcomes beforeframe_10.png, with or without zero padding - ๐ Fade in / fade out that fades to transparent (or to your background color), not to black
- ๐จ Background color (
--background '#1e1e1e') to flatten transparency onto a solid color, for any format - ๐ Real progress: a frame counter with
--verbose, JSON lines with--progress json, and a callback for library users - ๐๏ธ Options on the command line, in a JSON or TOML config, or both (the command line wins)
- ๐ผ๏ธ Preview a single frame without rendering
- ๐ป macOS, Linux and Windows, with prebuilt binaries
- ๐ฆ Also a Rust library: the Aether Renderer GUI is built on it
Which format should I use?
| Format | Transparency | Best for |
|---|---|---|
webm (default) |
โ | Websites (Chrome, Firefox, Edge), small files |
mov |
โ full quality | Video editors: Premiere, DaVinci Resolve, Final Cut, After Effects |
gif |
โ on/off per pixel | Chat, email, README files, anywhere video isn't allowed |
mp4 |
โ | Everything else, social media, maximum compatibility |
The format is taken from the output file name (-o loop.gif renders a GIF), or set it with --format.
MP4 can't store transparency, so transparent areas become black. To match the page
or video the clip will sit on, give it that color: --background '#1e1e1e'. The
same flag works for every format and makes the output opaque; fades then go to that color.
Safari does not play transparent WebM. For transparent video on Safari, use a GIF, or serve a HEVC-with-alpha version next to the WebM (on the roadmap).
๐ฆ Install
You need ffmpeg on your PATH:
Then either download a binary from Releases (macOS Apple Silicon and Intel, Linux, Windows), or install with Cargo:
๐ง Usage
# folder of PNGs -> transparent WebM at 30 fps
# from a zip, as a GIF at 24 fps
# for a video editor, with a soft 1 second fade in and out
# higher quality WebM (lower crf = better, default 30)
# only some files, or a numbered sequence
# check a frame first: saves the middle frame (or frame 12) as out.png
All options
| Option | Default | Description |
|---|---|---|
-i, --input |
required | Folder or .zip with the frames |
-o, --output |
output.<format> |
Output file |
--format |
from the output extension, else webm |
webm, mov, gif or mp4 |
--fps |
30 |
Frames per second |
--file-pattern |
*.png |
Glob (scene_*.png) or numbered sequence (frame_%04d.png) |
--background |
transparent (black for mp4) | Solid color behind the frames: '#1e1e1e', '#fff', white or transparent |
--fade-in |
0 |
Seconds to fade in from transparent (from the background color if set) |
--fade-out |
0 |
Seconds to fade out at the end |
--crf |
webm 30, mp4 23 |
Constant quality, lower is better (webm 0โ63, mp4 0โ51) |
--bitrate |
Target bitrate instead, e.g. 2M (if both are set, --crf wins) |
|
--preview [N] |
Save frame N (default: the middle frame) as a PNG instead of rendering |
|
--open |
Open the result when done | |
-c, --config |
JSON or TOML config file, see below | |
-v, --verbose |
Details and a progress bar | |
--progress json |
One JSON object per line on stdout, for GUIs and scripts (see below) | |
--verbose-ffmpeg |
Show ffmpeg's own output |
If ffmpeg fails, the error shows ffmpeg's own explanation, and no half-written file is left behind.
Progress for other programs
With --progress json, every line on stdout is a JSON object, so a GUI or script
can draw its own progress bar:
On failure the last line is {"event":"error","message":"..."} and the exit code is 1.
Progress comes from ffmpeg about twice a second. GIFs need every frame before they
can be written, so their progress mostly jumps to 100% at the end.
Config files
Every option can live in a .json or .toml file; anything you also pass on the
command line overrides the file. Handy for keeping a project's settings next to its
frames:
# render.toml
= "frames"
= "loop.webm"
= 24
= 0.5
= 0.5
= 24
= "#1e1e1e" # optional
The same in JSON: examples/example_config.json. Relative paths are relative to the folder you run the command from.
๐ฆ As a library
[]
= "0.6"
use PartialConfig;
let cfg = PartialConfig
.into_config?;
let report = render?;
println!;
For a progress bar, use render_with_progress:
let report = render_with_progress?;
RenderConfig::from_file("render.toml") loads a config file, and
aether_renderer_core::preview_frame extracts a single frame.
๐งช Development
The tests render real transparent, odd-sized frames to every format and check the
result with ffprobe: size, frame rate, codec and alpha. CI runs them on Linux, macOS
and Windows.
Benchmark
A single frame duplicated N times, rendered to WebM:
| Frames | Total time (s) | Avg time/frame (ms) |
|---|---|---|
| 1 | 1.17 | 1173.9 |
| 100 | 1.79 | 17.9 |
| 1000 | 13.13 | 13.1 |
| 10000 | 112.07 | 11.2 |
Measured with 0.4 (VP8). 0.5 uses VP9, which in our tests takes about 20% longer and gives files about 40% smaller at better quality.
๐ชผ Aether Renderer GUI
Prefer drag and drop? The Aether Renderer GUI is a desktop app built on this crate.

Download the installer from the GUI releases.
๐ฆ Example frames
Try it with sacred-stars.zip:
๐ฎ Roadmap
- WebM with alpha, MP4, GIF
- Bitrate / CRF quality control, fades
- Preview a single frame
- GUI version with Tauri
- ProRes 4444 MOV, TOML config, config + CLI override, Windows-safe input (0.5)
- Background color for any format, real progress bar and
--progress json(0.6) - Safari-ready transparent video (HEVC with alpha) and a
--format webthat writes both - Resize and crop (
--width,--height) - Frames from stdin, for piping from canvas and AI tools
Ideas and bug reports are welcome in issues.
๐ฟ License & author
MIT. Built and maintained by Mads Paaskesen, Hardcore Websmith at MP-IT, with ๐ from Sacred-AI.
Need custom rendering pipelines, video automation or a Rust/Node.js backend? Get in touch.