Flavour Bomb

A pairing engine built from volatile-compound overlap, umami synergy and a novelty penalty, not from anyone's book. Hand-seeded data, approximate figures, meant for testing whether the scoring behaves sensibly.

offdominant
offdominant
reward the classicshunt the unexplored

Turn this off and shared-compound counting goes unweighted, so hexanal, linalool and 3-methylbutanal start doing most of the work. At this dataset size the rarity spread is about 3×, so the reordering is visible but not violent. It would bite much harder on a full database.

Hunts pairs that share almost no aroma directly but are savoury and connected through a third ingredient, which the card names. An earlier version scored absence alone and turned out to be the umami ranking in disguise. The chemistry slider now sets how hard the mediation is demanded; at zero it collapses back to umami only.

Two ingredients that share nothing may still be linked through a third. Fermented soy, ginger, sesame and chilli oil do this constantly. Pick two ends and the engine looks for the strongest mediator.

Three axes, no borrowed lists

Every number here is computed from ingredient-level data: compound presence, free glutamate, nucleotide content, cuisine membership. Nothing is copied from a published pairing compilation, which matters because a compilation's selection and arrangement is the part that carries copyright, not the underlying facts.

1. Chemical resonance

Cosine similarity between two ingredients' compound vectors, with each compound weighted by log(N / documentFrequency). A compound found in three ingredients counts for far more than one found in forty.

This is the fix for the dullness problem. Raw shared-compound counts rank the obvious at the top, because ubiquitous volatiles do most of the counting. Rarity weighting means two ingredients sharing capsaicin or diallyl disulfide, each present in two ingredients and carrying a weight of 3.64, outrank two that merely both contain hexanal at 1.39.

An earlier version of this paragraph cited lenthionine and 4-MMP, which was wrong in a way worth recording. Both appear in exactly one ingredient, and a compound present in one ingredient can never appear in an intersection, so it can never do any of the outranking it was being credited with. Forty-six of the 105 compounds here are in that position. The highest weight actually reachable in a shared-compound calculation is 3.64, not the 4.33 the arithmetic seems to promise.

Honest caveat on the demo: with 76 ingredients the rarity spread runs from about 1.4 to 4.3, roughly a threefold range, so flipping the checkbox reorders the list rather than wrecking it. On a database of 25,000 molecules the gap between a universal volatile and a signature one is far wider, and the effect would be correspondingly larger.

2. Umami synergy

Free glutamate reacts multiplicatively with 5′-ribonucleotides (inosinate from meat and fish, guanylate from dried fungi). Each side is scaled linearly against a saturation point, 1700 mg/100g for glutamate and 450 for nucleotides. The score is then the geometric mean of glutamate-in-one and nucleotide-in-the-other, taken in both directions and maximised, with a smaller term added when both sides carry glutamate.

The scaling used to be a square root, which quietly made the cross term a fourth root of the raw ratio. Potato with chicken scored 0.50 on umami synergy under that arithmetic, and potato with chicken is not a dashi by any reading. Linear scaling puts the pair at 0.20 and leaves kombu with katsuobushi at 1.00, where it belongs.

This axis is invisible to volatile analysis entirely, because the actors aren't volatile. Kombu and katsuobushi share almost no aroma compounds and are the most load-bearing pairing in Japanese cooking. Any engine built on aroma alone will miss it, which is a reasonable summary of what's wrong with pure compound-overlap models.

3. Novelty

Familiarity is estimated from shared cuisine membership plus a small hand-coded list of pairings so canonical they need suppressing. Novelty is 1 − familiarity, and it acts as a multiplier on the other two axes rather than a term added to them.

That distinction is the whole design. Additive novelty would promote pairs with no reason to exist beyond being unusual. Multiplicative novelty can only amplify a pair that already has chemical or umami justification, so it reorders the plausible rather than inventing the arbitrary. Formally it's the same manoeuvre as serendipity ranking in recommender systems: relevance high, popularity low, and never popularity-low alone.

Putting the two axes on one scale

Cosine resonance and umami synergy do not naturally occupy the same range. Across all 2,850 pairs here, resonance reaches 0.47 at the 99th percentile while umami reaches 0.67. Combined raw, a slider set to 60/40 did not deliver a 60/40 result, and the chemistry control barely moved the ranking at all. Each axis is now divided by its own 99th percentile before weighting, then clamped at 1. The bars show the normalised figure and the tooltip carries the raw one.

The effect is easiest to see on an ingredient that has both properties. Dried shiitake at chemistry-only returns kombu, fish sauce, mustard seed and nori. At umami-only it returns parmesan, blue cheese, fish sauce and chicken. At the 60/40 default it returns fish sauce, kombu, walnut and nori, which is a genuine blend of the two. Before normalisation the default list and the umami-only list were almost the same, and the slider was close to decorative.

Contrast mode, and why the first version of it failed

Contrast mode used to replace the resonance term with umami × (1 − resonance). Substituted into the weighted mean, the whole score collapsed algebraically to umami × (1 − resonance × wc/(wc+wu)), which is a discount on the umami axis rather than a second principle. Over the 630 pairs carrying any umami at all, its ranking agreed with the umami-only ranking at a Spearman of 0.982.

Steepening the penalty did not help. Both (1 − resonance)⁴ and a hard cutoff at resonance < 0.15 returned the same top four pairs as the original, because the highest-umami pairs already have resonance near zero. The criterion was selecting nothing that umami had not already selected.

The reason is structural. Ranking on an absence cannot work, because there are vastly more ways to share nothing than to share something, so the absence carries almost no information and the order reverts to whatever positive term it multiplied. That is precisely the error the novelty section above avoids by making novelty a multiplier on a justified pair. Contrast mode was committing it one section later.

Mediation, the positive claim

Two ingredients that share nothing directly may both resonate with a third, which is what fermented soy, ginger and toasted sesame do constantly. So the absence became a condition and the mediator became the claim:

bridge(a,c) = max over b of min( resonance(a,b), resonance(b,c) )

That is the widest path of length two across the resonance graph — max-min composition, the same operation as fuzzy transitive closure and the two-hop case of the bottleneck-path problem. The contrast score is then umami × (bridge × (1 − resonance))^2k, where k = wc/(wc+wu).

The exponent is doing specific work. An interpolation of the form umami × (1 − k + k × gate) was the obvious first attempt and was worse than what it replaced, agreeing with umami-only at 0.991, because the (1 − k) floor let umami dominate again. Under the exponent, k = 0 recovers the umami-only ranking exactly, k = 0.5 is the plain product, and the 60/40 default gives an exponent of 1.2. Agreement with umami-only falls to 0.888, which is asserted in the self-check so it cannot quietly drift back.

The lists change character rather than reshuffling. Walnut now returns dried shiitake, katsuobushi and chicken, the shiitake link running through kombu at a bridge of 0.77 against a direct resonance of 0.36. Beef returns soy sauce, kombu and sun-dried tomato. Dried shiitake returns sun-dried tomato, parmesan and blue cheese, the last two through fish sauce.

Kombu with katsuobushi is still the pure case and still does not head the list. Push the novelty amplifier to zero and it ranks first from kombu, as it should. Leave the amplifier at its default and it falls to ninth, because the novelty multiplier applies and this is the most canonical pairing in the dataset. Contrast mode locates the principle. Novelty then declines to sell you what you already know.

Nothing here has been tasted

Flavour Bomb is an experiment and should be read as one. Every figure on these tabs was computed, and not one of them was eaten. The engine ranks pairs by compound overlap, by savoury arithmetic and by a novelty penalty, and none of the three has been checked against a plate of food. A pairing engine nobody has cooked from is a hypothesis with a user interface.

Only cooks can settle it. The test is to build recipes around the predictions, cook them, and analyse what comes back. Not to admire the lists. Of course a favourable result would prove less than it appears, because a cook who knows what the engine predicted will taste what he expects to taste. So the scoring has to be blind, the dishes have to follow a fixed method rather than being improvised into something good, and the engine's high-ranked pairs have to sit alongside low-ranked and randomly drawn ones the cook cannot tell apart beforehand.

Until that exists, read every ranking here as a suggestion about where to look, and not as a claim about what will taste good. The arithmetic is sound. Whether it is about anything is a separate question, and the kitchen is the only place it can be answered.

The umami figures were checked, and they are a blend of two sources

Twenty of the glutamate and nucleotide values were checked against published tables on 10 August 2026, and the data block now carries the source on each line it was checked. Two tables are in play and they do not agree. The Umami Information Center publishes measured ranges and is the better source, but it omits whole categories. The Glutamate Association's chart at msgfacts.com covers more foods as single figures, and is a single uncited page reproduced by IFIC and WebMD. This dataset had been drawing on both without recording which.

Three things came out of the check. Anchovy was carrying 190 of nucleotides, and the Umami Information Center states that the inosinate is decomposed during salting and maturation, so a cured anchovy is a pure glutamate source. Corrected to zero, which drops anchovy from fifth to eighteenth in kombu's list. The engine had been rewarding a cross-synergy that does not exist.

Walnut at 658 mg/100g is single-sourced. It appears in the Glutamate Association chart and nowhere that can be inspected. The Umami Information Center lists no nuts at all, and no primary measurement was found. That figure would put roughly 23 per cent of walnut's total glutamic acid in free form, which is high for a dry seed. It is kept because nothing better exists, and it is load-bearing: at 658 walnut ranks third for dried shiitake, at 200 it ranks eleventh.

Green tea is the awkward one. Its glutamate runs from 17 mg/100g in roasted hojicha to 450 in shaded gyokuro, so the single figure of 220 is a midpoint rather than a measurement. Worse for this model, green tea's umami is carried mainly by theanine, at 2500 mg/100g in gyokuro against 450 of glutamate. Theanine is umami-active, the engine has no term for it, and so green tea is understated here on principle rather than by accident. Any ingredient whose savouriness runs through a compound outside the glutamate and nucleotide pair has the same problem.

One correction to an earlier suspicion. Mackerel was flagged as probably wrong at 36 glutamate against the Glutamate Association's 215. The Umami Information Center gives 10 to 30 glutamate and 280 inosinate, which puts this dataset almost exactly right and makes the 215 the outlier.

The dataset is hand-seeded

Around 76 ingredients with compound lists and umami figures assembled from general knowledge. The glutamate numbers are roughly right, since kombu genuinely is in the thousands of mg per 100g and parmesan in the high hundreds, but treat everything as indicative. The point of this build is to test whether the scoring behaves, before committing to a data pipeline.

To make it real you'd pull FlavorDB2 or FooDB. Both are free for non-commercial use; FooDB requires the authors' permission for commercial redistribution, and the Volatile Compounds in Food database is commercially licensed. A personal tool is unencumbered. A product is a licensing conversation.

Signature compounds act as ballast, and the engine never says so

The 46 compounds that appear in only one ingredient can never be shared, but they still enter the cosine denominator. So a distinctive aromatic quietly suppresses its ingredient's resonance with everything. Measured as the fraction of an ingredient's squared norm that is unshareable: coriander leaf 87 per cent, saffron 83, mint 81, ginger 78, thyme 71. Drop those terms from the norm and coriander leaf with blackcurrant moves from 0.13 to 0.50, thyme with galangal from 0.27 to 0.66.

This is the document-length problem from information retrieval, where tf-idf cosine systematically under-scores documents carrying many rare terms; pivoted length normalisation exists to correct it. Whether it wants correcting here is a real question rather than a settled bug. An ingredient dominated by one signature molecule arguably is perceptually less like everything else, so the ballast may be doing honest work. What is not defensible is leaving it undisclosed, because the 99th-percentile scaler is calibrated on a distribution in which herb and spice pairs are structurally suppressed, and those are exactly the fourteen ingredients that return fewer than eighteen cards.

The mediator is a popularity contest

Mediated contrast picks whichever third ingredient maximises the weaker of the two hops, and ingredients built from common volatiles win that competition more often than they should. Across the 630 pairs with any umami, kombu is chosen as mediator 80 times and potato 69, about 13 and 12 per cent. The eight most-chosen mediators are close to the eight ingredients with the highest mean resonance to everything, which is the hubness problem familiar from graph-based recommenders, where high-degree nodes dominate short paths. It is not fatal here, since 48 of the 76 ingredients are chosen at least once, and both figures are asserted in the self-check so the concentration cannot worsen unnoticed. The proper fix is to discount a mediator by its own average resonance, in the manner of Adamic-Adar, which has not been done.

Compound presence is not perceptual salience

The engine knows a compound is present. It doesn't know at what concentration, or how that concentration compares to the odour detection threshold, which spans about twelve orders of magnitude across compounds. A trace of a potent thiol matters enormously. Abundant ethanol matters not at all. Most public databases record presence only, so this limitation survives the move to real data.

The West/East finding is shakier than its fame

Ahn et al.'s 2011 result, that Western cuisines favour shared compounds while East Asian cuisines avoid them, rests on recipe corpora that are heavily Western web sources, buckets an enormous range of cooking under "East Asian", and is sensitive to controlling for ingredient frequency. Bagler's own group later found regional Indian cuisine also pairs negatively, which breaks the tidy geography. Contrast mode here encodes the principle without asserting the map.

Novelty is not quality

Pushing the novelty amplifier to maximum optimises for surprising, and surprising has a poor correlation with good. This is a separate failure from the untested one above, and it would survive a successful kitchen trial. The engine could be right about which pairs cohere and still be wrong to reward the unfamiliar ones. The amplifier sits at 1.00 by default for no better reason than that it looked sensible.

Verification, and what it caught

The engine has now been extracted and run headless in Node across all 2,850 pairs. It caught three false claims on an earlier version of this page. Shiitake with walnut was described as top-ranked and was fourth. Contrast mode was said to surface kombu with katsuobushi and shiitake with pork, and under mediated contrast at default settings the two sit ninth and nineteenth. Apricot was named in an example and is not in the dataset at all.

The same harness is what showed that contrast mode was a monotone transform of the umami axis, and it caught the replacement failing too: the interpolated form agreed with umami-only at 0.991, worse than the 0.982 it was meant to improve on. Neither would have been visible by inspecting a handful of lists, because both produced sensible-looking output. A rank correlation against the axis you claim to be independent of is now part of the self-check for that reason.

All three came from working a handful of pairs through the arithmetic by hand, which is the method that reliably produces confident and wrong. Every number quoted on these two tabs now comes from execution, and every one of them is asserted in the self-check tab, which re-runs in the browser each time you open it. Edit the data and that tab tells you which sentences have gone stale. Correcting the anchovy nucleotide alone invalidated four of them.

Familiarity is the weakest term, and the metric adds a bias

Cuisine overlap as a proxy for "how often do people already do this" is crude to begin with. The specific metric makes it worse. Familiarity divides shared cuisines by the smaller of the two cuisine counts, which is the overlap coefficient, so any ingredient belonging to a single cuisine scores 0.85 familiar against everything else from that cuisine. Yuzu with katsuobushi lands there. So does wasabi with shiso.

The bias runs the other way too. Garlic and onion share five cuisines out of eight and ten, so the coefficient rated the pair 0.53 and the engine treated one of the most routine combinations in cooking as fairly novel. Jaccard was tried and is worse, dropping garlic and onion to 0.33 while leaving yuzu exactly where it was. Fifteen entries were added to the canonical list instead, which is the escape hatch the design already had. Real co-occurrence counts from a large recipe corpus would replace the proxy outright, and would still change the rankings more than any other single improvement.

Half the dataset cannot use the second axis

Forty of the seventy-six ingredients carry no free glutamate and no ribonucleotides. For any two of them the umami term is exactly zero, so the engine quietly becomes chemistry and novelty alone and the umami slider does nothing. Pick thyme and you are running a different model from the one you ran on kombu. The pair finder now says so above the results rather than leaving you to infer it from a flat bar.

Contrast mode used to be worse still for those forty. It multiplied by umami, so peach returned twenty-seven cards every one of which scored zero, ranked in whatever order the array happened to hold. Contrast was therefore a savoury principle wearing the clothes of a general one.

The mediation gate needs no umami, because it is computed on the resonance graph alone. So when the selected ingredient is umami-inert the cohesion factor is dropped and the list is ranked on mediation only. Checked across all forty: none produces a flat tie, none produces all zeros. Thyme returns coriander seed through galangal, saffron returns lychee through passionfruit, peach returns passionfruit through mango.

Two honesty notes. This is a weaker list, because one term is doing all the work where a savoury contrast list has two, and the page says so above the results rather than presenting both as equivalent. And the flag is set per list rather than per pair on purpose: applied per pair it would hand full cohesion to kombu with thyme and promote a pair with no savouriness above genuinely savoury ones in the same ranking. One state still cannot be ranked, chemistry at zero with an inert ingredient, where the gate exponent vanishes and only novelty would remain. That is refused with an explanation.

Family kinship, and the taxonomy that did not survive

The obvious companion to mediation is "same aroma family, different molecule". It was built and tested and mostly failed, which is worth recording in full.

Grouping all 105 compounds by chemical class puts furfurylthiol at roast coffee, 3-mercaptohexanol at passionfruit and 4-MMP at blackcurrant bud into one sulfur family, and beta-ionone at violet, rotundone at peppery and geosmin at damp earth into one terpenoid family. Those are not families in any sense a cook would use. The descriptors are this page's own, so the test was against its own stated ground truth rather than an outside authority.

The scale problem compounds it. Terpenoid would hold 29 of the 105 compounds, and six ingredients here are entirely terpenoid, so 21 pairs reach a family cosine of exactly 1.00. Ungated, the ranking's top entries were ginger with dill and black pepper with coriander seed: not same-family-different-molecule but simply "both are herbs", arrived at expensively.

There is a deeper objection. For the idea to mean anything the family has to be perceptual rather than chemical, and a perceptual odour taxonomy is exactly the editorial layer that the top of the How-it-scores tab identifies as the protected part of a published pairing compilation. Deriving families from co-occurrence instead would dodge that, but 46 of the 105 compounds appear in a single ingredient, so 44 per cent carry no co-occurrence signal at all. That route is closed by the data.

Two families did survive the descriptor test. Lactones read creamy coconut, peach and coconut cream, which cohere; gamma-nonalactone carries no descriptor here, so that is three of four. Methoxypyrazines read green pepper and raw pea, which cohere with each other and split cleanly from the roasted pyrazines. Only those two are used, they are derived by name at load so no hardcoded list can go stale, and they set a badge and nothing else. Twenty-two pairs are lactone kin and six are methoxypyrazine kin, twenty-eight of 2,850. Flagging a resemblance is what the evidence supports. Ranking on it is not, and the self-check asserts that the badge moves no score by emptying both families and confirming every score across every pair is bit-identical.

The honest cost of that narrowness is that you will rarely see it. The badge appears in the default top eighteen of only eight of the seventy-six ingredients. Parmesan shows it against chicken, duck and pork, all four carrying a lactone with none in common; beetroot shows it against asparagus and tomato. Everywhere else it is silent. A wider taxonomy would fire far more often and mean far less, which is the trade this build has taken deliberately rather than by accident.

Self-check

Runs against the live engine every time this tab is opened. Three groups. Invariants should hold whatever the data says, so a failure there is a bug in the scoring. Documented claims are the figures quoted on the other two tabs, so a failure there means the data moved and the prose has gone stale, with the sentence it backs shown alongside. Guards exercise the degenerate states through the real DOM.