Compositions, layers, keyframes, 259 effects, expressions, 3D cameras and lights, and a render queue in a native compositor written in pure Rust. Young, moving fast, and already usable.

Animate the way you know

Familiar panels and keyframes: linear, bezier, hold and eased keys, roving keys, and a graph editor with value and speed curves.

Layers of every kind

Solids, shapes, text, footage, nested compositions, nulls, adjustment layers, cameras and lights, with parenting, track mattes and 38 blend modes.

259 effects

Blur, color correction, distortion, generators, keying, particles and simulation, stylize and time effects, each with sensible defaults.

Real 3D

3D layers with cameras, depth of field and lights that cast soft ray-traced shadows, plus orbit, pan and dolly tools.

Expressions

JavaScript expressions with wiggle, loops and layer references, edited inline and linked straight to any property.

Export anywhere

H.264 and ProRes with alpha, PNG, TIFF and 32-bit EXR sequences, GIF, and Lottie import and export for the web. No FFmpeg inside.

What's New

  • Land 49 community PRs, with follow-ups by @bflatastic in #598
  • i18n: add Brazilian Portuguese (pt-br) UI translation by @RicSchonfelder in #217
  • G2: Fix effect self-inputs, CC Composite, and control activation by @cdinhoo in #423
  • Add rendered-frame fidelity scoring by @vbasky in #427
  • Fix live preview freezing during rapid property edits by @cdinhoo in #442
  • Viewer: the shape tools draw their own shape while dragging, and a layer drag moves the picture by @Aavirash in #443
  • ui: import dropped media files with a drop-target hint by @David-T-Campos in #447
  • Render Essential Graphics templates from CLI values by @sanyamsingh001 in #451
  • MCP: return on write errors while stdin is open; document requests during a render by @storybored379 in #458
  • Add Spanish (es) UI translation by @llopjulen in #460
  • Relink missing footage by scanning a folder for compatible files by @vbasky in #461
  • i18n: Japanese for the panels, dialogs and tooltips (396 rows) by @haranishi in #469
  • Preserve 3D child position when changing parents by @sanyamsingh001 in #471
  • i18n: Ukrainian panels and platform Reveal labels (#333) by @dmatviichuk in #472
  • fix: CLI --bitrate now applies to VP9 WebM (#440) by @mjohnson7cd in #478
  • Scripting: importFile(ImportOptions) imports one file unless sequence is set (#475) by @MarekSpodBiedry in #479
  • Expressions: Add Expression applies to the selected properties (#476) by @MarekSpodBiedry in #480
  • EXR: do not double the part name of Blender 5 per-pass parts (#481) by @MarekSpodBiedry in #487
  • i18n: the text the interface below the menu bar draws reaches the catalog by @cjcwwww in #490
  • Preserve exact frame boundaries and timecode cancellation by @sanyamsingh001 in #497
  • Fix web playback performance with stacked footage by @daijro in #507
  • Return to Settings after dismissing GPU Information by @sanyamsingh001 in #512
  • chore: bump github actions to fix Node 20 deprecation warnings by @dylanmtaylor in #516
  • docs: register the MCP server from an installed release by @sawizzle in #517
  • Appearance modes: sync with system and separate light/dark themes by @luniiya in #519
  • fix(engine): layer.setText schema requires optional OpenType keys (#520) by @mjohnson7cd in #521
  • Honor explicit time bases in property and keyframe commands by @sanyamsingh001 in #522
  • Preserve keyframe selection order during attribute edits by @sanyamsingh001 in #524
  • Issue #543: Scripting: layers.addSolid keeps the requested pixel aspect by @LloydNicholson in #555
  • Preserve exported audio sample positions at work-area starts by @sanyamsingh001 in #556
  • PDF: bound what any stream filter may decode to by @haranishi in #557
  • Scripts: a script name is a file name, not a path by @haranishi in #558
  • fix(script): honor Item.selected=false while retaining other Project selections by @Ni-zav in #559
  • fix(script): keep pending TextDocument baseline reads in sync (#549) by @Ni-zav in #560
  • fix(expr): keep pending TextStyle baseline getters in sync by @Ni-zav in #561
  • fix(app): open .ecprojx files passed to the desktop executable by @Ni-zav in #562
  • fix(engine): validate new text layer positions without panicking by @Ni-zav in #563
  • fix(render-queue): accept Render Settings templates when adding jobs by @Ni-zav in #564
  • fix(render-queue): honor height-only edits with locked aspect ratio by @Ni-zav in #565
  • fix(script): deselect individual properties with Property.selected=false by @Ni-zav in #566
  • Import animated GIFs as movies by @Limestudio90 in #567
  • i18n: wrap hardcoded UI strings for Chinese localization by @seldoms in #571
  • Preserve the shown panel when removing inactive tabs by @sanyamsingh001 in #573
  • PDF colour spaces and functions: bound sizes, depth and stacks by @haranishi in #575
  • Tests: four failures on Windows (autosave paths, GPU viewer adapter, audio preview race) by @KattKnight in #579
  • macOS: projects open from Finder; .pcraft is PhotoCraft's again by @LloydNicholson in #582
  • Clarify property-group errors in property commands and MCP by @DWAA1660 in #299
  • Progress docs: re-measure parity against After Effects 2026 26.5 by @echelon in #617
  • Land community PRs, batch 2, with follow-ups by @bflatastic in #639
  • Reload Footage shows new pixels and keeps Photoshop layers; Reload Footage Changed on Disk by @KattKnight in #578
  • Rotation: dragging the degrees field can go negative by @itrycodinganditsbad in #584
  • Effect reset: restore parameters inside twirl-down groups by @itrycodinganditsbad in #585
  • Support continuous numeric scrubbing across monitor edges by @kikikikier in #592
  • Add inline font family search in Character and Properties by @kikikikier in #593
  • Preserve reachable history branches during trimming by @sanyamsingh001 in #597
  • Keep work-area edits inside the composition by @vbasky in #605
  • Move separated Position on canvas resize and crop by @vbasky in #606
  • Move layers when Position is edited with separated dimensions by @vbasky in #607
  • Show a layer through its first Intersect or Darken mask by @vbasky in #608
  • Startup: a launch that stops as its window is shown switches the next to OpenGL (AMD Vulkan crash) by @JeremyYao in #589
  • Land community PRs, batch 3, with follow-ups by @bflatastic in #643
  • Keep the playhead on the displayed current time by @vbasky in #610
  • Start Linux audio preview without a silence preroll by @vbasky in #614
  • Interface: probe Hangul so Korean text isn't drawn as boxes (#599) by @MarekSpodBiedry in #616
  • Viewer: passive Composition viewers apply the monitor color conversion (#547) by @MarekSpodBiedry in #618
  • Locked viewer: re-convert pixels when the display profile or output simulation changes (#546) by @MarekSpodBiedry in #619
  • Effects: CC Power Pin Unstretch reverses the pin mapping (#534) by @MarekSpodBiedry in #620
  • CC Simple Wire Removal: Frame Offset takes the strip from the previous or next frame (#533) by @MarekSpodBiedry in #621
  • Rove Across Time keeps roving keys off the neighbouring fixed keys' times (#532) by @MarekSpodBiedry in #622
  • Convert Expression to Keyframes: sort the keys by layer time on a time-reversed layer (#531) by @MarekSpodBiedry in #623
  • Fix recording a shortcut: the field no longer types the key too, and Cmd++ parses (#467) by @MarekSpodBiedry in #626
  • Render queue: unsaved project outputs go to ~/Movies or home, not the working directory (#446) by @MarekSpodBiedry in #627
  • Let pan and zoom work while 3D Camera Tracker points are shown (#505) by @MarekSpodBiedry in #628
  • Reopen panels from the Window menu when the dock is empty (#529) by @MarekSpodBiedry in #629
  • fix(effect): expose parameter metadata in effect.list (#441) by @Ni-zav in #631
  • fix(ui): drag all selected Project items into compositions by @Ni-zav in #634
  • UI: one After Effects-style colour picker with a hex field for every colour input by @FrederoxDev in #638
  • Fix 28 community-reported issues (crash, security, AE parity) by @bflatastic in #645
  • Land #641: GPU precomp layers, with follow-ups by @bflatastic in #648
  • GPU: render precomp layers resident on the GPU (#640) by @MatejKozlovsky in #641
  • Fix community-reported issues: multi-layer edits, stacked-panel tabs, 32 bpc blend modes, and more by @bflatastic in #655
  • Fix community-reported issues: Light theme contrast, macOS Sync with System, Timeline eyedropper, DX12 kernel fallback by @bflatastic in #667
  • Community batch: font folders, empty-Timeline drop, AE auto-Bezier tangents, clippy 1.95 by @bflatastic in #668
  • Lint: clippy's collapsible_match passes on Rust 1.95 by @tylerjenningsw in #646
  • Keyframes: auto-Bezier spatial tangents follow After Effects by @KattKnight in #650
  • fix(timeline): create first composition from a footage drop by @Ni-zav in #662
  • fonts: extra font folders from EFFECTCRAFT_FONT_DIRS by @johnstockertutorial-afk in #665
  • Issue fixes: GPU device loss, motion-path vertex tools, rename focus, macOS sheet dialogs, MCP file confinement, desktop shortcut by @bflatastic in #674
  • Community batch: pointer-wrap test texture deltas, device-lost dialog by @bflatastic in #675
  • Tests: pointer-wrap frames drain egui's texture deltas (freebsd CI) by @vbasky in #671
  • Issue fixes: drag render pile-up, CC Smear/Tiler past text bounds, relative footage paths, GIF playback test by @bflatastic in #676
  • Release prep: 0.8.0 and a Linux riscv64 release build by @echelon in #669