Free, open-source motion graphics editor — built to run anywhere, starting with the engine.
OpenMotion is a cross-platform motion graphics editor in progress, in the spirit
of Alight Motion. It is GPL v3 and built around an open, documented project
format (.omproj, JSON-based) so your work is never locked inside one app.
Status: Pre-Alpha. Only the engine exists so far. There is no UI yet — the
current way to use it is the om-render command-line tool, which turns a
.omproj file into an .mp4. Everything below describes what the code in
packages/openmotion_core/ does today, and nothing more.
| Problem | OpenMotion's answer |
|---|---|
| Good motion tools are often closed and platform-locked | Open source, and the core engine is plain C++17 + CMake |
| Closed formats lock your work away | Open, documented .omproj format (JSON) |
| You can't see how it works | The full source is here, under GPL v3 |
The software is free. Selling convenience builds — installers, store listings, support — is fine. Hiding how it works is not.
The engine (packages/openmotion_core/) currently does:
- Project format — load, validate and save
.omproj(JSON, format version 1), withProjectErrorreporting instead of exceptions. - Keyframe evaluation — constant and animated properties with the easing
curves
linear,ease_in,ease_out,ease_in_outandhold, looked up by binary search. - Layers —
solid,rect,imageandvideolayers are rendered by a software rasterizer;audiolayers are mixed into the exported audio. - Images — decoded through the external
ffmpeg/ffprobeexecutables, with bilinear filtering in premultiplied alpha and a size cap. - Video — decoded by streaming raw frames from an
ffmpegchild process, resampled to the project frame rate; the last frame is held past the clip end. - Audio —
audiolayers are delayed, gained and mixed with an ffmpeg filter graph, then encoded as AAC (192 kbit/s). - Output — an MP4 encoded by ffmpeg (the codec is ffmpeg's default for the mp4 muxer), tagged BT.709.
om-renderCLI — renders a project to an MP4.
These are not implemented — listed so the roadmap is honest:
- A graphical UI (timeline, preview, inspector).
- Text rendering, and Arabic shaping in particular.
textlayers are parsed but not drawn. - Effects (the
effectsmodule is an empty placeholder). - Anti-aliasing — the rasterizer uses hard pixel-centre coverage.
- Rotation-tag (EXIF orientation) support — images are decoded with
-noautorotate, so a rotation tag is ignored rather than applied. - An Alight Motion XML importer (see
docs/AM_XML_NOTES.md). - Audio from video layers — video layers stay muted.
- Real-time preview / playback.
| Layer | Technology |
|---|---|
| Language | C++17 |
| Build | CMake |
| JSON | nlohmann/json (fetched by CMake) |
| Tests | Catch2 v3 (fetched by CMake) |
| Media | External ffmpeg and ffprobe executables |
| License | GPL v3 |
There is no Rust, Flutter, wgpu or FFmpeg library linkage. FFmpeg is used
only by running the ffmpeg and ffprobe programs as child processes.
Requirements:
- A C++17 compiler and CMake (3.16 or newer).
ffmpegandffprobeon yourPATH— needed to load images/video and to export. Builds and the offline tests work without them; tests that need them are skipped.- Network access on the first configure, to fetch nlohmann/json and Catch2.
cd packages/openmotion_core
# Configure (Debug enables AddressSanitizer + UndefinedBehaviorSanitizer)
cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug
# Build the engine, the om-render CLI and the tests
cmake --build build
# Run the tests
ctest --test-dir buildRender the bundled example:
./build/om-render examples/hello.omproj hello.mp4om-render takes exactly two arguments, <input.omproj> <output.mp4>, and
resolves relative source paths against the directory of the input file.
See docs/ARCHITECTURE.md for the module map and
docs/OMPROJ_FORMAT.md for the project format.
OpenMotion is community-driven from day one.
git clone https://github.com/YOUR_USERNAME/OpenMotion
cd OpenMotion/packages/openmotion_core
cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug
cmake --build build
ctest --test-dir buildThe Debug build is sanitizer-clean by design (-fsanitize=address,undefined),
and the code is compiled with -Wall -Wextra -Wpedantic -Werror, so a warning
fails the build. Please keep it that way.
OpenMotion is licensed under the GNU General Public License v3.0.
You are free to use, study, modify, and distribute this software. If you distribute a modified version, you must keep it under GPL v3.
See LICENSE for the full terms.
The software is free. The developer still needs coffee. ☕
- ⭐ Star this repo
- 🐛 Report bugs and request features via Issues
- 📢 Share OpenMotion with your Linux and FOSS communities
Nothing here is implemented or scheduled. It is a direction, not a promise.
Possible distribution channels (all still just ideas):
| Platform | Price idea | Notes |
|---|---|---|
| GitHub Releases | Free | Executable + source — always |
| Flathub | Pay what you want | Linux first-class citizen |
| F-Droid | Free | FOSS Android store |
| Microsoft Store | Convenience pricing | Paid convenience build |
| Steam | Convenience pricing | Auto-updates |
| Google Play | Convenience pricing | Android mainstream |
| Itch.io | Pay what you want | Indie community |
The source code is always free. You would pay for convenience — never for the software itself.
Rough milestone sketch (no dates, nothing started):
- M1 — Engine skeleton. Software renderer, project format, keyframe
evaluation,
om-renderCLI. (Largely what exists today.) - M2 — Editing. Timeline, trim/split/move, basic text overlay.
- M3 — Motion graphics core. Easing-curve editor, layer blending modes.
- M4 — Effects and presets. Built-in effects library, JSON presets, an Alight Motion XML preset importer.
- M5 — Community launch. Packaging for desktop platforms, documentation.