## storytold/effectcraft — v0.1.1…v0.2.0

_250+ commits._

### Features
- **M4.12: never crash: hostile input in New Comp from Selection, an empty work area in Cache Frames When Idle** (b21e04b)
- **M3.12: Pre-compose keeps the composition's settings; New Comp from Selection is one undo step with After Effects' options** (a34d0c4)

### Backend
- **Merge pull request #52 from storytold/pr/release-0.2.0** (0bb8baf)
- **Release: EffectCraft v0.2.0** (3f72500)
- **Merge pull request #51 from storytold/home-screen-ae** (fc0462a)
- **M13.31: Home screen laid out like After Effects'** (d310946)
- **M13.30: the ArtCraft mark in the Tools bar, About and Home; VectorCraft sibling link** (2039688)
- **Merge pull request #50 from storytold/m4-motion-blur-depth** (053c445)
- **M4.13: motion blur of collapsed precomps and of animated shape / text content** (05188d0)
- **Merge pull request #10 from storybored379/pr/spatial-tangent-getter-names** (9e79271)
- **Merge pull request #9 from storybored379/pr/hold-key-incoming-segment** (58dd94e)
- **Merge pull request #7 from storybored379/pr/comp-zero-frame-rate** (1e8bcb5)
- **Merge pull request #6 from storybored379/pr/expr-runtime-stack-leak** (26f577c)
- **Merge pull request #49 from storytold/timeline-comp-tabs** (9b5652f)
- **M3.15: Timeline tabs per open comp; Project double-click opens; tab drag insertion mark** (c7c90cf)
- **Merge pull request #48 from storytold/graph-auto-visible-keys** (a008a90)
- **M5.16: Key Light: keyer eyedroppers pick from the effect input (effect.pickColor); "keylight" search** (73b2607)
- **M5.15: J / K and Select All Keyframes use what the Timeline shows; Graph Editor Auto-Select Graph Type** (47f2a5a)
- **Merge pull request #40 from storytold/timeline-keyframes** (c90fd35)
- **M5.14: docs: parity, agents and preferences cover the keyframe, clipboard and responsiveness fixes** (ef856d8)
- **M5.14: J / K stop at the work area; the Info panel shows a selected keyframe** (dfb0227)
- **M5.13: keyframe paste: several copied layers paste onto as many layers in order; Paste Reversed pastes like Paste** (43bf290)
- **M5.12: double-click a keyframe to edit its value; Select Equal / Previous / Following Keyframes; roving keys as dots** (9ea1f13)
- **M5.11: Graph Editor: drags move every selected key, Shift keeps an axis, Ctrl / Ctrl+Alt clicks; drags and the transform box never merge or lose keys** (daed033)
- **M5.10: keyframes behave like After Effects: drags never destroy keys, stretched layers, Shift/Ctrl/Ctrl+Alt clicks, locked layers, Hold off** (9929b5f)
- **M12.8: read the system memory every 30 s instead of 10 s** (3b6b390)
- **M3.15: Ctrl+C / Ctrl+X / Ctrl+V reach Edit ▸ Copy, Cut and Paste in the real app** (e3778b1)
- **M5.9: keyframe drags in the Timeline follow the pointer to the end; Shift snaps** (f3db1eb)
- **M12.8: the app no longer freezes every 10 s on Windows: the system memory is read in the background** (2d4a090)
- **Merge pull request #39 from storytold/docs-m3-m4** (4b37443)
- **M3.9: an edit that only allocates ids still counts as a change** (a965d8d)
- **M4.12: docs: ROADMAP, parity, web, preferences and agents brought up to date after M3 and M4** (cb892b5)
- **M3.9: a browser session restored with unsaved changes stays modified** (a12d4ae)
- **Merge pull request #37 from storytold/pr/never-crash-clean-crates** (339a05d)
- **Merge pull request #24 from storytold/pr/never-crash-opus-vp9** (7f1e2df)
- **Merge pull request #23 from storytold/pr/never-crash-hevcenc** (61e859e)
- **Merge pull request #22 from storytold/pr/never-crash-av1enc** (6aa490b)
- **Merge pull request #36 from storytold/pr/never-crash-ui** (c6b8f54)
- **Merge pull request #35 from storytold/pr/never-crash-render-gpu** (4926dd2)
- **Merge pull request #31 from storytold/pr/never-crash-raster-path** (fc0eee5)
- **Merge pull request #29 from storytold/pr/never-crash-text** (5d716c2)
- **Merge pull request #26 from storytold/pr/never-crash-track** (f82ac49)
- **Merge pull request #33 from storytold/pr/never-crash-effects** (64531e4)
- **Merge pull request #30 from storytold/pr/never-crash-engine** (c6488d0)
- **Merge pull request #27 from storytold/pr/never-crash-script** (f864b29)
- **Merge pull request #21 from storytold/pr/never-crash-expr** (46cd757)
- **Merge pull request #34 from storytold/pr/never-crash-time** (a397691)
- **Merge pull request #19 from storytold/pr/never-crash-project** (6f52a0a)
- **Merge pull request #17 from storytold/pr/never-crash-media** (010cb81)
- **Merge pull request #14 from storytold/pr/never-crash-interchange** (43c485e)
- **Merge pull request #25 from storytold/pr/never-crash-lottie** (d350f4e)
- **Merge pull request #16 from storytold/pr/never-crash-pdf** (a792844)
- **Merge pull request #15 from storytold/pr/never-crash-svg** (e171c33)
- **Merge pull request #18 from storytold/pr/never-crash-psd** (91a3b14)
- **Merge pull request #28 from storytold/pr/never-crash-guard** (a69f417)
- **Merge pull request #12 from storytold/pr/never-crash-steering** (e6bda37)
- **Merge pull request #38 from storytold/m4-nested-comps** (7ee6d6a)
- **M4.11: docs: architecture, parity and ROADMAP cover nested comps and motion blur** (e295679)
- **M4.11: one motion blur gate for layers, masks, effects and Advanced 3D** (995d99f)
- **Never crash: deny panic lints in the already-clean crates and apps** (c5e33f1)
- **Never crash: frame-pool panic handler and ui-egui without expect()** (543942d)
- **M4.10: a nested comp shows nothing before it starts or after it ends** (0b5cff1)
- **M4.9: Preserve frame rate when nested or in render queue, Preserve resolution when nested** (0fe6db0)
- **Never crash: PostScript radix numbers outside 2..=36** (e910858)
- **Never crash: render and gpu crates without panic!()** (fe89ab9)
- **Never crash: Tick and timecode arithmetic can't overflow or divide by zero** (fc737d7)
- **Never crash: effects crate without expect()** (5dd7d9b)
- **Merge pull request #32 from storytold/m4-preview** (4e98b8c)
- **Never crash: reject SVGs nested too deeply** (19c1d2e)
- **Never crash: reject timeline documents nested too deeply** (ad5aa54)
- **Never crash: bound PSD descriptor nesting** (d1413d5)
- **M4.8: docs: parity covers the cached playback fixes** (da31779)
- **M4.8: Edit ▸ Purge clears what it names: disk and snapshot purges keep the RAM preview, memory purges drop decoded footage** (fa27d62)
- **M4.7: Cache Frames When Idle renders the work area in the background** (5ce641c)
- **M4.6: previews: Auto resolution keeps its scale while playing, Cache Before Playback plays what fits, achieved frame rate in the Info panel** (6214aec)
- **M4.5: RAM preview: render options in the frame key, least-recently-shown eviction, stale frames freed at once** (5648fdb)
- **Never crash: raster and path crates without expect()/unwrap()/unreachable!()** (786e4e8)
- **Never crash: engine without expect() (job polling, commands, menus)** (3d5432c)
- **Never crash: text layout and font resolution without expect()** (0873393)
- **Never crash: last-resort guard around command execution, and a logging panic hook** (6144ca0)
- **Never crash: scripts nested too deeply return an error instead of overflowing the stack** (f846097)
- **Never crash: trackers and camera solver without expect()** (bf8962b)
- **Never crash: Lottie enum values can't overflow** (1da7dc4)
- **Never crash: Opus and VP9 encoders without expect()** (5cc376a)
- **Never crash: HEVC encoder without expect()/unreachable!()** (da3c7a8)
- **Never crash: AV1 encoder without expect()/unreachable!()** (ee90d87)
- **Never crash: reject deeply nested expressions instead of overflowing the stack** (fc8fea0)
- **Merge pull request #8 from storybored379/pr/fullscreen-shortcut-off-mac** (249cc14)
- **Merge pull request #20 from storytold/m3-layer-settings** (9ec7680)
- **M3.14: docs: ROADMAP marks project operations done** (cb6e1be)
- **M3.14: project files name the version that wrote them, never save unreadable, keep their format** (948f06f)
- **Never crash: project crate without expect()** (587d480)
- **M3.13: menu bar: Group/Ungroup Shapes in the Layer menu, Window ▸ Learn, flowchart shortcuts, Center In View shortcut, Reveal in Explorer on Windows** (6fc39eb)
- **M3.11: layer commands respect locks, keep children in place on delete, arrange step by step, keep depth and separated dimensions, keep links on duplicate/paste** (89653f3)
- **Never crash: PSD reader bounds overflow and input-sized allocations** (dc573f7)
- **M3.10: Layer Settings opens Solid Settings with "Affect all layers that use this solid"; settings dialogs register every control** (753de07)
- **Never crash: media crate without expect()** (37c9b44)
- **Never crash: PDF close-path operators and CFF outlines without a current point** (8e4e298)
- **Never crash: SVG path data no longer loops forever on a number after Z** (6708ff5)
- **Never crash: interchange export/import without expect()** (ed54a8c)
- **Merge pull request #13 from storytold/m3-project-operations** (3861b6d)
- **M3.9: closing a modified project asks to save it first; the modified mark follows undo** (e0ed28f)
- **Never crash: steering rules, clippy.toml, forbid unsafe** (0da12c6)
- **Merge pull request #11 from storytold/pr/license-standard** (10644a8)
- **Licensing: standard LICENSE files, NOTICE, ArtCraft brand terms** (93c8586)
- **Scripting: Property.keyInSpatialTangent / keyOutSpatialTangent under their AE names** (0a8cdfc)
- **Keyframes: a Hold key no longer eases the motion into it** (3411fc8)
- **Shortcuts: don't bind macOS-only Ctrl+Cmd shortcuts off macOS** (18fcc48)
- **Merge branch 'worktree-agent-a0407bd39e9d4b595'** (fb87ac5)
- **M13.32: web main-thread stall: Warp Stabilizer plans solved in job workers** (a006ed5)
- **Merge branch 'worktree-agent-abff9a10f06a98f2c'** (402b4cb)
- **Merge branch 'main' into worktree-agent-abff9a10f06a98f2c** (f9e1807)
- **M13.30: Content-Aware Fill in a job worker on its GPU** (3921e6c)
- **Merge branch 'worktree-agent-afaf588d9c94630c4'** (c8a42b2)
- **Merge main into M13.28 worktree** (c59e0a6)
- **Merge branch 'main' into worktree-agent-abff9a10f06a98f2c** (91f4a60)
- **M13.30: web depth and polish** (f3715aa)
- **M13.28: architecture notes for the part C GPU effects** (6f7e536)
- **M13.28: GPU generators (fx_gen2): Lightning, Advanced Lightning, Beam, Lens Flare, Radio Waves, Vegas, Stroke, Scribble, Write-on, Paint Bucket, Eyedropper Fill, CC Glue Gun, CC Threads, Audio Spectrum/Waveform, Basic Text, Path Text** (c431581)
- **Merge branch 'worktree-agent-a11430ddf8ce9f23d'** (f1a999e)
- **M13.29: ROADMAP GPU effect count** (2d41ce6)
- **Merge main into M13.29 worktree** (47be3e1)
- **M13.29: GPU effects part D (particles and remaining fallbacks)** (1c855c3)
- **M13.28: GPU pixel ports (fx_pixel2): CC Cross/Radial/Vector Blur, Reduce Interlace Flicker, CC Composite, Color Link, Cineon, HDR Compander/Highlight Compression, Grow Bounds, CC Overbrights, CC Block Load, CC Burn Film, CC Glass/Plastic, CC HexTile, CC Mr. Smoothie, Inner/Outer Key, CC Simple Wire Removal, Basic 3D** (5df9cde)
- **M13.28: golden hashes of the plan-drawn CPU effects (pinned before the GPU refactor)** (764c3a3)
- **M13.29: particle effects golden hashes** (b9f0986)
- **Parity audit at d39c0e8: ≈99% weighted, 89/3/0, every P0 feature done** (51c2193)
- **Merge branch 'worktree-agent-a9fea98fe9839069d'** (d39c0e8)
- **Merge branch 'main' into worktree-agent-a9fea98fe9839069d** (d5bb5ad)
- **Merge branch 'worktree-agent-a3d97efbded4f5ed3'** (14f9c44)
- **Merge branch 'main' into worktree-agent-a3d97efbded4f5ed3** (b3a228e)
- **M13.27: sim effects golden hashes** (ce6ece4)
- **Merge branch 'main' into worktree-agent-a9fea98fe9839069d (filmcraft rev 2c5ba7a: AAF and OMF interchange)** (b73028d)
- **M13.26: import command keeps After Effects' menu label** (8cb6d34)
- **Merge branch 'worktree-agent-a139f16b3a4130998'** (1b61d81)
- **Merge branch 'worktree-agent-a51902829f462d739'** (3ee5823)
- **Merge branch 'main' into worktree-agent-a9fea98fe9839069d** (05b6149)
- **M13.26: Premiere Pro interop commands (file.importTimeline, file.exportTimeline with ProRes 4444 pre-renders), File menu entries, export dialog, docs and pixel round-trip tests** (9554228)
- **Merge origin/main (M13.22 GPU effects part A) into M13.23: both GPU effect lists (236), docs recounted** (808ca70)
- **Merge branch 'main' into worktree-agent-a139f16b3a4130998** (299fe09)
- **av1enc tests: decode with a single-threaded filmcraft-av1 decoder** (32c53aa)
- **M13.26: effectcraft-interchange crate (L3): timeline documents to compositions and back via filmcraft-interchange (FCP7 XML, FCPXML, OTIO, EDL)** (fe80862)
- **Merge origin/main (M13.24) into M13.23** (7c67512)
- **M13.23: Shatter wireframe views and Foam's texture / map extras fall back via gpu_supported (no readback attempt)** (4a2ca91)
- **Merge branch 'worktree-agent-a38a174c36aa9f23a'** (7a5a93b)
- **Merge branch 'main' into worktree-agent-a139f16b3a4130998** (d3a7777)
- **media: WebM VP9 alpha imports as straight alpha (FilmCraft 2c5ba7a)** (cc5c831)
- **Merge branch 'main' into worktree-agent-a38a174c36aa9f23a** (ca9a30b)
- **Merge branch 'worktree-agent-acd022ffe72ec3783'** (8ea5b86)
- **M13.23: docs — GPU effects part B (parity EFF-5, architecture GPU section, ROADMAP count, gpu crate docs)** (49d0c16)

_Recap by [Repo Wrapped](https://repowrapped.com/gh/storytold/effectcraft?utm_source=github-action)._