EffectCraft: An open-source motion graphics and compositing tool written by scratch in pure Rust
This report summarizes scanner evidence for storytold/effectcraft, a Rust project with 8,287 GitHub stars. SynthScan examined 493,278 lines of code across 1264 source files, recording 374 pattern matches distributed across 6 syntactic categories. The legacy adjusted pattern signal is 1.3 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 347 finding(s).
Are imports declared and package/API names verified? 27 finding(s).
Are wrappers, guards, and repeated structures necessary? 0 finding(s).
Which changes need focused human review? 374 finding(s).
Run additional scans to build a history of the legacy pattern signal. Score changes are not a measure of AI adoption or code quality.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 374 distinct pattern matches across 6 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | Cargo.toml | 121 | egui_kittest = "0.37" | COMMENT |
| LOW | packaging/env.sh | 1 | # shellcheck shell=bash | COMMENT |
| LOW | packaging/macos/package.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | packaging/web/package.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | packaging/freebsd/package.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | packaging/linux/flatpak-oci.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | packaging/linux/package.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | packaging/linux/flatpak-bundle.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | packaging/linux/flatpak/ai.storyteller.effectcraft.yml | 1 | # Flatpak manifest for EffectCraft, ready for a Flathub submission. | COMMENT |
| LOW | packaging/linux/flatpak/ai.storyteller.effectcraft.yml | 21 | command: effectcraft | COMMENT |
| LOW | …ng/linux/flatpak/ai.storyteller.effectcraft.bundle.yml | 1 | # Flatpak manifest for the single-file bundle attached to every GitHub release | COMMENT |
| LOW | …ng/linux/flatpak/ai.storyteller.effectcraft.bundle.yml | 21 | # Display: Wayland first; X11 only when no Wayland compositor is running. | COMMENT |
| LOW | crates/svg/src/lib.rs | 201 | /// How the group composites onto what is below it (PDF blend modes; SVG `mix-blend-mode` | COMMENT |
| LOW | crates/gpu/src/fx_vr.rs | 1 | //! GPU effects, Immersive Video family (kernels in `shaders/fx_vr.wgsl`, every entry point | COMMENT |
| LOW | crates/gpu/src/fx_tone.rs | 1 | //! GPU effects, tonal and colour correction family (kernels in `shaders/fx_tone.wgsl`, every | COMMENT |
| LOW | crates/gpu/src/fx_particles.rs | 1 | //! GPU effects, particle render passes (kernels in `shaders/fx_particles.wgsl`, every entry | COMMENT |
| LOW | crates/gpu/src/fx_lut.rs | 1 | //! GPU effects, colour management (kernels in `shaders/fx_lut.wgsl`, every entry point | COMMENT |
| LOW | crates/gpu/src/fx_pixel2.rs | 1 | //! GPU effects, pixel ports of part C (kernels in `shaders/fx_pixel2.wgsl`, every entry point | COMMENT |
| LOW | crates/gpu/src/lib.rs | 1 | //! The EffectCraft GPU compositor (Mercury GPU Acceleration's counterpart), on wgpu compute | COMMENT |
| LOW | crates/gpu/src/lib.rs | 21 | //! | COMMENT |
| LOW | crates/gpu/src/lib.rs | 41 | //! measured faster for it ([`effectcraft_render::AutoPick`], kept by [`Gpu`]): a light comp | COMMENT |
| LOW | crates/gpu/src/fx_time.rs | 1 | //! GPU effects, time (kernels in `shaders/fx_time.wgsl`, every entry point prefixed `ftm_`): | COMMENT |
| LOW | crates/gpu/src/adv3d.rs | 1 | //! The Advanced 3D rasteriser on wgpu: a render pipeline with a reversed-Z depth buffer | COMMENT |
| LOW | crates/gpu/src/fx_sim.rs | 1 | //! GPU effects, simulation render passes (kernels in `shaders/fx_sim.wgsl`, every entry point | COMMENT |
| LOW | crates/gpu/src/fx_gen2.rs | 1 | //! GPU effects, generators of part C (kernels in `shaders/fx_gen2.wgsl`, every entry point | COMMENT |
| LOW | crates/gpu/src/tests.rs | 1 | //! GPU vs CPU: the CPU renderer is the oracle. Every scene renders on both and must agree | COMMENT |
| LOW | crates/gpu/src/fx_key.rs | 1 | //! GPU effects, keying, matte and channel family (kernels in `shaders/fx_key.wgsl`, every entry | COMMENT |
| LOW | crates/gpu/src/fx_warp.rs | 1 | //! GPU effects, warp family (kernels in `shaders/fx_warp.wgsl`, every entry point prefixed | COMMENT |
| LOW | crates/gpu/src/fx_noise.rs | 1 | //! GPU effects, noise, blur and time family (kernels in `shaders/fx_noise.wgsl`, every entry point prefixed | COMMENT |
| LOW | crates/gpu/src/fx_depth.rs | 1 | //! GPU effects, 3D Channel family (kernels in `shaders/fx_depth.wgsl`, every entry point | COMMENT |
| LOW | crates/gpu/src/fx_transition.rs | 1 | //! GPU effects, transitions and perspective (kernels in `shaders/fx_transition.wgsl`, every | COMMENT |
| LOW | crates/gpu/src/deferred.rs | 1 | //! Deferred readbacks: rendering on a device whose readbacks cannot be waited for (WebGPU in a | COMMENT |
| LOW | crates/gpu/src/context.rs | 101 | /// submitted yet. Reusing it in another encoder that is submitted first would overwrite it | COMMENT |
| LOW | crates/track/src/subspace.rs | 1 | //! Warp Stabilizer ▸ Method ▸ **Subspace Warp**: content-preserving warps fitted to smoothed | COMMENT |
| LOW | crates/track/src/fit.rs | 1 | //! Robust motion-model fits between point correspondences: **RANSAC** (Fischler & Bolles, | COMMENT |
| LOW | crates/track/src/lib.rs | 1 | //! Motion tracking, clean-room from textbook methods: | COMMENT |
| LOW | crates/track/src/klt.rs | 1 | //! Sparse feature tracking (KLT), clean-room from the published methods: | COMMENT |
| LOW | crates/track/src/plane.rs | 1 | //! Single- or multi-channel float planes: the tracker's working images (a crop of the frame in | COMMENT |
| LOW | crates/track/src/face.rs | 1 | //! Face tracking (Tracker panel ▸ Method ▸ Face Tracking (Outline Only) / (Detailed Features)), | COMMENT |
| LOW | crates/track/src/face.rs | 21 | //! merged component) and replaces detections that disagree with the model. The model is | COMMENT |
| LOW | crates/track/src/stabilize.rs | 1 | //! Video stabilization (the Warp Stabilizer's analysis and stabilization steps), clean-room from | COMMENT |
| LOW | crates/track/src/stabilize.rs | 341 | /// Final source → output transform per frame (layer pixels), framing scale included. For | COMMENT |
| LOW | crates/track/src/roto.rs | 1 | //! Roto Brush segmentation and propagation, clean-room from published methods: | COMMENT |
| LOW | crates/track/src/roto.rs | 21 | //! | COMMENT |
| LOW | crates/track/src/camtrack.rs | 1 | //! The 3D Camera Tracker's analysis: structure from motion on a single clip, clean-room from the | COMMENT |
| LOW | crates/track/src/camtrack.rs | 21 | //! (the reprojection error of the keyframe reconstruction over a log-spaced range of focal | COMMENT |
| LOW | crates/track/src/camtrack/bundle.rs | 1 | //! Sparse bundle adjustment: Levenberg–Marquardt over cameras and points with the **Schur | COMMENT |
| LOW | crates/track/src/roto/maxflow.rs | 1 | //! Min-cut / max-flow on sparse graphs with source and sink terminals, by the | COMMENT |
| LOW | crates/av1enc/src/symbol.rs | 1 | //! Multi-symbol arithmetic encoder: the exact inverse of the symbol decoder of spec 8.2. | COMMENT |
| LOW | crates/host/src/app_dirs.rs | 1 | //! Where EffectCraft keeps its per-user data (settings, shortcuts, crash recovery, logs, models, | COMMENT |
| LOW | crates/psd/src/placed.rs | 1 | //! Placed-layer (smart object) geometry: the non-affine corner quad (a projective map of the | COMMENT |
| LOW | crates/psd/src/placed.rs | 21 | /// that makes every triangle cover the whole output would visit thousands of times more. | COMMENT |
| LOW | crates/opusenc/src/silk.rs | 1 | //! SILK layer encoder (RFC 6716 §4.2, encoder direction), 20 ms frames at 8, 12 or 16 kHz. | COMMENT |
| LOW | crates/opusenc/src/lib.rs | 1 | //! Clean-room pure-Rust Opus encoder (RFC 6716 SILK, hybrid and CELT modes; RFC 7845 `OpusHead`). | COMMENT |
| LOW | crates/vp9enc/src/lib.rs | 1 | //! A VP9 encoder (profile 0, 8-bit 4:2:0), written from the *VP9 Bitstream & Decoding Process | COMMENT |
| LOW | crates/vp9enc/src/probs.rs | 1 | //! Probabilities: the frame's adaptable probability table (one flat array laid out in the order | COMMENT |
| LOW | crates/color/src/icc.rs | 1 | //! A reader for matrix/TRC RGB ICC profiles (ICC.1:2001-04 v2 and ICC.1:2010 v4, the public | COMMENT |
| LOW | crates/color/src/space.rs | 1 | //! RGB colour spaces for colour management: the project working space, footage interpretation, | COMMENT |
| LOW | crates/path/src/boolean.rs | 1 | //! Curve-preserving boolean operations on filled [`BezPath`]s, built on `linesweeper`'s robust | COMMENT |
| LOW | crates/path/src/trace.rs | 1 | //! Auto-trace: outlines of a scalar field (a layer's alpha, a colour channel or luminance) as | COMMENT |
| 274 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | crates/ui-egui/tests/it/ui_panel_windows.rs | 16 | app.ui.dock.layout.floating.iter().find(|w| w.contains(&panel)).and_then(|w| w.native) | CODE |
| CRITICAL | crates/ui-egui/tests/it/ui_panel_windows.rs | 27 | assert!(app.ui.dock.layout.floating.iter().any(|w| w.panels().copied().collect::<Vec<_>>() == [PanelKind::Project])) | CODE |
| CRITICAL | crates/ui-egui/tests/it/shared_docking_ui.rs | 188 | assert!(app.ui.dock.layout.root.is_none()); | CODE |
| CRITICAL | crates/ui-egui/tests/it/ui_viewer.rs | 740 | assert_eq!(h.state().session.state.shape_tool.fill.kind.id(), kind); | CODE |
| CRITICAL | crates/ui-egui/tests/it/ui_toolbar_gradient.rs | 139 | assert_eq!(h.state().session.state.shape_tool.fill.kind.id(), "radial", "it steps Linear → Radial"); | CODE |
| CRITICAL | crates/ui-egui/src/header.rs | 332 | let (icon, mode) = match app.session.prefs.appearance.appearance_mode.as_str() { | CODE |
| CRITICAL | crates/ui-egui/src/header.rs | 356 | let favorites = app.session.prefs.appearance.favorite_themes.clone(); | CODE |
| CRITICAL | crates/ui-egui/src/i18n.rs | 23 | match app.session.prefs.general.language.as_str() { | CODE |
| CRITICAL | crates/ui-egui/src/dock_ui.rs | 267 | self.ui.dock.layout.floating.iter().any(|w| w.contains(&p) && w.native.is_some()) | CODE |
| CRITICAL | crates/ui-egui/src/dock_ui.rs | 283 | let anchor = self.ui.dock.layout.root.as_ref().and_then(|root| { | CODE |
| CRITICAL | crates/ui-egui/src/dock_ui.rs | 306 | let Some([x, y, w, h]) = self.ui.dock.layout.floating.iter().find(|f| f.contains(&p)).map(|f| f.rect) else { | CODE |
| CRITICAL | crates/ui-egui/src/dock_ui.rs | 553 | let window = |panel: &PanelKind| self.ui.dock.layout.floating.iter().position(|window| window.contains(panel)); | CODE |
| CRITICAL⚡ | crates/ui-egui/src/bench.rs | 92 | d.app.ui.timeline.open_layers.extend(open.iter().copied()); | CODE |
| CRITICAL⚡ | crates/ui-egui/src/bench.rs | 95 | d.app.ui.timeline.open_layers.clear(); | CODE |
| CRITICAL⚡ | crates/ui-egui/src/bench.rs | 99 | let items = d.app.session.project.items.len(); | CODE |
| CRITICAL⚡ | crates/ui-egui/src/bench.rs | 100 | let folders: Vec<u64> = d.app.session.project.items.values().filter(|i| i.is_folder()).map(|i| i.id.0).collect(); | CODE |
| CRITICAL | crates/ui-egui/src/app/viewer_frames.rs | 65 | let (_, k) = self.session.state.viewer.fast_previews.render(self.ui.viewer.interacting || self.ui.viewer.propert | CODE |
| CRITICAL | crates/ui-egui/src/app/viewer_frames.rs | 155 | let (draft, _) = self.session.state.viewer.fast_previews.render(self.ui.viewer.interacting || self.ui.viewer.pro | CODE |
| CRITICAL | crates/ui-egui/src/app/frame.rs | 240 | let child_viewports = !self.ui.dock.layout.floating.is_empty() || prefs_live::video_preview_active(self, focused | CODE |
| CRITICAL | crates/ui-egui/src/app/frame.rs | 579 | let key = (self.session.revision, self.session.prefs.import.auto_reload_footage.clone()); | CODE |
| CRITICAL | crates/ui-egui/src/app/prefs.rs | 55 | let next = match self.session.prefs.appearance.appearance_mode.as_str() { | CODE |
| CRITICAL | crates/ui-egui/src/panels/viewer.rs | 442 | let style = app.session.prefs.grids.guide_style.clone(); | CODE |
| CRITICAL | crates/ui-egui/src/panels/viewer.rs | 1500 | let speed = app.session.state.puppet.record_speed.max(1.0) / 100.0; | CODE |
| CRITICAL | crates/ui-egui/src/panels/project.rs | 850 | let depth = app.session.project.settings.bit_depth.label(); | CODE |
| CRITICAL | crates/ui-egui/src/panels/settings.rs | 370 | let mut favorites = app.session.prefs.appearance.favorite_themes.clone(); | CODE |
| CRITICAL | crates/ui-egui/src/panels/roto_tool.rs | 421 | let view = app.session.state.roto.view.clone(); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | crates/track/src/fit.rs | 147 | /// A robust fit: the model, which correspondences are inliers, and the RMS inlier error. | COMMENT |
| MEDIUM | crates/track/src/camtrack.rs | 13 | //! the other keyframes are added incrementally (**resection** by robust pose refinement, | COMMENT |
| MEDIUM | crates/track/src/camtrack/bundle.rs | 4 | //! errors in pixels with a **Huber** robust loss (applied by iteratively reweighted least | COMMENT |
| MEDIUM | crates/track/src/camtrack/bundle.rs | 152 | /// Total robust cost. Rejects invalid inputs before starting parallel evaluation. | COMMENT |
| MEDIUM | crates/path/src/boolean.rs | 1 | //! Curve-preserving boolean operations on filled [`BezPath`]s, built on `linesweeper`'s robust | COMMENT |
| MEDIUM | crates/path/src/offset.rs | 2 | //! offsetting (kurbo's stroker offsets curves analytically and refits them) and robust overlap | COMMENT |
| MEDIUM | crates/path/src/fit.rs | 19 | /// Direction the curve leaves `p0` (robust to retracted handles). | COMMENT |
| MEDIUM | crates/path/src/ops.rs | 59 | /// Unit tangent of a segment at parameter `t` (robust at retracted handles). | COMMENT |
| MEDIUM | crates/raster/src/inpaint.rs | 20 | //! border (Poisson-style seamless blending), scaled by the chosen strength. | COMMENT |
| MEDIUM | xtask/src/bench.rs | 693 | // Half a frame before the next one: the end is inclusive, and this is robust to rounding. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crates/engine/src/cmd/blender_scene.py | 16 | CODE | |
| LOW | crates/engine/src/cmd/blender_scene.py | 56 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packaging/linux/flatpak-oci.sh | 5 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | apps/effectcraft-cli/tests/it/qa_template.rs | 29 | var t = comp.layers.addText("Jane Doe"); | CODE |