Build1 distinct publisher3 min readUpdated
One maintainer's audit of the most-downloaded pub.dev packages puts 138 of dio's 142 findings in its own tests and example app. That ratio is how scanners get switched off.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
Triage is priced per finding, and dio sets the price. A scanner that walks every .dart file in the published archive reports 142 findings against it; four are things a consumer of dio is actually exposed to, and the remaining 138 are the package's own test suite and example app [5][6]. That leaves 2.8% of the report worth a human minute [3].
The reason the ratio exists is not subtle. A pub archive carries test/ and example/ next to lib/, and a scanner reading .dart files has no reason to care which tree a socket call sits in unless someone teaches it the difference. capdrift's maintainer resolved the AST rather than matching regexes and executed nothing [2], and makes the point that none of the 142 are wrong: each is a real API call in a real file [7]. What the report does not do is say which ones could reach a dependent, and a test that opens a socket stops existing the moment you add the package to pubspec.yaml [4].
Restricted to code that runs for a consumer, the survey lands on 633 findings across 81 packages [8]. That is 7.8 per package [2], and it means the other 81 of the 162 have nothing consumer-reachable at all [1]. Forty-seven have no capabilities whatever, including collection and meta [9]. What is left is a much smaller reading list than the raw count implies, and the part of it worth reading first is runtime code loading, because static analysis cannot follow it: build_runner calls Isolate.spawnUri, which downloads Dart from a URI and runs it [10], drift uses both spawn forms, and dio, sentry, sentry_flutter, file_picker, flutter_map and extended_image use Isolate.spawn [11]. analyzer, pigeon and collection touch dart:mirrors, and collection's use of it turns out to be confined to its own test support [12] - which capdrift logs as a caveat about the analysis rather than a verdict on the package [13].
The number that does not sit still is the headline one. 633 consumer-reachable findings out of 1,805 is 35%, which puts 65% outside shipped code, not 59% [4]. Six points of the survey's central claim are unreconciled in the post itself. The raw JSON for all 162 packages and the analysis script are published [19], so the gap is checkable by anyone who cares to, which is more than most vendor telemetry offers.
The null result is the part I would keep. None of the 162 packages ship a hook/ directory [14], code that runs on your machine at pub get time before your own app executes. The maintainer checked that against three synthetic fixtures, one of which shells out to curl from a build hook, with 11/11 recall on that corpus [15]. Native-assets hooks are new enough that the established packages predate them, and nobody reviewing dependencies has built habits for reading them [16]. Two caveats sit on all of this: the corpus is the download ranking, and popular packages are better maintained than average, so it is a best case rather than a typical one [17], and fl_chart, get, hive_flutter and photo_view did not fully resolve, so their contributions are floors [18].
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
capdrift is a tool that reads a Dart package and reports what it is able to do; its maintainer ran it across the 162 most-downloaded packages on pub.dev and kept the raw output.
Method: capdrift inspect <pkg> --format json against each package's latest version, resolved AST rather than regex, no code executed. 162 packages, 1,805 findings, zero analysis failures.
dio is the second most popular HTTP client in the ecosystem, and a scanner that walks every .dart file in the archive reports 142 findings for it.
Four of dio's 142 findings are things a consumer of dio is actually exposed to; the other 138 are its own test suite and example app.
Restricting to code that runs for a consumer leaves 633 findings across 81 packages.
The author states every figure is reproducible from a published directory holding the raw capdrift JSON for all 162 packages, the package list, and an analyse.py that prints the figures.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Documented, self-published method with an unreconciled total
The method is unusually explicit for a single-author post: named tool version, resolved-AST analysis with no execution, a fixed 162-package corpus, published raw JSON plus an analyse.py, and self-declared limitations including four incompletely resolved packages and latest-version-only coverage. What holds the score down is that everything rests on one self-published article by the tool's maintainer, no third party has re-run the corpus, and the article's own totals (633 reachable of 1,805) imply 65% unreachable against a 59% headline, a gap the text never reconciles.
Publicly installable, only maintainer usage evidenced
Adoption evidence is limited to the tool's own author: a public MIT-licensed repository, a pub install command, version 0.2.0, one maintainer-run survey and a self-reported fixture benchmark. Nothing in the supplied material shows another team, CI pipeline or vendor running capdrift or changing triage on its output, and the surveyed ecosystem itself shows zero uptake of the hook/ surface the post highlights.
Modest data, slightly overreaching causal frame
The core measurements are stated conservatively and the post volunteers its own limits, which pulls the gap toward zero; the headline share is even lower than the article's own totals imply, an understatement rather than an inflation. The overshoot sits in the framing: the mechanism claim that irrelevant reports are why teams switch scanners off is asserted with no measurement, and ecosystem-level language ('half the ecosystem by count is inert') is applied to a download-ranked best-case sample the author elsewhere says is not typical.
Maintainer surveying an ecosystem with his own tool
The author is capdrift's maintainer, the survey is produced entirely with capdrift, and the post ends with install and inspect commands plus a repository link, so the finding that competing archive-wide scanners produce 97% irrelevant reports directly advantages the author's product. Mitigating factors are the MIT licence with no pricing or gating, published raw data, an explicit invitation to report contradicting results, and disclosure of limitations that cut against the author's numbers.
Checkable but uncorroborated single-source claim set
Confidence is moderate-low: the numbers are specific, dated and accompanied by published artifacts, which makes them falsifiable, but the cluster has one publisher, one author, an unresolved internal inconsistency in the reachability share, four packages counted as floors, and a reflection blind spot the author acknowledges. Per-package facts (dio's 142/4 split, the Isolate and mirrors lists, zero hook/ directories) are the most reliable elements; the behavioural and forward-looking claims are the least.
invest
Rust's arrayref hijack lasted 86 minutes, and Wiz ties it to North Korea1 distinct publisher
security
A manifest edit, not a code edit: North Korea backdoored three Rust crates via typosquat1 distinct publisher
build
One non-ASCII letter broke four toolchains: path checks belong in CI, not folklore1 distinct publisher
build
Fabricated SQLite CVEs cleared NVD, CISA ADP and Red Hat before anyone ran the code1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 22, 2026