"Is there a seed oil in this?" — and our honest take
The Seed Oils module lets a seed-oil-avoidant consumer instantly see whether a product contains one of the industrial seed oils we flag, and what we deliberately don't flag. It's anchored to Tucker Goodrich's "Hateful 8" — the canonical biohacker list of high-PUFA, industrially-refined seed oils — plus the catch-all "vegetable oil" and refined peanut as a +1.
Validated against ~119,000 real food products across two disjoint corpora at 100.0% recall. Below: what we flag, why, what we deliberately don't, and a live tester so you can paste any ingredient label and see exactly what the production module would do.
Test a label — see what we flag
Mirrors the production detect_seed_oils() byte-for-bytePaste an ingredient list (or copy from a packet in your pantry). The module normalizes whitespace and slashes, then runs longest-keyword-first substring matching with a word-boundary special case for vegetable oil (so plural "vegetable oils (palm)" is correctly skipped). Try the examples below.
A soft cap, not a flat penalty — how the rule actually scores
Seed oils are culturally controversial, but current science (Johns Hopkins 2025, Memorial Sloan Kettering, recent meta-analyses) finds them mixed-to-neutral at normal dietary doses. We respect the avoidant consumer's preference without overstating the science — so the rule is a ceiling, not a deduction:
- ▸One seed oil present → Processing Score is capped at 80 (Clean max). A product already scoring 65 isn't moved.
- ▸Two or more seed oils present → cap at 55 (Moderate max). The "blend of canola + soybean + safflower" formulation pattern.
- ✓Detection drives the filter tag too — anyone avoiding seed oils can sort/filter the catalog by it.
- ▸Genuinely evidence-backed fat concerns — trans fats, oxidation, hydrogenation — are handled on separate axes with their own evidence floors. Membership ≠ harm.
This keeps us honest: we serve the preference without overstating the science, and we don't punish a tin of tuna in sunflower oil as if it were a hot dog.
What counts as a seed oil — the "Hateful 8" + 1
61 keyword entries in the production set, organized around Tucker Goodrich's 8 canonical industrial seed oils plus refined peanut as a 9th and "vegetable oil" as the US-label catch-all. Each canonical oil includes every label spelling we observed on a 445k-product USDA corpus scan, plus international spellings as insurance for non-US labels.
A "partially hydrogenated soybean oil" hits this set and separately fires the trans-fat axis — membership and evidence are kept on independent tracks.
Three separate questions, three independent tags
Fats get classified on three orthogonal axes — an oil can carry more than one. The UI composes them on read (e.g. "Avoid Concerning Fats" = seed oil OR palm OR tropical).
The Hateful 8 + refined peanut + vegetable-oil catch-all + refined/hydrogenated/blend variants. High-PUFA, industrial.
Every palm leaf — palm fruit, palm kernel, and blends. Saturated; handled on its own axis.
Palm + coconut — saturated, oxidation-stable. Palm carries both palm and tropical tags.
What's not a seed oil — the deliberate carve-outs
Common mix-ups. These are intentionally excluded with their rationale logged in code, so we never re-litigate them every time someone asks "but what about ___ oil?":
Validation — 100% recall on ~119,000 real products
Measured on two disjoint corpora using an independent ground-truth regex (broader than our keyword set, so it catches anything we'd miss). Truth: label-declared Hateful 8.
| Corpus | Size | TP | FP | FN | TN | Recall | Precision |
|---|---|---|---|---|---|---|---|
| Cached oil-relevant harness | 19,421 | 6,529 | 29 | 0 | 12,763 | 100.00% | 99.6% |
| Fresh USDA shuffle (disjoint) | 100,000 | 34,861 | 174 | 0 | 64,965 | 100.00% | 99.5% |
FPs are ground-truth-regex artifacts on parenthetical lists where the broader regex flags inside a sublist that detect_seed_oils correctly skips — not real over-flags. PR: peak-health/baseline-data-pipeline#211
Look up any oil
Every oil we've classified and which tags it carries.All — oils we've reviewed from the Open Food Facts taxonomy. Search a name to see exactly how it's tagged — or whether it's deliberately not flagged.
| Oil | Tags | Why |
|---|
Where it's still rough (we'd rather you hear it from us)
- ▸It's an editorial line, not a hard fact. Open Food Facts has no "seed oil" flag — different sources draw the boundary differently. This is Peak Health's curated call (the "Hateful 8" cluster), maintained by hand.
- ▸It rides on the ingredient list. If a label hides the oil behind "vegetable oil" with no detail, we tag the generic — but we can't always tell which seed oil it is.
- ▸High-oleic cultivars are still flagged by label. A high-oleic sunflower is fatty-acid-closer to olive than to a standard RBD sunflower, but the label usually still says "sunflower oil." We tag conservatively and let the avoidant consumer decide. Lab-spec carve-out is a future call.
- ▸The taxonomy drifts. Open Food Facts is volunteer-edited; new oil entries appear. We re-audit annually and the importer warns on any oil we haven't yet classified.
- ▸The science may move. Today we treat seed oils as a soft cap, not a flat penalty. If the evidence base shifts harder either direction, the cap level (80 / 55) is what we'd revisit.
Questions or disagreements on where the line sits? → tell Stefan and this page gets better.