How this works
Methodology
Every number on this site is computed from published inputs by a formula written down here. If you disagree with a verdict, you should be able to find the exact step you disagree with.
1. Where the residue numbers come from
Every residue figure on this site is computed from the raw USDA Pesticide Data Program archives by scripts/ingest/build_pdp_dataset.py — 50,359analysed samples across the 2014–2024 program years, of which 2,737 are organic. Nothing is entered by hand; rerunning the script regenerates the lot.
Three properties of that programme shape what this site can and cannot say, and all three are worth stating plainly.
PDP rotates its commodities
Each program year samples roughly twenty commodities, not the whole produce aisle, so no single year covers this site's food list. For each food we pool the3 most recent program years in which that commodity was actually sampled, and every food page prints the year range behind its own numbers. That is why strawberries carry a 2014–2016 vintage while potatoes carry 2022–2024: those are the most recent years USDA tested them.
It is also why 3 foods on this site carry no residue verdict at all. Papaya, garlic, and lemons have not been sampled in any year we ingest. They get "insufficient data", not an estimate.
Samples are prepared the way people eat the food
USDA states that PDP samples are "prepared emulating consumer practices (e.g., washing, peeling)". Apples are washed but not peeled; avocados are peeled and pitted; sweet corn is husked; everything is rinsed for 15–20 seconds and drained. These are post-preparation figures. They already account for the washing this site recommends, which is why washing advice is offered as good practice rather than as a way to improve on the numbers shown.
This has one genuinely surprising consequence. Bananas are peeled before testing, and 82% of conventional samples still carry a detected residue — the compounds involved move into the fruit rather than sitting on the skin.
Organic does not mean zero
Across the commodities here, organic samples carry detections far more often than the popular picture suggests: 81% of organic spinach samples and 79% of organic kale samples showed at least one residue. The measured organic advantage is real but it is mostly in thenumber of compounds and their concentration, not in the presence of any detection at all. Verdict thresholds on this site are calibrated to that reality rather than to the assumption that organic reads clean.
2. Relative pesticide residue evidence index
A 0–100 index computed for each commodity, separately for conventional and organic samples. It combines three measured inputs, each normalised to a ceiling and then weighted:
index = 100 × (
0.3 × detectionFrequency
+ 0.4 × min(meanResidues / 8, 1)
+ 0.3 × min(shareNearBenchmark / 0.8, 1)
)- detectionFrequency — share of samples containing at least one detected residue at any level.
- meanResidues — mean count of distinct compounds per sample. Weighted highest because a sample carrying six residues is a materially different observation from one carrying a single trace, and the count is less sensitive to instrument sensitivity than detection frequency is.
- shareNearBenchmark — share of samples where any residue reached 1% of its EPA tolerance. Deliberately conservative: it flags samples at a hundredth of the enforcement level. Detections of compounds with no established tolerance on that commodity are excluded from this measure and from the above-tolerance measure, because there is no benchmark to compare them against. That exclusion is material — for some commodities it covers half the detections — and it makes both figures conservative.
Bands: lower below 25, moderate 25–54,higher 55 and above.
This is not a safety score. It ranks commodities against each other on how much residue evidence exists. The EPA states that detecting a residue does not mean a food is unsafe, and monitoring consistently finds more than 99% of samples below federal tolerances.
3. Organic upgrade priority
The score that drives every verdict and the budget optimizer:
priority = 100 × residueGap × exposureWeight × confidenceFactor
residueGap = max(0, conventionalIndex − organicIndex) / 100
exposureWeight = 0.5 + 0.5 × min(servingsPerWeek / 5, 1)
servingsPerWeek = weeklyUnits × servingsPerUnit
confidenceFactor = high 1 · moderate 0.9 · limited 0.72 · insufficient 0.5Exposure weighting is the part that separates this from a pure residue ranking. A 70-point gap on a fruit bought twice a summer is worth less to a household than a 58-point gap on something eaten five days a week — which is why apples rank above nectarines here despite indexing lower on raw residue evidence.
Verdict thresholds
- Prioritize organic — score ≥ 38
- Consider organic — score 24–38
- Conventional is a reasonable budget choice — score < 24
- Insufficient data — see below
4. What we refuse to score
Three rules, applied before any verdict is produced:
- Fewer than 50 conventional samples — no ranking. The estimate would move too much on a handful of results.
- No organic sample set and a conventional index of 20 or more — no ranking. The entire recommendation would rest on an assumed gap. Blackberries are the current example.
- No residue monitoring applies — foods like oats, eggs, and olive oil get category-appropriate measures instead: protein per dollar, fiber, sodium, added sugar, processing level, mercury category, or heavy-metal evidence.
Where a fallback for a missing organic arm is used anywhere in the pipeline, it is the dataset-wide median organic-to-conventional index ratio — currently22%, derived from the36 commodities that do have both arms rather than assumed. It is labelled on the page wherever it applies and never produces a "prioritize" verdict on its own.
5. Nutrient density score
A 0–100 profile score per calorie, adapted from published nutrient-density scoring approaches: positive weight for protein, fiber, and the micronutrients a food is a meaningful source of; negative weight for added sugar, sodium, and processing level.
Unlike the residue index, this one is a curated adaptation rather than a mechanical recomputation from a single source table. It is intended to rank foods sensibly against each other, not to replace a full nutrient analysis. Treat differences of a few points as noise.
6. Prices and quantities
Prices are typical U.S. retail levels for the stated unit. This site does not scrape any retailer and does not claim to reflect what you will pay today in your store.
Household scaling is not linear across the board:
quantity = weeklyUnits × (1 + (people − 1) × slope)
slope: produce 1.0 · protein 1.0 · dairy 0.9 · frozen 0.9
grains 0.7 · pantry 0.7 · snacks 0.7 · fats 0.6A bottle of olive oil does not double when a second person moves in. Fresh food largely does.
7. The budget optimizer
Greedy allocation by priority points per extra dollar per week. Each candidate upgrade is scored as priorityScore / extraCostPerWeek, sorted descending, and taken while budget remains.
With many small, cheap upgrades this tracks the optimal 0/1 knapsack solution closely. We chose it over an exact solver for a specific reason: every decision it makes can be explained to a shopper in one line, and a recommendation you cannot explain is not much use at the shelf.
This is why a $1.00 upgrade on carrots can outrank a $4.40 upgrade on strawberries — the smaller one buys more measured change per dollar.
8. List generation
Foods are scored against your selected goals, then slotted into group targets: fruit, vegetables, protein, grains, dairy, fats, pantry, frozen, snacks. Produce is split into fruit and vegetables with a floor on each — without that split, a pure nutrient-density ranking fills every produce slot with leafy greens and returns a list containing no fruit.
When the total exceeds your budget, the generator cuts in a fixed order:
- Organic upgrades, lowest priority first.
- Worst value-per-dollar items.
- Never below a floor of two fruits, three vegetables, two proteins, and one grain. If that core still exceeds the budget, the tool says so rather than shipping an unusable list.
9. How the map is drawn
The pesticide & nutrition map splits the commodities into four quadrants at a residue evidence index of 40 and a nutrient-density score of 75. The horizontal axis is inverted — lower residue evidence sits to the right — so the reassuring corner is top-right, the way a two-by-two is normally read.
Both axes are rescaled into an inset rather than clamped, because half the dataset sits below a residue index of 20 and clamping piled all of it onto the same few pixels.
Two presentational adjustments are worth stating plainly. Marks whose emoji would sit directly on top of one another are pushed apart, capped at1.5% horizontally and 2.5% vertically of the plot — small enough that no food can change its order or its quadrant. And where two names cannot both fit, the second one is shown on hover rather than printed. Neither adjustment touches the underlying numbers, which are printed on each food's own page.
10. Limitations we will not paper over
- Organic sample sets are an order of magnitude smaller than conventional ones. Detection rates on 40-sample sets are unstable.
- Residue monitoring is a commodity-level programme. It cannot tell you about the specific bag in your hand, its origin, or its season.
- Prices vary by region, retailer, and week far more than the single figures here suggest.
- The nutrient-density score is a ranking aid, not a clinical tool. This site is general information, not medical or dietary advice.
- Residue figures are measured; nutrition and price rows remain curated estimates, not ingested from a source dataset.
- Pooling three program years means a food's numbers can span a decade-old vintage where USDA has not retested since. The year range is printed on every food page.
11. Reproducing this
The formulas are implemented in one file, src/lib/scoring.ts, and the residue inputs they consume are produced by scripts/ingest/build_pdp_dataset.py from the annual archives at ams.usda.gov. Download the ZIPs, run the script, rebuild: you should get the same numbers this site publishes. No score is stored by hand.
Editorial prose lives in TypeScript and generated numbers live in JSON, deliberately: a data refresh can never rewrite the writing, and editing the writing can never disturb the data.
Found something wrong? Corrections policy and how to report.