EffectCraft is an open-source motion graphics and visual effects application designed as a clean-room reimplementation of Adobe After Effects. Written in Rust, it provides a native desktop editor for Windows, macOS, and Linux, alongside a browser-based version.
The application focuses on professional animation and compositing workflows, including keyframes, animated text, masks, visual effects, 3D cameras, lights, and a render queue. Its interface follows familiar After Effects conventions, making it easier for experienced motion designers to understand its workflow.
EffectCraft also stands out for its automation capabilities. Projects use a readable JSON-based format, and the application exposes its editing engine through a command-line interface, a JSON control channel, and an MCP server for AI agents.
Features
EffectCraft includes a broad collection of tools for motion graphics and visual effects.
Timeline and keyframes: Animate layer properties with linear, Bezier, hold, and eased interpolation. The Graph Editor provides value and speed graphs for adjusting animation curves.
Layer compositing: Combine text, shapes, footage, nested compositions, adjustment layers, solids, cameras, and lights. Parenting, track mattes, blend modes, and motion blur are supported.
Shape animation: Create shape layers with trim paths, repeaters, rounded corners, gradient strokes, and other procedural shape operators.
Masks and selection: Draw and edit masks with feathering, expansion, and different compositing modes.
Text animation: Work with point text, paragraph text, text animators, range selectors, and text-on-path workflows.
Expressions: Use JavaScript expressions with familiar After Effects-style objects and functions, including wiggle, loopOut, and layer references.
Puppet tools: Animate character and object deformations with pins, mesh controls, rigging, and follow-through.
Visual effects: Apply blur, sharpening, color correction, distortion, keying, noise, stylization, transitions, simulation, and audio effects.
Layer styles: Apply effects such as Drop Shadow, Inner Glow, Outer Glow, Bevel and Emboss, Satin, Stroke, and color overlays.
3D scenes: Work with 3D layers, cameras, lights, depth of field, and shadows.
Motion tracking: Use tracking and analysis tools for motion-related workflows.
Audio support: Preview animations with synchronized audio, waveforms, meters, and audio effects.
Lottie integration: Import and export supported animations for use in websites and applications.
Render queue: Export animations and compositions to video, audio, image sequences, and animated formats.
Automation: Control editing operations through the CLI, JSON interface, and MCP server.
The effects library is particularly ambitious, covering hundreds of effects inspired by familiar After Effects categories. It includes tools for color correction, distortion, keying, simulation, perspective, time manipulation, audio processing, and stylization.
Lottie import and export is another practical advantage. It allows compatible animations to move between EffectCraft and web or application workflows without requiring a separate export plugin.
Download EffectCraft v0.19.0 - Software Mirrors |
|---|
EffectCraft v0.19.0 for Windowseffectcraft-0.19.0-windows-x86.msi | 56.68 MB effectcraft-0.19.0-windows-x86-portable.zip | 72.75 MB effectcraft-0.19.0-windows-x64.msi | 58.11 MB effectcraft-0.19.0-windows-x64-portable.zip | 77.18 MB effectcraft-0.19.0-windows-arm64.msi | 51.86 MB effectcraft-0.19.0-windows-arm64-portable.zip | 71.02 MB |
EffectCraft v0.19.0 for macOSeffectcraft-cli-0.19.0-macos-universal.zip | 69.77 MB effectcraft-0.19.0-macos-universal.dmg | 74.77 MB |
EffectCraft v0.19.0 for Linuxeffectcraft-0.19.0-linux-x86_64.tar.gz | 73.93 MB effectcraft-0.19.0-linux-x86_64.rpm | 75.16 MB effectcraft-0.19.0-linux-x86_64.pkg.tar.zst | 51.62 MB effectcraft-0.19.0-linux-x86_64.flatpak | 47.76 MB effectcraft-0.19.0-linux-x86_64.deb | 75.64 MB effectcraft-0.19.0-linux-x86_64.AppImage.zsync | 238.92 kB effectcraft-0.19.0-linux-x86_64.AppImage | 68.19 MB effectcraft-0.19.0-linux-riscv64.tar.gz | 71.59 MB effectcraft-0.19.0-linux-riscv64.rpm | 72.92 MB effectcraft-0.19.0-linux-riscv64.deb | 73.1 MB effectcraft-0.19.0-linux-aarch64.tar.gz | 68.79 MB effectcraft-0.19.0-linux-aarch64.rpm | 71.34 MB effectcraft-0.19.0-linux-aarch64.pkg.tar.zst | 48.57 MB effectcraft-0.19.0-linux-aarch64.flatpak | 42.08 MB effectcraft-0.19.0-linux-aarch64.deb | 72.05 MB effectcraft-0.19.0-linux-aarch64.AppImage.zsync | 222.61 kB effectcraft-0.19.0-linux-aarch64.AppImage | 63.53 MB |
EffectCraft v0.19.0 for BSDeffectcraft-0.19.0-freebsd-x86_64.tar.gz | 73.49 MB effectcraft-0.19.0-freebsd-aarch64.tar.gz | 70.63 MB |
Others Download related to EffectCraft v0.19.0effectcraft-web-0.19.0.zip | 20.53 MB |
EffectCraft v0.19.0 Source Code
EffectCraft v0.19.0 Source code (zip)
EffectCraft v0.19.0 Source code (tar.gz)
|
EffectCraft v0.19.0 Release Notes: What's Changed- Honor CARGO_BUILD_TARGET in FreeBSD packaging for aarch64 release builds by @dylanmtaylor in #2555
- Export: convert H.264 frames to YUV 4:2:0 on the GPU by @MatejKozlovsky in #1631
- Face tracker: find polygon crossings once per window row by @vangel76 in #2334
- Camera tracking: validate solver input and bound workspaces by @vangel76 in #2341
- av1enc: reuse scratch buffers in the transform path, the coefficient writer and the level search by @vangel76 in #2405
- vp9enc: loop filter in 8-lane groups by @vangel76 in #2448
- Shapes: Wiggle Paths has Spatial Phase, which slides its wiggle along the path by @dotCooCoo in #2450
- Skip whole CSS at-rule blocks in the SVG parser by brace depth by @Silvertree2010 in #2547
- Fix Align Video to Data panic on multi-byte char in timestamp by @Silvertree2010 in #2548
- Disk cache: 20 GB default and a free-space reserve, so it no longer fills the disk (#2551) by @arnav-hiwarkar in #2553
- Glow, Radial Blur, Venetian Blinds, Radial Wipe, Fractal Noise and the Transform effect render as in After Effects by @vangel76 in #1873
- Cryptomatte pick: keep a hover probe, built off the UI thread (#473) by @MatejKozlovsky in #2517
- Scripts: Recent Script Files lists the last ten scripts and Cmd+Alt+Shift+D reruns the newest by @dotCooCoo in #2291
- Fix #341: on macOS, a quit goes through
terminate: by @dotCooCoo in #1762 - GPU: Classic 3D builds with FXC, so the GPU compositor starts on DirectX 12 (#613) by @MatejKozlovsky in #1571
- SVG, FCP XML: bound XML entity expansion (#2129) by @bflatastic in #2597
- Camera tracking: avoid per-view triangulation allocations by @vangel76 in #2338
- i18n: two labels that already had a catalog row were formatted in English by @zitann2020 in #1669
- Fix HexTile centerline cell selection by @sanyamsingh001 in #1776
- Keep FrameRate::from_f64 nonzero for tiny positive fps by @Silvertree2010 in #2287
- Bound SVG arc segment count for huge radii by @Silvertree2010 in #2288
- Require hex digits in glTF uri_decode percent escapes by @Silvertree2010 in #2460
- Reject '+' signs in Lottie text stroke colour hex pairs by @Silvertree2010 in #2542
- macOS: declare the UI languages so the open and save panels are translated by @Atalantis in #2470
- Scripts: socket tests wait for the buffers to stay full on macOS by @dotCooCoo in #2533
- EffectCraft — start the window surface from eframe's default (frame latency 2 → 1) by @ZJHeepfixer in #2370
- Lottie: import a layer's time stretch below 1 % as 100 %, with a warning by @marcoarnulfo in #2308
- vp9enc: forward transform accumulates all outputs together by @vangel76 in #2446
- i18n(ka): shorter Georgian for 14 labels that didn't fit by @devius in #2422
- Lottie: size an imported precomp from its precomp layer's w/h when the asset has none by @marcoarnulfo in #2306
- opusenc: eight partial sums in the 48 kHz decimator by @vangel76 in #2404
- Web: keep Duplicate from opening browser bookmarks by @nanox333 in #2538
- CLI: log warnings to stderr by default by @MatejKozlovsky in #1651
- fix(render): use pixel units for text animator tracking amount by @kk376 in #1822
- Docking: reject raw panel opens through command aliases by @nanox333 in #2527
- i18n: Russian, German and French follow Match System and translate the menus (#1449) by @JaffarSk24 in #2507
- vp9enc: fixed-size SAD kernels and a revisit cache in the motion search by @vangel76 in #2447
- opusenc: radix-2/3/4 FFT kernels for the MDCT by @vangel76 in #2403
- Camera tracking: skip unused SVD output work in null-vector queries by @vangel76 in #2345
- Camera tracking: keep bundle-adjustment Jacobians on the stack by @vangel76 in #2340
- Mask tracker: keep only the cropped previous frame by @vangel76 in #2337
- Share the Warp Stabilizer luma pyramid with trajectory tracking by @vangel76 in #2350
- Reuse the validated Warp Stabilizer plan on first render by @vangel76 in #2347
- Workspaces: wait for migrated window positions before saving by @nanox333 in #2526
- ScriptUI: fix script-drawn colours showing too bright by @onlykshitij in #2272
- Lottie: import every Dash/Gap pair of a stroke, not only the first dash and the last gap by @marcoarnulfo in #2302
- Menus: a pointer coming back into the window over another title switches menus (#1290) by @tylerjenningsw in #1297
- Classic 3D Shadow Diffusion blurs instead of stamping copies (#2444) by @HEOJUNFO in #2463
- engine: a template's footage entry can't name a file outside the folder (#2123) by @Anubhav-Rai in #2523
- MCP: list_commands and list_effects take compact: true (#2020) by @becauseno7 in #2344
- Fixes: macOS quit crash, soft shadow jitter, Interpret Footage params, preset upgrade, composition proxies, font menu names by @dotCooCoo in #2466
- Advanced 3D: shadow jitter blends across its lattice cell, so GPU penumbrae match the CPU by @dotCooCoo in #2283
- Font menu: a name the interface fonts cannot draw shows in English by @dotCooCoo in #2453
- Reject legacy workspace stacks beyond the layout depth limit by @dotCooCoo in #2515
- Interpret Footage: the params docs list every key the commands read by @dotCooCoo in #2309
- Animation presets: effects saved by an earlier version are upgraded on apply, as in a project by @dotCooCoo in #2336
- Proxies: a composition proxy draws with Separate Fields, Invert Alpha, linear light and Frame Blending by @dotCooCoo in #2352
- Use frozen Object Matte in sessions without the freezing model by @Silvertree2010 in #1852
- av1enc: build the three half-sample reference planes in one pass by @vangel76 in #2401
- Keep rgb_to_hsl saturation finite for over-range colours by @Silvertree2010 in #2462
- Return identity from Mat3::square_to_quad for a degenerate quad by @Silvertree2010 in #1947
- Fix "-0.000" in seconds time display for tiny negative times by @Silvertree2010 in #2467
- Shape Size gets the Constrain Proportions chain, off by default (#2489) by @ashokram-si in #2550
- Draw a line to the end point of degenerate SVG arcs by @Silvertree2010 in #2181
- vp9enc: vectorised phase-plane filters and a predict fast path by @vangel76 in #2445
- opusenc: tabulate the a2nlsf cosine grid, halve its bisection, memoise pitch contour correlations by @vangel76 in #2398
- Camera tracking: factor narrow camera systems within their band by @vangel76 in #2342
- Tracker: Lucas-Kanade resolves its bilinear taps once per window by @vangel76 in #2331
- vp9enc: probability delta table, linear bool-encoder carry, clamp oversized frames by @vangel76 in #2449
- av1enc: fix the bitrate overshoot of the bitrate mode rate control by @vangel76 in #2408
- automation: a confined agent can't start a script's code (#2131 F-11, "Running code") by @Anubhav-Rai in #2521
- Automation: confine every command that reads or writes a file it is given (#1243) by @DWAA1660 in #1347
- effects: Turbulent Displace Evolution moves the pattern at a constant rate (#943) by @klosixgaming-arch in #2535
- i18n: the CJK fallback sits on the Latin baseline (#1309) by @zitann2020 in #1395
- Auto-orient: keep the last heading when an expression-driven Position stops by @marcoarnulfo in #1661
- model: cap glTF buffer-less accessors per file, check element offsets (#2139) by @Barzabel in #2158
- export: tag BT.709 limited-range nclx; the ffmpeg oracles pick decoders by name and skip unbuildable fixtures by @Kaedo17 in #2362
- GPU: contain frame-local validation failures (refs #1319) by @tylerjenningsw in #1326
- av1enc: find the first frame's quantizer in fewer passes by @vangel76 in #2409
- opusenc: vectorisable candidate filter for the greedy PVQ pulse search by @vangel76 in #2402
- opusenc: build the PVQ V table once for encode_pulses by @vangel76 in #2394
- CLI: run --commands reads {"command", "params"} steps from a JSON or JSON Lines file, or standard input (#2251) by @marcoarnulfo in #2311
- Point tracker: refine in a 3x3 neighbourhood when the motion was small by @vangel76 in #2351
- Point tracker: candidates share one tap table, gradients only where lk_refine reads them (#2318) by @vangel76 in #2339
- Expressions: Alt-pickwhip references effect parameters by index (refs #1072) by @tylerjenningsw in #1385
- effects: speed up Match Grain's CPU analysis (~3x on 1080p/4K) by @ki2pixel in #1904
- i18n(ja): the effect names, 297 of 307, as AE's Effect menu draws them by @zitann2020 in #2157
- i18n: complete the Brazilian Portuguese (pt-br) panel catalog by @yanhenrique-dev in #1774
- expr: bound runtime parser and native recursion depth (#2124, #2125) by @Barzabel in #2161
- Export: Targa (.tga) sequence output, 24-bit RGB or 32-bit RGB + Alpha by @ashokram-si in #2476
- Add a Nix flake (NixOS, GNOME and Hyprland) by @untypequicode in #1069
- docs: add user docs in docs/user by @itrycodinganditsbad in #973
- Particles: preserve emitted particles when Birth Rate changes (#1373) by @tylerjenningsw in #1382
- Preview: preserve opening audio while preparing video playback (#947) by @tylerjenningsw in #1177
- Fix timeline layer drops after scrolling (#2492) by @WillPastor in #2519
- Roto Brush: apply correction strokes in drawing order (#1646) by @tylerjenningsw in #1804
- Mask feather, Repeater opacity and Trim Paths on rectangles render as in After Effects by @vangel76 in #1874
- Clipboard: export keyframes as After Effects-compatible text by @tylerjenningsw in #1921
- av1enc: specialise the inverse transform per size, size the forward tmp buffer by @vangel76 in #2396
- Marker names are drawn in a small outlined box, in theme colours by @nanox333 in #1805
- model: OBJ/MTL references from another machine find the file next to the model, and a missing one is logged by @midasmatterhorn in #1504
- Export: cap CPU frames in flight with EFFECTCRAFT_CPU_INFLIGHT (#1615) by @Higgs32584 in #1763
- Markers: adding one during playback no longer stops the audio (#1083, #1085) by @vangel76 in #1092
- Scripts: subfolders of the Scripts and ScriptUI Panels folders become submenus by @onlykshitij in #2289
- Particles: CC Particle Systems II and CC Mr. Mercury keep emitted particles when Birth Rate changes (#1373) by @tylerjenningsw in #1390
- Animation presets: anchor saved effect keyframes at the playhead by @tylerjenningsw in #2452
- Reuse Warp Stabilizer and Camera Tracker analysis keys by @vangel76 in #2348
- #1510: Behaviors animation presets (22 original, expression-driven) by @vangel76 in #1513
- Timeline: every shape Contents item has an eye switch, as in After Effects (#959) by @bflatastic in #2598
- Content-Aware Fill: refuse up front when the frames can't fit in memory (#1789) by @bflatastic in #2599
- Import: a numbered still named without sequence imports as itself, as in After Effects (#2018) by @bflatastic in #2604
- Viewer: Shift keeps a dragged mask or shape vertex to one axis (#1964) by @bflatastic in #2605
- Media: vector footage past 16384×16384 is an error, not an abort (#2136) by @bflatastic in #2606
- Footage reads refuse anything that isn't a regular file (#2134) by @bflatastic in #2607
- Media: header-sized EXR windows and audio sample rates are bounded (#2141) by @bflatastic in #2608
- UI: open padlock on an unlocked viewer lock; inactive comp tabs show their × on hover by @pravdomil in #822
- Viewer trackpad gestures: two-finger scroll pans, pinch zooms by @pravdomil in #1036
- UI: Composition Settings keeps Cancel and OK in place between tabs by @pravdomil in #1100
- #595: RAM preview no longer stalls on a gap right after the playhead by @pravdomil in #1121
- Timeline: parent and matte selected layers together (#1260) by @tylerjenningsw in #1291
- UI: colour expression-driven numeric values consistently (refs #1072) by @tylerjenningsw in #1314
- build: add an optional dev-full profile with full debug info by @elZanco in #1655
- Timeline: trimming the Out point to the playhead keeps its frame visible by @elZanco in #1737
- UI: double-clicking a creation tool in the Tools bar makes an instance (#1072) by @elZanco in #1654
- fix(engine): preserve alpha channel when saving still PNG frames by @kk376 in #1820
- Fix Animation > Browse Presets command by @slager2 in #2250
- av1enc: truncate instead of floor, log2 lookup table, skip division in the dead zone by @vangel76 in #2400
- Fix #2201: one undo reverts a whole mask free-transform drag by @jerome25000 in #2426
- Native Edit menu: use text-field Undo and Redo labels while typing by @nanox333 in #2528
- Ease Presets: restore Linear interpolation and diamond keyframes by @nanox333 in #2539
- i18n(ja): the Generate effect category is 描画 by @zitann2020 in #2583
- fix(text): keep an empty Type-tool layer, as AE does by @zitann2020 in #2595
- feat(web): choose the project the page opens with a
startup config key by @gjrtimmer in #2580 - Avoid quadratic Schur assembly for long camera tracks by @vangel76 in #2346
- Project files: opt-in compact .ecproj JSON (Save Compact Project Files) by @pravdomil in #2601
- ci: name the missing ALSA package instead of dying at link time by @Kaedo17 in #2363
- Text lays out as in After Effects: box text baseline, right-to-left text, Justify All, animator tracking, per-character 3D rotation by @vangel76 in #1875
- Tests: QA scenarios ask for image sequences explicitly by @bflatastic in #2609
- project: output_size never asks for sides past the comp limit by @midasmatterhorn in #1568
- Scripts: text animator properties resolve by their After Effects names (refs #1063) by @nanox333 in #1164
- Parented cameras and lights keep their static and keyed Orientation (refs #1010) by @nanox333 in #1165
- #1417: WAV markers show on the audio layer by @nanox333 in #1423
- Expressions: cubic-Bezier easing helper (bezier(...)) (#1884) by @ki2pixel in #1887
- Fix #1747: keep collapsed precomp instance overrides unclipped by @ki2pixel in #1951
- layer.create: implement the instance3d op - a 2D copy of a 3D model layer (#2100) by @Minher0 in #2410
- i18n: the 31 tool names are translated (zh-hans, zh-hant) by @FeiLiuEM in #1514
- i18n: the Preview panel's labels reach the catalog by @FeiLiuEM in #2427
- fix: bound Classic 3D depth-of-field blur and reject non-finite focus distances (#2092) by @ChristopherLinnett in #2118
- docs: clarify engine and UI-only command access (#2564) by @Zaxaerith in #2569
- ci(deps): bump storytold/craft-common-actions/.github/workflows/windows-arm64.yml from 8bb4e5ab95443171104ad88113fe1ef9b0e5ce3f to fa5ef18780cf5e7d5d3b8de068de56cffc83cac5 in the actions group by @dependabot[bot] in #2575
- Audio: keyframed Audio Levels and Stereo Mixer levels ramp within a mix block by @roadhong in #2574
- export: dither 16/32 bpc renders on the way to 8 bits, and let Render Settings Color Depth set the render's depth (#2022) by @klosixgaming-arch in #2534
- Viewer: Alt/Option-drop of a Project item replaces the layer under the pointer by @mypenc in #2270
- project: keep valid ROI crops on wide frames while still refusing overflow (#1577) by @klosixgaming-arch in #2532
- engine: Replace Footage keeps a still a still (#2073) by @gmrmad1 in #2107
- tests: count variable font named instances as styles (#2072) by @gmrmad1 in #2109
- Text: Chinese Han text uses the installed Chinese face (#453) by @midasdf in #2039
- Transform: Fit to Comp sizes shape and text layers by their painted bounds (#2198) by @SusieeTheLinuxUser in #2262
- Edit: duplicating during a text edit ends the edit (#2226) by @SusieeTheLinuxUser in #2266
- Edit: an open text edit stands down the Project-panel Clear redirect (#2227) by @SusieeTheLinuxUser in #2263
- Text: stroke Line Join — Miter, Round or Bevel (#2077) by @bflatastic in #2610
- Effects: padded buffers stay within a pixel budget (#2261) by @bflatastic in #2611
- Timeline: drag effects, masks and shape items to reorder them (#2210) by @bflatastic in #2612
- Viewer: a mask vertex held at the panel edge pans the view (#999) by @bflatastic in #2616
- README: 308 effects, and a test keeps the count current (#2565) by @bflatastic in #2617
- Import: an MP4 lasts as long as its video edit list shows (#2592) by @bflatastic in #2619
- Scripts: FootageItem.replace() swaps in one file, as in After Effects by @bflatastic in #2621
- Render Queue: elapsed and remaining time tick between frames (#2593) by @bflatastic in #2622
- Keyframes: mute keyframes without deleting them (#1894) by @ki2pixel in #1895
- Expressions: a layer is a callable property group by @tylerjenningsw in #1387
- CC Bubbles: bubbles at the layer's edges refract its edge pixels, not a pale fill (#2024) by @becauseno7 in #2600
- UI: Rescan Fonts in the font menu; assert the Linux system scan (#1089) by @vbasky in #1298
- fix(i18n): follow browser language preferences (#1700) by @nanox333 in #1784
- Render: remove the blanket layer cover; per-effect padding already covers what needs it by @vbasky in #1279
- Fix #2573: New Composition From Footage creates a composition by @arnav-hiwarkar in #2615
- Shapes: add the Wiggle Transform path operation, which wiggles paths and each Repeater copy by @dotCooCoo in #2355
- Scripts: the Startup and Shutdown folders run at launch and quit by @dotCooCoo in #2279
- Interpret Footage: Cineon Settings convert DPX and Cineon log scans by @dotCooCoo in #2300
- Scripts: File ▸ Scripts entries take keyboard shortcuts by @dotCooCoo in #2356
- i18n: the labels the call-shape scan cannot see by @FeiLiuEM in #1581
- i18n(ja): panels and dialogs (27% → 39%) by @midasdf in #2054
- Light Environment lights: default environment, Casts Shadows, Advanced 3D switch by @Minher0 in #2474
- #1436: settings dialogs preview live and leave the window undimmed (Gradient Editor, Solid, Camera, Light, Composition) (#1439) by @bflatastic in #2626
- #1436: settings dialogs preview live and leave the window undimmed (Gradient Editor, Solid, Camera, Light, Composition) by @nanox333 in #1439
- i18n: add Polish (pl) interface language by @lewandowskit in #1340
- perf: share unchanged layers between undo states (scripts in big comps went quadratic) by @infinityespi in #2567
- i18n: catalogs list each source once again by @bflatastic in #2627
- ScriptUI: a drag keeps its control past the window edge; MouseEvent.buttons (#2584) by @bflatastic in #2624
- Timeline: Shift-click adds effects and other groups to the selection (#2552) by @bflatastic in #2628
- ScriptUI: a docked panel gets its dock's size and onResize (#2585) by @bflatastic in #2629
- Docs: ROADMAP progress log and ScriptUI parity for 30 October by @bflatastic in #2630
- Settings: a dragged UI Scale applies on release (#2582) by @bflatastic in #2631
- Export: apply crop once when calculating resize dimensions by @erythrofr in #2623
- Shapes: per-corner roundness for Rectangle Path (#1896) by @ki2pixel in #1897
- Fix faceted path overlays at high viewer zoom by @p01ntov in #1726
- CC Bubbles: bubbles refract the layer's edge pixels on padded buffers too (#2024) by @becauseno7 in #2620
- Add Blender scene export for the 3D Camera Tracker by @Krueels in #2442
- Media: update the FilmCraft backend for AVI import by @tylerjenningsw in #1736
- Media: enable AVI import across supported entry points by @tylerjenningsw in #1739
- EffectCraft — no polling while idle: a deadline worker that sleeps, and a footage watcher that wakes the UI only on change by @ZJHeepfixer in #2369
- EffectCraft — open the window before the GPU compositor is built by @ZJHeepfixer in #2368
- deps: bump tar, zip, roxmltree, rustls-webpki and symphonia to latest by @dylanmtaylor in #2633
- CI: workflows only call craft-common-actions at @main (AGENTS.md; windows-arm64 unpinned) by @dylanmtaylor in #2625
- i18n(ja): fix one mistranslation and unify terms the menu and the panels spell differently by @C0uki in #2635
- Markers: keep names and duration handles visible at viewport edges by @nanox333 in #2634
- Fix #1743: protect render outputs from replacing project sources by @nanox333 in #1758
- #712: color pickers get an eyedropper everywhere (#1328) by @bflatastic in #2639
- #712: color pickers get an eyedropper everywhere by @nanox333 in #1328
- Windows: document the GNU toolchain's import-library requirements (#1886) by @tylerjenningsw in #1892
- deps: bump tar, zip, roxmltree, rustls-webpki and symphonia to latest (#2633) by @bflatastic in #2640
- fix(effects): let CC Particle World's Textured Square use a Texture Layer by @marcoarnulfo in #1610
- Character panel: All Fills Over All Strokes and All Strokes Over All Fills in the stroke order menu by @marcoarnulfo in #2245
- MCP: get_property and get_layer list an enum property's options (#2085) by @marcoarnulfo in #2236
- Scale Composition: comp.scale resizes a comp and scales its layers, keys, cameras and guides by one factor by @marcoarnulfo in #2248
- Layer Styles: changed Blending Options outlive the last style and only pixel-changing styles block a clip export (#1389) by @marcoarnulfo in #1601
- Polystar: synchronize inner controls after expressions and key edits by @nanox333 in #2632
- Automation: a confined renderQueue.add without output needs a saved project (#2479) by @bflatastic in #2636
- Tests: the Timeline's text Animate and Add menus add animators and properties (#2513) by @bflatastic in #2637
- Import: a sequence of bare frame numbers is named after its folder (#2019) by @bflatastic in #2641
- Windows: Reveal in Explorer opens File Explorer, not the browser (#1961) by @bflatastic in #2642
- Graph Editor: share keyframe menus and close the Render Queue with Cmd+W by @nanox333 in #1342
- Fix/1190 checkbox drag by @nanox333 in #1226
- Text: duplicate ends the open text edit and selects the copy (#2226) by @ChristopherLinnett in #2268
- automation: a confined agent can't queue a render output outside the roots (#2479) by @Anubhav-Rai in #2520
- Audio: link stereo level edits while preserving channel balance by @tylerjenningsw in #2562
- Puppet: Shift-select several pins in the Timeline and edit them together by @tylerjenningsw in #1755
- i18n(ja): drop the space between Latin text and Japanese in 37 rows by @C0uki in #2638
- Tests: Simple Choker keeps growing the matte down to -100 (#2102) by @bflatastic in #2643
- Character panel: the stroke width shows its icon and a presets menu (#2075) by @bflatastic in #2645
- Layer Style dialog: Edit Gradient… opens the Gradient Editor (#2057) by @bflatastic in #2652
- Viewer: motion path follows X/Y Position when dimensions are separated (#2242) by @MarekSpodBiedry in #2255
- Translate remaining Japanese panel labels by @haranishi in #1772
- Update prompt shows the app icon instead of a letter by @dylanmtaylor in #2646
- Adjustment layers blend in their blend mode (#2618) by @bflatastic in #2653
- Settings: older settings files split layers above the original (#2545) by @bflatastic in #2654
- Update prompt shows the app accent color by @dylanmtaylor in #2656
- ui: a file dropped on the Timeline joins that composition (#2588) by @zitann2020 in #2650
- ui: a drop that holds the target composition lands the rest of the selection (#2589) by @zitann2020 in #2649
- i18n(ja): the panel catalog's last 65 rows by @zitann2020 in #2648
- Discrete property choices are one undo step each (#2152) by @bflatastic in #2655
- layer.slip reports the requested shift and whether it was clamped (#2371) by @bflatastic in #2657
- Make font substitute test work when original fonts are installed by @dotCooCoo in #2658
- Premiere Pro export pre-renders in the background (#2269) by @bflatastic in #2662
- Accessibility (gap 25): an AccessKit audit test; names, roles and keyboard operation for Effects & Presets, Settings and Render Queue by @vangel76 in #1339
- Fix pretend-version testing for update prompts by @dylanmtaylor in #2663
- docs: gaps.md says the CI gate runs on pull requests (gap 4 closed) by @bflatastic in #2665
- ui: the composition the drop lands in is left out even when unselected (#2589) by @zitann2020 in #2664
- Viewer: mouse-wheel scrubbing over the Composition monitor (#1218) by @vbasky in #1287
- ui-egui: the accessibility and keyboard tests join the one test binary by @bflatastic in #2669
- Cache/GPU: adjustment footprint ignores the effect stack; upload starvation is reported (#687) by @vbasky in #701
- Fix pretend-version testing for update prompts (#2663) by @bflatastic in #2667
- Shape toolbar: keep gradient stroke widths by @nanox333 in #2668
- Fix #2091 copy/paste masks between layers by @jerome25000 in #2216
- #1743, part 3: two Render Queue outputs never write the same file, and default names avoid the queue's other outputs by @nanox333 in #1830
- Roto Brush: follow the object with SAM 2.1 (Tiny, Small, Base+, Large; optional models) by @nanox333 in #1539
- #1743, part 2: commands that write to a path never replace footage, a proxy or the project file by @nanox333 in #1829
- fix(flatpak): allow reading launcher version pins by @dylanmtaylor in #2704
New Contributors- @Atalantis made their first contribution in #2470
- @ZJHeepfixer made their first contribution in #2370
- @kk376 made their first contribution in #1822
- @JaffarSk24 made their first contribution in #2507
- @onlykshitij made their first contribution in #2272
- @becauseno7 made their first contribution in #2344
- @ashokram-si made their first contribution in #2550
- @klosixgaming-arch made their first contribution in #2535
- @Kaedo17 made their first contribution in #2362
- @yanhenrique-dev made their first contribution in #1774
- @untypequicode made their first contribution in #1069
- @WillPastor made their first contribution in #2519
- @Higgs32584 made their first contribution in #1763
- @slager2 made their first contribution in #2250
- @jerome25000 made their first contribution in #2426
- @gjrtimmer made their first contribution in #2580
- @Minher0 made their first contribution in #2410
- @dependabot[bot] made their first contribution in #2575
- @roadhong made their first contribution in #2574
- @mypenc made their first contribution in #2270
- @SusieeTheLinuxUser made their first contribution in #2262
- @lewandowskit made their first contribution in #1340
- @infinityespi made their first contribution in #2567
- @erythrofr made their first contribution in #2623
- @p01ntov made their first contribution in #1726
- @Krueels made their first contribution in #2442
- @C0uki made their first contribution in #2635
Full Changelog: v0.18.0...v0.19.0 |
Performance and Compatibility
EffectCraft is written in Rust and uses a modular architecture intended to keep the editing engine independent of the graphical interface. Its rendering system supports GPU acceleration, while CPU-based processing remains available for relevant operations.
The project is designed to run on Windows, macOS, and Linux. A WebAssembly build also allows the editor to run in a browser, with browser storage used for projects and related data.
Its rendering pipeline supports H.264, ProRes, HEVC, AV1, VP9, and Opus, alongside image sequences and other export formats. The project emphasizes Rust-based media processing rather than depending on FFmpeg as its internal encoding and decoding foundation.
EffectCraft also offers a useful approach to project files. Its native .ecproj format uses versioned JSON, making projects easier to inspect, compare, and manage in version control than opaque binary documents.
However, EffectCraft cannot open native After Effects .aep or .aepx project files, and third-party After Effects plugins cannot run in it. Compatibility with individual effects and workflows should therefore be tested before considering a complete migration.
The project is also relatively young. Although its feature list is extensive, the developers acknowledge that real-world workflow reliability and output fidelity still need further validation. Having an equivalent tool does not necessarily mean that it behaves identically to its After Effects counterpart.
System Requirements
EffectCraft supports:
Prebuilt desktop packages are available for supported platforms. Linux distributions have access to AppImage, DEB, RPM, and tarball packages, including x86_64 and ARM64 builds.
Building from source requires Rust and the appropriate platform dependencies. The browser version requires a WebAssembly-compatible browser and suitable graphics support.
Because EffectCraft can process complex compositions, performance will depend on the GPU, available memory, footage resolution, effect complexity, and output settings. The project does not yet provide sufficient real-world benchmarking to establish reliable performance expectations for every workload.
Pros and Cons
Pros
Free and open-source
Native Rust architecture
Windows, macOS, and Linux support
Browser-based WebAssembly version
Extensive keyframe and animation controls
Graph Editor with value and speed graphs
Large collection of visual effects
Masks, shape layers, and text animation
Expressions and puppet tools
3D cameras, lights, and depth of field
GPU-accelerated rendering
Broad video and audio export support
Lottie import and export
Readable JSON-based project format
CLI and MCP automation
No telemetry by default
Designed to work offline
Cons
Still a young project
Cannot open native After Effects project files
No compatibility with third-party After Effects plugins
Output fidelity against After Effects has not been comprehensively measured
Some platform-specific workflows still need refinement
Performance on complex projects requires more independent benchmarking
Certain advanced features remain under development
Professional production workflows may require workarounds
How to Install
The easiest way to install EffectCraft is to download a prebuilt package from the project's GitHub releases.
Windows users can use the portable ZIP package. macOS users can install the universal disk image, while Linux users can choose from AppImage, DEB, RPM, or tarball packages.
Developers can build the application from source with Rust:
git clone https://github.com/storytold/effectcraft
cd effectcraft
cargo run --release -p effectcraft
To render a composition from the command line, use the companion CLI:
cargo run --release -p effectcraft-cli -- render --out intro.mp4
For AI-agent integration, launch the MCP server:
cargo run --release -p effectcraft-cli -- mcp
These capabilities make EffectCraft particularly interesting for developers building automated animation pipelines or integrating motion graphics into AI-assisted workflows.
Final Verdict
EffectCraft is an ambitious open-source After Effects alternative that combines a familiar animation workflow with a modern Rust-based engine. Its extensive effects library, keyframe controls, expressions, compositing tools, 3D features, and broad export support make it much more than a basic animation editor.
Its most distinctive advantage is automation. The CLI, JSON control channel, readable project files, and MCP server make it possible to integrate motion graphics into scripted and AI-assisted workflows. Lottie support also provides a practical bridge between desktop animation and web development.
The biggest limitation is compatibility and maturity. EffectCraft cannot open native After Effects projects or use its third-party plugins, and its own documentation acknowledges that feature coverage does not yet guarantee production-level reliability or equivalent output quality.
For motion designers, developers, and open-source enthusiasts looking for a capable alternative to proprietary animation software, EffectCraft is a promising project. It is particularly attractive for new projects that can use its native format and automation tools without depending on an existing After Effects workflow.
Post a Comment/Report Broken Link: