Free and open source video editor, based on MLT Framework and KDE Frameworks
This report summarizes scanner evidence for KDE/kdenlive, a C++ project with 6,014 GitHub stars. SynthScan examined 311,607 lines of code across 1402 source files, recording 426 pattern matches distributed across 18 syntactic categories. The legacy adjusted pattern signal is 1.4 (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? 391 finding(s).
Are imports declared and package/API names verified? 29 finding(s).
Are wrappers, guards, and repeated structures necessary? 11 finding(s).
Which changes need focused human review? 426 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
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 426 distinct pattern matches across 18 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 | benchmark/timelinemodelbenchmark.cpp | 1 | /* | COMMENT |
| LOW | benchmark/timelinemodelbenchmark.cpp | 21 | #include <mlt++/MltRepository.h> | COMMENT |
| LOW | renderer/kdenlive_render.cpp | 1 | /* | COMMENT |
| LOW | fuzzer/fakeit_standalone.hpp | 21 | COMMENT | |
| LOW | fuzzer/fuzzing.cpp | 1 | /* | COMMENT |
| LOW | fuzzer/fuzzing.cpp | 21 | #include "assets/model/assetparametermodel.hpp" | COMMENT |
| LOW | tests/timelinepreviewmonitor.cpp | 1 | /* | COMMENT |
| LOW | tests/catch.hpp | 21 | #define CATCH_VERSION_MAJOR 2 | COMMENT |
| LOW | tests/catch.hpp | 41 | # pragma clang diagnostic ignored "-Wcovered-switch-default" | COMMENT |
| LOW | tests/catch.hpp | 61 | #if defined(CATCH_CONFIG_ALL_PARTS) | COMMENT |
| LOW | tests/catch.hpp | 81 | # elif (defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE == 1) | COMMENT |
| LOW | tests/catch.hpp | 101 | // start catch_user_interfaces.h | COMMENT |
| LOW | tests/catch.hpp | 121 | // **************** | COMMENT |
| LOW | tests/catch.hpp | 141 | #endif | COMMENT |
| LOW | tests/catch.hpp | 161 | // like `std::string::~string` being called on an uninitialized value. | COMMENT |
| LOW | tests/catch.hpp | 181 | _Pragma( "clang diagnostic ignored \"-Wunused-variable\"" ) | COMMENT |
| LOW | tests/catch.hpp | 201 | #endif | COMMENT |
| LOW | tests/catch.hpp | 221 | //////////////////////////////////////////////////////////////////////////////// | COMMENT |
| LOW | tests/catch.hpp | 241 | # endif | COMMENT |
| LOW | tests/catch.hpp | 261 | # if !defined(_MSVC_TRADITIONAL) || (defined(_MSVC_TRADITIONAL) && _MSVC_TRADITIONAL) | COMMENT |
| LOW | tests/catch.hpp | 281 | #endif | COMMENT |
| LOW | tests/catch.hpp | 301 | // but user still might want to turn it off | COMMENT |
| LOW | tests/catch.hpp | 321 | // Various stdlib support checks that require __has_include | COMMENT |
| LOW | tests/catch.hpp | 341 | // Check if variant is available and usable | COMMENT |
| LOW | tests/catch.hpp | 361 | #if defined(CATCH_INTERNAL_CONFIG_WINDOWS_SEH) && !defined(CATCH_CONFIG_NO_WINDOWS_SEH) && !defined(CATCH_CONFIG_WINDOWS | COMMENT |
| LOW | tests/catch.hpp | 381 | #if defined(CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_NO_CPP17_STRING_VIEW) && !defined(CATCH_CO | COMMENT |
| LOW | tests/catch.hpp | 401 | #if !defined(CATCH_INTERNAL_CONFIG_EXCEPTIONS_ENABLED) && !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) | COMMENT |
| LOW | tests/catch.hpp | 421 | // Even if we do not think the compiler has that warning, we still have | COMMENT |
| LOW | tests/catch.hpp | 441 | COMMENT | |
| LOW | tests/catch.hpp | 461 | #define CATCH_CATCH_ANON(type) if ((false)) | COMMENT |
| LOW | tests/catch.hpp | 701 | #define CATCH_RECURSION_LEVEL3(...) CATCH_RECURSION_LEVEL2(CATCH_RECURSION_LEVEL2(CATCH_RECURSION_LEVEL2(__VA_ARGS__))) | COMMENT |
| LOW | tests/catch.hpp | 721 | #define CATCH_REC_GET_END1(...) CATCH_REC_GET_END2 | COMMENT |
| LOW | tests/catch.hpp | 741 | COMMENT | |
| LOW | tests/catch.hpp | 761 | COMMENT | |
| LOW | tests/catch.hpp | 901 | #define INTERNAL_CATCH_NTTP_0 | COMMENT |
| LOW | tests/catch.hpp | 1021 | #else | COMMENT |
| LOW | tests/catch.hpp | 1121 | #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR | COMMENT |
| LOW | tests/catch.hpp | 1501 | #ifdef CATCH_CONFIG_CPP17_STRING_VIEW | COMMENT |
| LOW | tests/catch.hpp | 2181 | static const auto& enumInfo = ::Catch::getMutableRegistryHub().getMutableEnumValuesRegistry().registerEnum( | COMMENT |
| LOW | tests/catch.hpp | 2681 | // end catch_message.h | COMMENT |
| LOW | tests/catch.hpp | 5061 | // start catch_reporter_bases.hpp | COMMENT |
| LOW | tests/catch.hpp | 6941 | COMMENT | |
| LOW | tests/catch.hpp | 7461 | #endif // ! CATCH_CONFIG_IMPL_ONLY | COMMENT |
| LOW | tests/catch.hpp | 7941 | // end catch_approx.cpp | COMMENT |
| LOW | tests/catch.hpp | 7961 | #if defined(__i386__) || defined(__x86_64__) | COMMENT |
| LOW | tests/catch.hpp | 7981 | #endif | COMMENT |
| LOW | tests/catch.hpp | 8001 | COMMENT | |
| LOW | tests/catch.hpp | 8421 | #ifdef __clang__ | COMMENT |
| LOW | tests/catch.hpp | 8441 | #endif | COMMENT |
| LOW | tests/catch.hpp | 8461 | // | COMMENT |
| LOW | tests/catch.hpp | 10061 | #if !defined(WIN32_LEAN_AND_MEAN) && !defined(CATCH_CONFIG_NO_WIN32_LEAN_AND_MEAN) | COMMENT |
| LOW | tests/catch.hpp | 10401 | COMMENT | |
| LOW | tests/catch.hpp | 10461 | #elif defined(CATCH_PLATFORM_LINUX) | COMMENT |
| LOW | tests/catch.hpp | 12181 | COMMENT | |
| LOW | tests/catch.hpp | 12601 | COMMENT | |
| LOW | tests/catch.hpp | 15001 | auto Timer::getElapsedSeconds() const -> double { | COMMENT |
| LOW | tests/catch.hpp | 15321 | // https://www.boost.org/LICENSE_1_0.txt) | COMMENT |
| LOW | tests/catch.hpp | 16121 | COMMENT | |
| LOW | tests/catch.hpp | 16801 | # pragma clang diagnostic pop | COMMENT |
| LOW | tests/catch.hpp | 17521 | #pragma clang diagnostic pop | COMMENT |
| 304 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/regressions.cpp | 102 | int dummy_id; | CODE |
| LOW⚡ | tests/regressions.cpp | 112 | bool ok = timeline->requestClipInsertion(binId0, 0, 10, dummy_id); | CODE |
| LOW⚡ | tests/regressions.cpp | 113 | KdenliveTests::makeFiniteClipEnd(timeline, dummy_id); | CODE |
| LOW⚡ | tests/regressions.cpp | 396 | int dummy_id; | CODE |
| LOW⚡ | tests/regressions.cpp | 397 | timeline->requestTrackInsertion(-1, dummy_id ); | CODE |
| LOW⚡ | tests/regressions.cpp | 398 | timeline->requestTrackInsertion(-1, dummy_id ); | CODE |
| LOW⚡ | tests/regressions.cpp | 399 | timeline->requestTrackInsertion(-1, dummy_id ); | CODE |
| LOW⚡ | tests/regressions.cpp | 400 | timeline->requestTrackInsertion(-1, dummy_id ); | CODE |
| LOW⚡ | tests/regressions.cpp | 401 | timeline->requestTrackInsertion(-1, dummy_id ); | CODE |
| LOW⚡ | tests/regressions.cpp | 402 | timeline->requestTrackInsertion(-1, dummy_id ); | CODE |
| LOW⚡ | tests/regressions.cpp | 403 | timeline->requestTrackInsertion(-1, dummy_id ); | CODE |
| LOW⚡ | tests/regressions.cpp | 404 | timeline->requestTrackInsertion(-1, dummy_id ); | CODE |
| LOW⚡ | tests/regressions.cpp | 405 | timeline->requestTrackInsertion(-1, dummy_id ); | CODE |
| LOW⚡ | tests/regressions.cpp | 406 | timeline->requestTrackInsertion(-1, dummy_id ); | CODE |
| LOW⚡ | tests/regressions.cpp | 407 | timeline->requestTrackInsertion(-1, dummy_id ); | CODE |
| LOW⚡ | tests/regressions.cpp | 412 | timeline->requestClipInsertion(producer,10 ,453, dummy_id ); | CODE |
| LOW⚡ | tests/regressions.cpp | 419 | timeline->requestClipInsertion(producer,9 ,590, dummy_id ); | CODE |
| LOW | tests/regressions.cpp | 126 | bool ok = timeline->requestClipInsertion(binId0, 2, 10, dummy_id); | CODE |
| LOW | tests/regressions.cpp | 208 | bool ok = timeline->requestClipInsertion(binId0, 0, 1, dummy_id); | CODE |
| LOW | tests/regressions.cpp | 239 | int dummy_id; | CODE |
| LOW | tests/regressions.cpp | 245 | bool ok = timeline->requestTrackInsertion(-1, dummy_id); | CODE |
| LOW | tests/regressions.cpp | 376 | bool ok = timeline->requestTrackInsertion(-1, dummy_id); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | data/excluded_effects.txt | 115 | # 1426 : A compressor with sidechain. Based on the code for SC1 (1425). Not usable in my tests. | COMMENT |
| HIGH | data/excluded_effects.txt | 116 | # 1427 : A stereo compressor with sidechain input. Based on the code for SC1 (1425). Produces audio only in the left cha | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/catch.hpp | 12664 | // No children have started. We need to check if they _can_ | COMMENT |
| LOW | src/profiles/profilerepository.cpp | 61 | // Step 1: Load MLT profiles into a local map keyed by spec string. | COMMENT |
| LOW | src/profiles/profilerepository.cpp | 82 | // Step 2: Load Kdenlive profiles. For each valid profile, erase any MLT | COMMENT |
| LOW | src/profiles/profilerepository.cpp | 100 | // Step 3: Insert remaining MLT profiles that have no Kdenlive equivalent. | COMMENT |
| LOW | src/jobs/filtertask.cpp | 295 | // Step 2: process the xml file and save in another .mlt file | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | appiumtests/changespeed.py | 9 | CODE | |
| LOW | appiumtests/changespeed.py | 10 | CODE | |
| LOW | appiumtests/changespeed.py | 16 | CODE | |
| LOW | data/scripts/generate_transition_previews.py | 13 | CODE | |
| LOW | data/scripts/generate_transition_previews.py | 14 | CODE | |
| LOW | data/scripts/generate_transition_previews.py | 15 | CODE | |
| LOW | data/scripts/automask/kdenlive_build_sam.py | 6 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/core.cpp | 151 | // TODO: implement logic for upgrade detection | COMMENT |
| LOW | src/bin/bin.cpp | 1746 | // TODO: implement pending only deletion | COMMENT |
| LOW | src/doc/documentvalidator.cpp | 2614 | // TODO: implement conversion for more filters | COMMENT |
| LOW | src/doc/documentvalidator.cpp | 2635 | // TODO: implement conversion for more filters | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/profiles/profilerepository.cpp | 61 | // Step 1: Load MLT profiles into a local map keyed by spec string. | COMMENT |
| LOW | src/profiles/profilerepository.cpp | 82 | // Step 2: Load Kdenlive profiles. For each valid profile, erase any MLT | COMMENT |
| LOW | src/profiles/profilerepository.cpp | 100 | // Step 3: Insert remaining MLT profiles that have no Kdenlive equivalent. | COMMENT |
| LOW | src/jobs/filtertask.cpp | 295 | // Step 2: process the xml file and save in another .mlt file | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | appiumtests/insertclip.py | 53 | except selenium.common.exceptions.TimeoutException: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | validate-xml-files.py | 45 | def filter_excluded_included_xml_files(files: list[str]) -> list[str]: | CODE |
| LOW | data/scripts/generate_transition_previews.py | 88 | def get_available_transitions(self): | CODE |
| LOW | data/scripts/generate_transition_previews.py | 167 | def create_transition_preview(self, transition_path): | CODE |
| LOW | data/scripts/automask/kdenlive_sam2_video_predictor.py | 13 | def load_video_frames_from_jpg_images( | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .gitlab-ci.yml | 62 | # Create the APPX packages | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | data/scripts/generate_transition_previews.py | 84 | except Exception as e: | CODE |
| LOW | data/scripts/generate_transition_previews.py | 164 | except Exception as e: | CODE |
| LOW | data/scripts/generate_transition_previews.py | 250 | except Exception as e: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | data/scripts/whisper/whisperquery.py | 11 | CODE | |
| LOW | data/scripts/whisper/whispertotext.py | 46 | CODE | |
| LOW | data/scripts/whisper/whispertosrt.py | 29 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | data/scripts/whisper/whispertosrt.py | 69 | # we want to use seamless to translate, get full text from whisper | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | appiumtests/changespeed.py | 46 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | validate-xml-files.py | 47 | # Check if the file exists | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | data/scripts/generate_transition_previews.py | 27 | logger = logging.getLogger(__name__) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | data/scripts/generate_transition_previews.py | 30 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/titler/graphicsscenerectmove.cpp | 544 | delete click; // don't forget to delete the event | CODE |