Releases: electroheadfx/efx-motion-editor
v0.7.0 — Monorepo & Paint Enhancements
What shipped
pnpm monorepo (Phase 26)
Converted the repo to a pnpm workspace. Application/ is now app/, full git history preserved via isolated git mv. efx-physic-paint lives in packages/ as a workspace package — ready for the standalone window work in v0.8.0.
Paint engine overhaul (Phase 33)
20 plans of fixes, polish, and new features on top of the existing perfect-freehand + p5.brush stack.
3-mode paint system — Each frame is now explicitly Flat, FX, or Physical (placeholder). Modes are mutually exclusive per frame. Switching shows a conversion dialog, brush style resets on mode change, and the mode persists per layer across sessions.
Inline color picker — Canvas-adjacent 260px panel with 4 color modes: Box (SV square + hue), TSL, RVB, and CMYK. All slider tracks render live gradients. HEX input, auto-apply, 12 recent colors, persistent saved favorites. Replaces the old sidebar color swatch.
Wireframe overlay — Selected strokes show a dashed path + bounding box so you can actually see what you're grabbing, especially in FX mode.
Stroke draw-reveal animation — Select a stroke, pick a frame range, and it distributes the points across frames using speed-based weighting (slow drawing = more frames, fast = fewer). Single undo entry.
Circle cursor — Photoshop-style brush size cursor that scales with zoom.
Brush persistence — Color and si Jump to bottom ↓ s. Default is #203769 at 35px.
Undo/FX cache fixes — Cmd+Z no Jump to bottom ↓ ders the canvas in both flat and FX mode. FX cache invalidates on color change, clear, and mode switch.
What didn't ship
Phases 27–32 (replacing perfect-freehand + p5.brush with a headless efx-physic-paint adapter) were abandoned after the batch rendering approach produced inferior visual quality and O(n²) re-render performance. The physics engine will come back in v0.8.0 as a standalone window with a transport protocol instead of an in-process adapter.
v0.6.0 — Stroke Management, Bezier Path Editing & Paint UX
What's New
Bezier Path Editing
- Edit freehand stroke paths as bezier curves with draggable anchor points and control handles
- Add, move, and delete control points for precise shape refinement
- Progressive simplify button for reducing path complexity
- Pen tool overlay with real-time visual feedback
Stroke List Panel
- Dedicated stroke management panel in roto paint edit mode
- Drag-and-drop reorder with immediate canvas update
- Visibility toggles (hide/show) without deleting strokes
- Multi-select with Cmd+click and Shift+click
- Bidirectional selection sync between list and canvas
Stroke Interactions
- Alt+drag to duplicate any selected stroke
- Non-uniform scale via 4 edge handles (independent X/Y axes)
- Undo/redo for all transform gestures (move, rotate, scale, duplicate)
Paint UX Improvements
- Reorganized paint properties panel with compact 2-column grid layouts
- Auto-flatten frame on exit paint mode
- Isolation-scoped layer creation — new layers target the soloed sequence
- 4× denser motion path dots for short sequences
4 phases · 14 plans · 107 commits · 12 requirements satisfied
v0.5.0 — Motion Blur & Paint Styles
Description:
Paint Brush FX
Draw flat strokes, then select and apply expressive styles — each rendered via p5.brush with Kubelka-Munk spectral pigment mixing.
- 5 brush styles: Watercolor (edge bleed, paper texture), Ink (edge darkening, variable opacity), Charcoal (grain texture, scatter), Pencil (fine-grain texture), Marker (flat semi-transparent)
- Spectral pigment mixing: Overlapping strokes blend physically — blue + yellow produces green, not gray
- Flow field distortion: Hash-based 2D noise warps stroke paths for organic rendering
- Non-destructive workflow: Draw flat → select strokes → apply FX → flatten for performance
- Per-frame FX cache: All styled strokes rendered together on shared canvas for correct spectral mixing
- Solid paint background with color picker in PaintProperties panel
Motion Blur
Per-layer GLSL velocity motion blur with cinematographic shutter angle controls.
- Preview: WebGL2 directional blur shader with triangle filter kernel and configurable quality (Off / Low 16 samples / Medium 32 samples)
- Export: Combined GLSL velocity blur + sub-frame accumulation (8/16/32/64/128 samples) for cinematic quality
- Shutter angle: 0–360° control affects blur intensity proportionally
- Velocity engine: VelocityCache with seek invalidation — stationary layers stay sharp
- Toolbar: Split-button toggle (⚡) with dropdown popover for shutter angle and quality
- Keyboard shortcut:
Mtoggles motion blur (guarded in paint mode)
Other
- Project format: .mce v15 with full backward compatibility (v1–v15)
- Export: "Selected sequence only" option
- Tests: 27 unit tests covering motionBlurStore, motionBlurEngine, and VelocityCache
Stats: 2 phases, 8 plans, 116 commits, +13,928 / −1,859 lines across 133 files
Codebase: 40,066 LOC (37,810 TypeScript + 2,256 Rust)
v0.4.0 — Canvas & Paint
Canvas Motion Path
After Effects-style spatial keyframe path editing directly on the canvas. Animated layers display their trajectory as a dotted trail with interactive keyframe markers — drag keyframe positions to reshape motion paths in real-time with auto-seek and undo coalescing.
- Dotted SVG trail with dots clustered where motion is slow (easing visualization)
- Filled/outlined keyframe circle markers with selection state
- Drag-to-reposition with real-time trail update
- Playhead auto-seeks to keyframe frame on drag start
- Unified keyframe upsert routing — sidebar and canvas drag edits both update the preview in real-time
Paint Layer / Rotopaint
Frame-by-frame drawing and rotoscoping with a complete paint system. Powered by perfect-freehand for smooth, pressure-sensitive brush strokes.
- 7 tools: brush, eraser, eyedropper, flood fill, line, rectangle, ellipse
- Onion skinning overlay with configurable frame range and opacity falloff
- Floating toolbar on canvas + full sidebar panel with tool/brush/stroke/shape/fill/onion controls
- Sidecar JSON persistence — paint data saved as
paint/{uuid}/frame-NNN.jsonalongside the.mceproject - Export pipeline — paint layers composite in both preview and video export with blend modes and opacity
- Project format v14 with backward compatibility (v1–v14)
Tablet & Pen Support
Native macOS tablet pressure bridge via NSEvent for high-fidelity drawing input.
- Pen pressure sensitivity with easing/taper curves
- Tilt detection modulating stroke thinning
- Coalesced pointer events at full tablet polling rate
- Works with Wacom, Apple Pencil (iPad Sidecar), and other pressure devices
- Backward-compatible defaults for mouse input (simulated pressure)
Stats
| Phases | 2 (Phase 18: Canvas Motion Path, Phase 19: Paint Layer Rotopaint) |
| Plans | 9 |
| Tasks | 19 |
| Commits | 75 |
| LOC | 34,067 (31,814 TypeScript + 2,253 Rust) |
| Timeline | 2 days |
v0.3.0 Audio & Polish
v0.3.0 Audio & Polish
8 phases, 29 plans, 63 tasks — shipped in 5 days (2026-03-20 → 2026-03-24)
Highlights
- Audio Import & Waveform — Import WAV/MP3/AAC/FLAC, waveform visualization on timeline, synced playback, volume/fade controls,
click/drag/trim/slip/reorder interactions - Media In-Use Tracking — Color-coded usage badges on all assets, portal-based usage popovers, cascade removal with composite undo
- Solid & Transparent Key Entries — Split add button (Camera/Square), inline color picker, gradient fills (linear/radial/conic) with
draggable stops - GLSL Shader Effects — WebGL2 runtime, 17 Shadertoy-ported effects, ShaderBrowser with animated previews, parameter controls, keyframe
animation - GL Transitions — 18 curated gl-transitions.com shaders, dual-texture WebGL2 pipeline, TransitionProperties sidebar, teal timeline
overlays - Audio Export & Beat Sync — OfflineAudioContext pre-render, FFmpeg audio muxing, BPM detection via onset autocorrelation, beat
markers, snap-to-beat, auto-arrange (every beat / 2 beats / bar) - Sidebar Enhancements — Collapsible key photo lists, global solo mode (S key), Tailwind v4 syntax migration across 33 files
- Adaptive 2-Panel Sidebar — Replaced 3-panel layout with sequence/layer view switching, Layers icon with green count badge, back
navigation
Stats
- LOC: 31,522 (29,037 TypeScript + 2,157 Rust + 328 CSS)
- Files changed: 350 (+48,438 / -3,853)
- Project format: .mce v8 → v13 (full backward compatibility chain)
- Stores: 11 reactive signal stores (added audioStore, soloStore)
- Quick tasks: 7 inline fixes (context menu, transport bar, zoom controls, shader button)
v0.2.0 From Editor to Cinema Pipeline
What's New
v0.2.0 transforms the editing foundation into a complete stop-motion-to-cinema pipeline — from keyframe animation to final export.
Animation & Effects
- Per-layer keyframe animation with 4 interpolation curves (linear, ease-in, ease-out, ease-in-out)
- GPU-accelerated WebGL2 blur with automatic CPU fallback
- Live canvas transform handles — move, scale, rotate layers directly on the canvas
- Content overlay layers (static image, image sequence, video) as timeline-level sequences
Transitions & Export
- Fade and cross-dissolve transitions with opacity and solid color modes
- PNG image sequence export with resolution multipliers and metadata sidecars
- Video export (ProRes, H.264, AV1) via automatic FFmpeg provisioning
UI Overhaul
- 3-level theme system (dark, medium, light) with CSS variable architecture
- Redesigned sidebar with 3 resizable panels, inline key photos, and keyframe navigation
- Canvas zoom/pan with keyboard shortcuts, pinch gestures, and fit-to-window
- Linear timeline layout mode with togglable stacked/linear views
- Tabbed shortcuts overlay with 7 groups and full keyboard navigation
- Timeline vertical scrollbar with playback auto-scroll
- Lucide icon buttons with keyboard shortcut tooltips
Playback
- Full-speed playback mode bypassing frame rate cap
- Fullscreen canvas with letterboxed preview
- Sequence isolation (solo) and global loop toggle
By the Numbers
23 phases · 66 plans · 847 commits · 20,428 LOC
v0.1.0 — Initial Release
Complete stop-motion editor foundation — from Tauri scaffold through production-ready editing with multi-layer compositing and cinematic FX effects.
Highlights
- Tauri 2.0 + Preact + Motion Canvas + Tailwind CSS v4 foundation with 6 reactive signal stores and dark theme editor UI
- Rust image pipeline with drag-and-drop import, file dialog, thumbnail generation, and LRU memory management
- Project management (.mce format v4) with auto-save, recent projects, and unsaved-changes guard
- Canvas-based timeline with virtualized frame rendering, playhead scrubbing, zoom, and real-time preview playback at 15/24 fps
- Multi-layer compositing: static image, image sequence, and video layers with blend modes (normal, screen, multiply, overlay, add), opacity, transforms, and drag-reorder
- Cinematic FX effects: film grain, vignette, color grade, dirt/scratches, light leaks — applied as FX sequences with draggable timeline range bars
- Undo/redo command pattern engine (100+ levels)
- Keyboard shortcuts: JKL shuttle, Space play/pause, arrow step, Cmd+Z/S/N/O, ? overlay
Sequence Management
- Create, duplicate, delete, reorder sequences
- Key photos with configurable hold duration
- Per-sequence frame rate and resolution settings
Architecture
- 6 reactive Preact Signal stores (project, sequence, layer, timeline, canvas, ui)
- Canvas 2D PreviewRenderer with resolution-independent FX parameters
- Rust backend with IPC bridge and asset protocol
- Audio-sync-ready clock (performance.now() delta accumulation)
Stats: 8 phases, 36 plans, 284 commits
Codebase: 10,159 LOC (8,753 TypeScript + 1,352 Rust + 54 CSS)