Installing Premation
There are two ways in: the prebuilt desktop installer, and building from source. Most people want the installer. Build from source if you are on a platform whose installer has not shipped yet, or if you intend to change the code.
Check System requirements first — the GPU is the part that decides whether this works.
Two editions
One source tree builds two editions, chosen at build time with the
VITE_EDITION environment variable. The split exists because the editor is open
source (AGPL-3.0-only )
while the hosted backend it can talk to is not.
local (VITE_EDITION=local) | server (default) | |
|---|---|---|
| Accounts / sign-in | None — opens straight into the editor | Required |
| Projects | On disk, as a .motion bundle | Cloud, with autosave |
| Assets | On disk, content-addressed | Cloud library |
| Version history | Local, structurally shared | Local and server-side |
| Export | Local ffmpeg | Local ffmpeg |
| Editing, compositing, 3D, rigging, effects | Identical | Identical |
| AI assistant | Not included | Included, on your own provider key |
| Plugins | Not included — no panel, no host, no registry | The platform and its registry |
| Billing and sync | Absent | Available |
| Opening a project that uses plugins | Opens, edits and saves losslessly — plugin content is inert but intact | Runs |
The local edition is the one to build from the repository. It makes no
network requests at all — the API layer refuses to send, so an offline build
cannot quietly phone home. The server edition targets a backend service that is
not part of the repository, so its cloud features sit on a sign-in screen without
one.
In the codebase, read the edition as a capability, never as a flag:
aiEnabled(), pluginsEnabled(), pluginRegistryEnabled(),
cloudProjectsEnabled(), billingEnabled() and friends in
src/core/config/edition.ts say why a surface is gated. isLocalEdition()
only says where that happens to be true today.
pluginsEnabled() and pluginRegistryEnabled() are separate on purpose: the
first asks whether the feature exists at all, the second whether the
marketplace may be reached. A local build fails both.
The desktop installer
Builds are published on GitHub Releases , next to the source they were built from.
| Platform | Release asset | Status |
|---|---|---|
| Windows 10 / 11 · x64 | Premation-Setup-Windows.exe | Available |
| macOS · Apple silicon / Intel | Premation-macOS-arm64.dmg / Premation-macOS-x64.dmg | Available |
| Linux · x64 | Premation.AppImage | Coming soon |
Download from the Premation site or straight from the releases page, run the installer, and launch. There is nothing else to configure for the editor itself.
The download buttons point at
releases/latest/download/<asset>, so they always fetch the newest published
release rather than a pinned version.
The installers are unsigned during the beta, and that has a different consequence on each platform.
On Windows, SmartScreen warns you the first time — choose More info → Run anyway — and automatic updates work normally.
On macOS, Gatekeeper blocks the app until you open it once with right-click ▸ Open, and automatic updates are switched off, so each new version is a manual download.
Updates & macOS setup walks through both, and explains why. All of it goes away once the builds are signed — no reinstall needed.
Building from source
Get the code and its dependencies
git clone https://github.com/isroil01/motion-editor.gitcd motion-editor && npm installYou need Node.js 20 or newer and npm.
Run the desktop app with hot reload
npm run electron:dev:localThis is the real app. It compiles the Electron main process, starts Vite on
localhost:5173, waits for it, and launches Electron. Renderer edits hot-reload.
Or run the renderer in a browser
npm run dev:localFaster to iterate on the UI, but it is not the full product: no native menus, no local file access, no MP4 or ProRes export, and no proxy generation.
Both :local scripts set VITE_EDITION=local. Dropping the suffix
(npm run electron:dev) builds the server edition, which will sit on a
sign-in screen unless you point it at a backend you run yourself.
Every script, and what it does
| Command | What it does |
|---|---|
npm run electron:dev:local | Vite + the Electron shell, both watching — local edition |
npm run dev:local | Renderer only, in your browser — local edition |
npm run build:local | Typecheck (tsc -b) and build the renderer bundle |
npm run electron:build:local | Build the renderer + compile electron/ |
npm run pack:local | Unpacked desktop build — fast, for testing packaging |
npm run dist:local | Installer for the current platform, into release/ |
npm test | The full Jest suite (~6,250 tests across ~525 suites) |
npm run typecheck | tsc --noEmit |
npm run lint | ESLint |
npm run render-tests | Pixel-compare renders against reference frames |
npm run render-tests:update | Re-bless golden frames after an intended pixel change |
Every one of these has a suffix-free twin (npm run dev, npm run dist, …) that
builds the server edition instead.
Only re-bless a golden frame when you have looked at the diff and can say why
the new pixels are correct. git status on the references directory before you
commit — an unreviewed reference change hides a regression.
Installing ffmpeg
Optional, and only for video export. Without it you keep PNG/JPEG sequence, still frame, Lottie and project export; with it you additionally get MP4, WebM, GIF and ProRes.
Windows
Using winget:
winget install Gyan.FFmpegOr download a build, unzip it, and add the bin folder to your PATH.
Verify with ffmpeg -version. If you would rather point at a specific build,
set FFMPEG_PATH to the executable and Premation will use that in preference to
anything on your PATH.
The companion server
The server edition talks to a companion NestJS service (motion-back, a
separate repository, not open source) for:
- sign-in and accounts,
- cloud project storage, sync and billing,
- the AI assistant’s model calls,
- the hosted plugin registry.
The editor expects it on port 4000.
In the local edition none of that is present — those surfaces are absent rather than broken, which is what makes the build genuinely offline. You keep everything else, including every export format. If you only want the editor, build local and skip the server entirely.
Read electron-builder.yml before you distribute a build of your own. As
committed it requires a sibling ../motion-back checkout and copies that
project’s .env into the installer — a file that holds database credentials
and API keys. Remove the extraResources entry and configure the server at
first run instead.
Bundling ffmpeg into your own build
To make video export work without a system ffmpeg, bundle the binary:
extraResources:
- from: <path-to-folder-containing>/ffmpeg # ffmpeg or ffmpeg.exe
to: ffmpegelectron/main.ts checks <resources>/ffmpeg before falling back to PATH.
Note that ffmpeg’s own licence terms — LGPL or GPL, depending on the build —
travel with the binary.
Next
- Updates & macOS setup — opening an unsigned build on macOS, and how new versions reach you
- First launch — the dashboard, creating a project, the onboarding tour
- Your first animation