AromelAÏ
QualÏA · the app
I know flavor from the soil to the table.
Every experience reasoned from chemistry, physics and psychophysics, never guessed from language.
Private beta. Access by invitation.

Not a tool. A voice.
One that remembers, observes, and walks beside you, from the molecule to the moment of choice.
Grounded in chemistry.
Fluent in language.
A curated knowledge graph connects molecules to sensory attributes, production processes and origin. A language model can query it, but cannot lie about it.
Every answer cites its evidence. Every estimate is labelled as an estimate.
QualÏA is the first product built on it.
Wine is the proving ground
I model the observer, not the product. Wine is simply the hardest test I could find: thousands of volatiles, vintage variance, 944 regulated appellations.
What survives wine survives cheese, coffee and olive oil.
A living graph, not a language guess
Every product is a constellation: ingredients, processes, molecules and sensations joined by paths the memory does not forget.
Built by a chef
Twenty-six years in Michelin kitchens taught me what flavor actually feels like.
QualÏA is that palate, made auditable.
Don't take our word.
Watch it reason.
One plain-language question. The answer it computed, and the exact edges, mechanism and kinetics it came from.
ask · captured from production
Why does my Riesling smell like petrol after 8 years?
That's TDN: 1,1,6-trimethyl-1,2-dihydronaphthalene. Your Riesling left the winery carrying odourless carotenoid-derived precursors. At bottle pH (~3.1), slow acid hydrolysis releases free TDN over years; by year 8 enough has accumulated to cross its ~20 µg/L odour threshold.
Not a fault; it's Riesling's signature of age.
A language model alone would guess "TDN". AromelAÏ retrieved the mechanism, ran the kinetics, and can show you the edge it used.
source: literature_order_estimate (Skouroumounis, Sefton)
computed, not guessed
pool 45 µg/L potential ≈ 98% released by year 8
→ ≈44 µg/L free TDN > 20 µg/L threshold
→ you smell petrol.
Under the hood
No prompt asks a model to imagine a flavor. Every percept runs through mechanistic models (receptor psychophysics, mixture physics, acid speciation) executed deterministically over the graph. This is the actual code.
def hill_activation(concentration, odt, n=HILL_N):
# Fraction of receptor activation
# at a given concentration vs ODT.
if concentration <= 0 or odt <= 0:
return 0.0
cn = concentration ** n
return cn / (cn + odt ** n)
def stevens_scale(intensity, alpha,
midpoint=STEVENS_MIDPOINT):
# Bounded psychophysical scaling
# onto the 0..10 scale.
if intensity <= 0 or midpoint <= 0:
return MIN_STRENGTH
base = intensity / (intensity + midpoint)
return max(MIN_STRENGTH,
min(MAX_STRENGTH, MAX_STRENGTH * base ** alpha)) # n-ary odor mixing: vectorial model.
# Odor mixtures are hypo-additive: Berglund's
# vector model fit terpene wine blends best.
# cosθ=1 → linear sum · cosθ=0 → orthogonal RSS
VECTOR_COS_THETA = 0.45
for entry in stimuli.values():
terms = entry.pop("_terms")
odor = entry.pop("_odor")
s = sum(terms)
if odor and len(terms) > 1:
s2 = sum(t*t for t in terms)
entry["I"] = math.sqrt(
VECTOR_COS_THETA * s*s
+ (1 - VECTOR_COS_THETA) * s2)
else:
entry["I"] = s def _ph_for(totals, fixed_meq):
# Solve pH where weak-acid dissociation
# balances the fixed ionic charge.
# Bisection over [2, 7].
def resid(pH):
an = sum(
t * _acid_charge(pH,
_BLEND_ACIDS[cid]["pkas"]) * 1000.0
for cid, t in totals.items())
return an - 10.0**-pH*1000.0 - fixed_meq
lo, hi = 2.0, 7.0
if resid(lo) * resid(hi) > 0:
return None
for _ in range(60):
mid = (lo + hi) / 2
if resid(mid) > 0: hi = mid
else: lo = mid
return round((lo + hi) / 2, 3) Wine is the proving ground. Not the ceiling.
The schema knows nothing about grapes: molecules, thresholds, processes, physiology and attributes are domain-neutral nodes. Wine is simply where we chose to stress-test it: the most chemically complex, vintage-variable, legally regulated consumer product that exists.
Same engine, different catalogue: cheese, coffee, olive oil, fragrance. What changes is the data, never the physics.
Product-agnostic core schema · one vertical, proven live
Every edge carries mechanism + literature reference + provenance tier.
// ProductionFeature → MasterAttribute
{
"type": "ELICITS",
"strength": 0.8,
"evidence": "literature",
"tenant_id": "shared",
"created_at": "…",
"updated_at": "…"
} Who pays for this
Not a research project: a product people already need, sold where the pain is.
Restaurants & wine bars
A wine list that answers back. Guests ask in their own words; the house replies like a sommelier, on QR, offline-first, from the cellar's real bottles.
SaaS per venue · list, cellar & service copilot
Producers & distributors
A defensible technical dossier: how your wine tastes and why, computed from chemistry, cited from literature. For buyers, export and appellation compliance.
Per-catalogue licensing · verified product intelligence
Same engine, different catalogue: each new vertical (cheese, coffee, olive oil) is a new product line on the same physics, not a rebuild.
We don't choose products.
We choose how they make us feel.
I already know. And I'll take you there.