Known gaps
Premation is version 0.7.0. This page is the list of things that are not done, kept here rather than described as intentions elsewhere in the documentation.
If a page in these docs describes something that does not work, and it is not on this list, treat it as a documentation bug.
Not implemented
| Area | Status |
|---|---|
| Real-time collaboration — live cursors, multi-user editing | Not implemented, and not planned |
| Review comments, approval flow, shareable review links | Removed outright — not gated, not hidden behind a plan |
| Imported 3D models, PBR materials, HDRI environments | Out of scope. The 3D model is Classic 3D |
| Multi-track NLE / clip-based video editing | Out of scope. This is not a video editor |
| Stretch as a slot fit policy | Deliberately absent. It exists only to distort, which Native + scale already gives — see Media slots |
Gated or partial
| Area | Status |
|---|---|
| The AI assistant in the local edition | Absent, and not for a technical reason. The bring-your-own-key path works — it needs a key, not a backend — so this is a distribution decision, and re-enabling it is one predicate. The surfaces are gated individually and the IPC channels are not registered at all, rather than the panel being hidden over a live one |
| Plugins in the local edition | Absent. The registry, review queue and signed revocation list are what make running third-party code defensible, and a build without them does not offer the sandbox either. A project containing plugin content still opens, edits and saves losslessly |
| Simulation | The subsystem core exists — a cache whose state at a frame does not depend on which frames were asked for first — but there is no layer type, no registry entry and no renderer path. Nothing user-facing yet |
| Media columns when filling a template from a data table | Text, colour and number columns apply; a media column is reported as skipped rather than silently ignored. A column of file paths pulls asset ingestion into the batch path, which can fail per row |
| Motion AI — the first-party metered provider | Disabled while in development, in the server edition too. Bring-your-own-key works there |
| Proxy generation in browser builds | Absent — it needs ffmpeg. Attaching an existing proxy works everywhere |
| Continuous Rasterization | Ships, but opt-in per layer and offered only where it can help: text, SVG and shapes with real geometry. Bitmaps and flat rects are excluded |
| Above-4× raster cache with CR off | Known and filed, not fixed globally. With CR off, every scale past 4× shares one cache key, so the first raster wins and zooming further never re-rasterises. Opting the layer in is the supported fix |
ffprobe on import | Desktop only, and best-effort. Three tiers — probed / element-only / none. An unprobed file still imports; it just falls back to what the <video> element can tell us |
Local-first chunked .motion bundle + its six-table index | Designed in the architecture RFC, not yet fully implemented. The engines are frozen pending it |
| ffmpeg bundling for fully offline MP4 | Open decision. MP4 export currently depends on ffmpeg being present |
| GPU per-frame render off the main thread | Still on the main thread. The offload boundary is identified |
| The Graph Editor’s rendered layout | The full-panel layout is not covered by unit tests and was not verified by eye against a scene with keyframes |
Recently closed
Listed because earlier versions of these docs described them as gaps:
| Was a gap | Now |
|---|---|
| “Tracking — not implemented” | One-click point tracking shipped in 0.4 — click a feature, get keyframes both directions, with rotation & scale from a companion point. Still no camera solver, planar tracker or rotoscoping — those remain real gaps |
| “No plugin format for effects — the plugin system extends the app, not the render graph” | Wrong since API 4. A plugin declares typed parameters and a shader body, and the host writes the pipeline and the draw call. Needs the WebGPU tier |
| Third-party layer types | Shipped. A plugin can contribute a layer type owning a generated subtree, with a scene:proxy grant that reaches only its own children |
| Effect breadth “58 of AE’s 400+” | 183, across ten browser folders — and since 0.7, 177 of them run as GPU shaders. Six still bake on the CPU (Vegas, Numbers, Timecode, Audio Spectrum, Audio Waveform, Lightning); the viewport HUD lists them under cpu fx |
| Blend modes “17 of 38” | All 38. Dissolve and Dancing Dissolve landed with the AE-parity wave |
| Layer styles “nine, no Glass” | 10. Glass is real; it lives in a second registry because it resolves against what is composited behind the layer |
| Per-vertex rig weights, IK/FK switching, auto-rig presets | All shipped — the named gaps against DUIK and Rive are closed |
| Filling a template from a spreadsheet | Shipped. Point a CSV at the fields and apply a row; one row is one undo entry |
| Template image-swap fields | Shipped as media slots with a fit policy — video, stills, sequences and whole compositions |
| Continuous Rasterization “not implemented” | Implemented, opt-in per layer |
| Frame blending collapsing to nearest-frame on a mismatched source rate | Fixed — ffprobe supplies the real source rate, and blending brackets on it |
| Outer Glow and Drop Shadow rendering in the layer’s colour | Fixed. They were tinting (a multiply), so only a black shadow was ever right — by accident |
| Cameras and lights ignoring their parent | Fixed. One resolved transform behind both, and parenting is bounded by the composition |
| A camera or light that could not be grabbed in the viewport | Fixed. The position handle and the Point of Interest crosshair drag independently |
| Comp instances borrowing the host’s camera and frame size | Fixed. A sealed instance renders through its own recursive snapshot pass, at its own size |
| The Media panel’s Fit Mode dropdown doing nothing | Removed. Fit is a command, not a stored property |
package.json declaring UNLICENSED | Licensed GNU AGPL v3.0 only |
Platform availability
Installers are published on GitHub Releases .
| Platform | Release asset | Installer |
|---|---|---|
| Windows 10 / 11 x64 | Premation-Setup-Windows.exe | Available |
| macOS | Premation-macOS-arm64.dmg / Premation-macOS-x64.dmg | Available |
| Linux | — | Not currently supported |
The Linux target was removed from the build and the release matrix deliberately, so no installer is produced. Building from source still works there.
Format and stability
- The project file format is still moving. Keep
File → Export → Projectcopies of work you cannot afford to lose. - The installer is unsigned during the beta.
- The editor is licensed GNU AGPL v3.0 only. The AGPL covers the editor repository; it does not cover the separate hosted backend service, which is not distributed there. Section 13 matters in particular — run a modified version as a network service and you must offer its users the corresponding source.
Known behavioural quirks
| Quirk | Detail |
|---|---|
| Solid layers and 3D | A layer can go 3D if it has a transform component; solids were historically pinned by the renderer |
| Expressions under the dev CSP | Development builds block new Function, which historically made one AI tool inert in dev. The shipped path evaluates through the engine’s own interpreter |
| Canvas2D previews skip GPU-only effects | Library and template cards preview geometry and timing accurately, not every filter |
| Audio Waveform and Audio Spectrum are different effects | Not a gap any more. audio-waveform draws the envelope; audio-spectrum runs a real radix-2 FFT over a 1024-sample window and draws frequency bands between a start and end frequency you set |
| Lottie export is vector + transforms only | Effects, 3D lighting and video do not survive |
| A proxy in use looks like a quality bug | Which is why the state is stated loudly on the asset rather than left to be inferred. Substitution is pixels only, and never reaches output |
| An ortho view shows two comp frames | Deliberate. The filled rect is the frame that will be exported; the dashed quad is where the comp’s z = 0 plane sits, seen edge-on. Both are true |
Testing notes
If you are working on the codebase rather than using the app:
- Roughly 5,400 automated tests across ~470 suites, plus a pixel-comparison render-test harness with committed reference frames.
- Typechecked under TypeScript
strictwithnoUncheckedIndexedAccess. - Reading pixels back from a GPU canvas must happen in the same task as the
draw call. After an
await, a composited canvas hands back nothing. - A render harness launched with
--use-angle=swiftshadernever runs WebGPU. It suppresses Dawn, and every “WebGPU” number it produces is really WebGL2 fallback pixels. Check the backend the harness resolved, not the one it was asked for. - Alpha is premultiplied everywhere past the decode. A file’s alpha mode is consumed once, at decode — see How a frame is rendered.
- The renderer’s Null backend records draw calls, not pixels. It proves structure — this many quads, in this order — and cannot prove a shader is correct. That is what the render tests are for.
- Blessing a reference frame is deliberate. Check
git statuson the references directory before committing — an unreviewed reference change hides a regression. - OneDrive gotcha: running Jest directly inside a OneDrive working copy can silently run only a fraction of the suites, because placeholder files hide the rest from the resolver. Mirror the repository to local disk for a real full run, and do not treat a zero-hit grep inside OneDrive as proof of absence.
Last updated on