This report summarizes scanner evidence for DylanVann/react-native-fast-image. SynthScan examined 77,215 lines of code across 311 source files, recording 132 pattern matches distributed across 3 syntactic categories. The legacy adjusted pattern signal is 1.6 (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? 111 finding(s).
Are imports declared and package/API names verified? 21 finding(s).
Are wrappers, guards, and repeated structures necessary? 21 finding(s).
Which changes need focused human review? 132 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 132 distinct pattern matches across 3 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/app/plugins/withSubject.js | 1 | // Links only this build's subject (see subjects.js): expo-image is an Expo | COMMENT |
| LOW | benchmark/app/plugins/withAndroidBenchmark.js | 1 | // The Android build's benchmark setup (see ../../android): | COMMENT |
| LOW | …nchmark/app/modules/memory-samples/ios/MemorySamples.m | 1 | // The app's memory, measured in the app every 250 ms while the iOS memory | COMMENT |
| LOW | benchmark/app/src/Scenario.tsx | 41 | // several sizes at once. | COMMENT |
| LOW | benchmark/images/make-images.ts | 1 | // Makes the benchmark's images: photos from picsum.photos, each tinted to its | COMMENT |
| LOW | benchmark/ios/capture/Sources/capture/main.swift | 1 | // Records the screen of an iOS device connected over USB to QuickTime | COMMENT |
| LOW | benchmark/ios/UITests/ImageServer.swift | 1 | // Serves the benchmark's images (../../images/out, in this test bundle) on | COMMENT |
| LOW | benchmark/ios/UITests/TotalMemoryMetric.swift | 1 | // The app's memory as the app measures it (MemorySamples, in | COMMENT |
| LOW | …/dylanvann/rnfibenchmark/macrobenchmark/ImageServer.kt | 21 | // Serves the benchmark's images (../../images/out, in this APK's assets) on | COMMENT |
| LOW | …ylanvann/rnfibenchmark/macrobenchmark/BenchmarkTest.kt | 21 | import org.junit.Test | COMMENT |
| LOW | benchmark/scripts/analyze.ts | 1 | // Finds when each image showed in a run's screen recording (see run.ts). | COMMENT |
| LOW | benchmark/scripts/run-android.ts | 1 | // Runs the benchmark on Android (see ../README.md): on a connected device or | COMMENT |
| LOW | benchmark/scripts/run-android.ts | 21 | // results folder. Writes | COMMENT |
| LOW | benchmark/scripts/compare-videos.ts | 1 | // Makes a side-by-side video of a scenario's runs in a results folder: for | COMMENT |
| LOW | benchmark/scripts/run.ts | 1 | // Runs the benchmark on a connected iPhone (see ../README.md). | COMMENT |
| LOW | …mple/ios/ExampleAnimationClock/ExampleAnimationClock.m | 1 | #import <QuartzCore/QuartzCore.h> | COMMENT |
| LOW | ReactNativeFastImageExample/src/RunnerContext.tsx | 21 | // false: the work Fast Image does for it (its requests, decodes and | COMMENT |
| LOW | ReactNativeFastImageExample/src/RegressionRunner.tsx | 41 | // (or any controller) is connected to the relay; see index.tsx. | COMMENT |
| LOW | ReactNativeFastImageExample/src/RegressionRunner.tsx | 61 | // the reply to 'measure' | COMMENT |
| LOW | ReactNativeFastImageExample/src/RegressionRunner.tsx | 101 | } | COMMENT |
| LOW | ReactNativeFastImageExample/src/RegressionRunner.tsx | 241 | // renders; the fade-default group checks the built-in default. | COMMENT |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 1741 | // requests (see the image server). | COMMENT |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 1761 | // queued-latest-url, with the same sixteen: an image of a url with a | COMMENT |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 4301 | COMMENT | |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 5781 | </View> | COMMENT |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 5801 | // - disk: a view showing it loaded it, then went away, and the memory cache | COMMENT |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 5821 | // contain, with the image (cyan-short.png, 42 × 41 px) a pixel shorter | COMMENT |
| LOW | maestro/background.yaml | 1 | # Sends the app to the background while an image is loading, and brings it | COMMENT |
| LOW | maestro/touch.yaml | 1 | # Taps the regression runner's `touch` cases, which need a real touch: the | COMMENT |
| LOW | maestro/background-no-activity.yaml | 1 | # Calls clearMemoryCache and clearDiskCache from JS while the app has no | COMMENT |
| LOW | ios/FastImage/FFFThumbHash.m | 1 | #import "FFFThumbHash.h" | COMMENT |
| LOW | ios/FastImage/FFFastImageSource.h | 21 | @interface FFFastImageSource : NSObject | COMMENT |
| LOW | ios/FastImage/FFFastImageSource.h | 61 | // Caches the image under cacheKey, or nil without one. | COMMENT |
| LOW | ios/FastImage/FFFastImageSource.h | 81 | COMMENT | |
| LOW | ios/FastImage/FFFastImageSource.h | 101 | // before the clear. So each response the web loader stores records the clear | COMMENT |
| LOW | ios/FastImage/FFFastImageModule.mm | 1 | #import "FFFastImageModule.h" | COMMENT |
| LOW | ios/FastImage/FFFDownsampledImage.h | 1 | #import <SDWebImage/SDAnimatedImage.h> | COMMENT |
| LOW | ios/FastImage/FFFDownsampledImage.h | 21 | // own thumbnail decoding can only fit, so this class works out the size from | COMMENT |
| LOW | ios/FastImage/FFFDownsampledImage.h | 41 | // an SVG drawn at its own size at `screenScale` (or kept a vector if it's | COMMENT |
| LOW | ios/FastImage/FFFDownsampledImage.h | 61 | COMMENT | |
| LOW | ios/FastImage/FFFastImageView.m | 1 | #import "FFFastImageView.h" | COMMENT |
| LOW | ios/FastImage/FFFastImageView.m | 21 | // The image before tinting and blurring, kept while either is applied so they | COMMENT |
| LOW | ios/FastImage/FFFastImageView.m | 41 | // nothing). A new source then keeps it until the new image has loaded (see | COMMENT |
| LOW | ios/FastImage/FFFastImageView.m | 61 | @property(nonatomic, assign) BOOL decodedCover; | COMMENT |
| LOW | ios/FastImage/FFFastImageView.m | 81 | @property(nonatomic, assign) NSUInteger sizeReload; | COMMENT |
| LOW | ios/FastImage/FFFastImageView.m | 161 | // decoded frames, keeping the one it shows, unless another view plays | COMMENT |
| LOW | ios/FastImage/FFFastImageView.m | 761 | COMMENT | |
| LOW | ios/FastImage/FFFThumbHash.h | 1 | #import <UIKit/UIKit.h> | COMMENT |
| LOW | ios/FastImage/FFFastImageSource.m | 1 | #import "FFFastImageSource.h" | COMMENT |
| LOW | ios/FastImage/FFFBoxBlur.h | 1 | #import <CoreGraphics/CoreGraphics.h> | COMMENT |
| LOW | ios/FastImage/FFFastImageViewComponentView.mm | 1 | #import "FFFastImageViewComponentView.h" | COMMENT |
| LOW | ios/FastImage/FFFastImageView.h | 41 | @property (nonatomic, copy) NSArray<FFFastImageSource *> *sources; | COMMENT |
| LOW | ios/FastImage/FFFastImageView.h | 61 | // `loop` prop not set), 0 for forever, or a number of times. | COMMENT |
| LOW | ios/FastImage/FFFDownsampledImage.m | 1 | #import "FFFDownsampledImage.h" | COMMENT |
| LOW | ios/FastImage/FFFDownsampledImage.m | 21 | static SDImageCoderOption const FFFDecodeMaxScale = @"FFFDecodeMaxScale"; | COMMENT |
| LOW | …rer/components/FastImage/FastImageAutoViewShadowNode.h | 1 | #pragma once | COMMENT |
| LOW | ReactNativeFastImageExampleServer/formats.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | ReactNativeFastImageExampleServer/server.ts | 1 | // Serves the example app's images (images/) so it doesn't depend on remote | COMMENT |
| LOW | ReactNativeFastImageExampleServer/server.ts | 21 | // (status 200, cacheable for an hour, like a captive portal's, | COMMENT |
| LOW | ReactNativeFastImageExampleServer/server.ts | 41 | // User-Agent (which platform asked): `[{ "at": 1700000000000, "path": | COMMENT |
| 30 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ReactNativeFastImageExample/src/SmokeExample.tsx | 1247 | function AutoSizeStretchedChangeCase() { | CODE |
| LOW | ReactNativeFastImageExample/src/SmokeExample.tsx | 1579 | function AutoSizeNaturalChangeCase() { | CODE |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 792 | function PreloadInvalidHeadersCase() { | CODE |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 2699 | function ChunkedDownloadCancelCase() { | CODE |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 2771 | function SharedDownloadChunkedCase() { | CODE |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 4002 | function ObjectPositionContainCase() { | CODE |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 4180 | function ObjectPositionDefaultSourceCase() { | CODE |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 4481 | function SourceClearedWhileLoadingCase({ id }: { id: string }) { | CODE |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 4545 | function SourceChangeWhileLoadingCase({ | CODE |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 7860 | function DownsampleHiddenPixelatedCase() { | CODE |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 7905 | function DownsampleNaturalSizeCase() { | CODE |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 8014 | function DownsampleHiddenPositionCase() { | CODE |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 8641 | function DownsampleOverLimitSharedCase() { | CODE |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 9080 | function SeveralSourcesBundledCase({ id, size }: { id: string; size: number }) { | CODE |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 9123 | function SeveralSourcesBorderChangeCase() { | CODE |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 10102 | function ThumbhashChangeLoadedCase() { | CODE |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 10157 | function ThumbhashPlaceholderLateCase() { | CODE |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 10214 | function ThumbhashChangeLoadingCase() { | CODE |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 10480 | function PlaceholderDataUriSizeCase() { | CODE |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 10653 | function PlaceholderUrlCacheOnlyCase() { | CODE |
| LOW | src/thumbhash.ts | 241 | function thumbHashToApproximateAspectRatio(hash: Uint8Array) { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …ylanvann/rnfibenchmark/macrobenchmark/BenchmarkTest.kt | 283 | if ("placeholder" in variant) append("&placeholder=1") | CODE |
| LOW | screenshots/main-android/descriptions.json | 1748 | "placeholder": { | CODE |
| LOW | screenshots/main-android/work.json | 1206 | "placeholder": { | CODE |
| LOW | screenshots/tv-ios/descriptions.json | 1733 | "placeholder": { | CODE |
| LOW | screenshots/tv-ios/work.json | 1291 | "placeholder": { | CODE |
| LOW | screenshots/main-ios/descriptions.json | 1733 | "placeholder": { | CODE |
| LOW | screenshots/main-ios/work.json | 1292 | "placeholder": { | CODE |
| LOW | ReactNativeFastImageExample/src/SmokeExample.tsx | 2176 | <PlaceholderCase key="placeholder" />, | CODE |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 5864 | | 'placeholder' | CODE |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 5908 | const placeholder = from === 'placeholder' | CODE |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 11452 | from="placeholder" | CODE |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 12328 | from="placeholder" | CODE |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 12339 | from="placeholder" | CODE |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 12351 | from="placeholder" | CODE |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 12366 | from="placeholder" | CODE |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 12398 | name: 'placeholder', | CODE |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 12457 | from="placeholder" | CODE |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 12470 | from="placeholder" | CODE |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 12496 | from="placeholder" | CODE |
| LOW | ReactNativeFastImageExample/src/RegressionExample.tsx | 12525 | from="placeholder" | CODE |
| LOW | src/index.test.tsx | 541 | describe('placeholder', () => { | CODE |