Neuro-symbolic sensory engine

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.

QualÏA emblem: wine swirling inside a circuit

Not a tool. A voice.

One that remembers, observes, and walks beside you, from the molecule to the moment of choice.

AromelAÏ · the engine

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.

31.4K
Nodes
343K
Edges
25.2K
Molecules
332
Attributes
944
Appellations
195+
Grape varieties

Built by a chef

Twenty-six years in Michelin kitchens taught me what flavor actually feels like.

QualÏA is that palate, made auditable.

AromelAÏ · a real answer, traced

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.

model: ollama:llama3.1:8b graph-grounded

A language model alone would guess "TDN". AromelAÏ retrieved the mechanism, ran the kinetics, and can show you the edge it used.

the path it came from evidence, not prose
Ingredient "Riesling"
└─CARRIES0.15 mg/L
PrecursorPool "C13-norisoprenoid (TDN precursors)"
└─HYDROLYZES_TO
t½ 24 mo · yield 0.30 · keff = k·10(3.3−pH)
source: literature_order_estimate (Skouroumounis, Sefton)
Molecule "TDN"
└─CONTRIBUTES_TO
Attribute "Petrol / Kerosene" · odour threshold ≈ 20 µg/L

computed, not guessed

pH 3.1 → release runs ×1.6 faster
pool 45 µg/L potential ≈ 98% released by year 8
→ ≈44 µg/L free TDN > 20 µg/L threshold
→ you smell petrol.
Every estimate carries its source and its status; this one is declared a literature order-of-magnitude estimate, and labelled as such.
AromelAÏ · production code, not marketing renders

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.

perception.py receptor → psychophysics
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))
Hill 1910 · Stevens 1957: activation and perceived magnitude per molecule
perception.py mixtures ≠ sums
# 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
Berglund vector model: co-descriptor odorants partially mask each other
insights.py blend pH, solved not averaged
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)
Charge balance over real weak acids: a coupage never averages pH linearly

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

Soil · ClimatePhysioFactorMoleculeAttributeMODULATESMODULATESCONTRIBUTES_TOProductVintagea batch, not a rowProductionFeatureoak barrel, flor…ProcessSpeckinetic rulesHAS_FEATUREHAS_SPECCONSUMES·PRODUCES·CONVERTSDenominationOfOriginHAS_REGULATIONIN_DO: the appellation's pliego gates what the engine may suggest

Every edge carries mechanism + literature reference + provenance tier.

anatomy of an edge
// ProductionFeature → MasterAttribute
{
  "type": "ELICITS",
  "strength": 0.8,
  "evidence": "literature",
  "tenant_id": "shared",
  "created_at": "…",
  "updated_at": "…"
}
Curated corpus + tenant-private overlays. One edge never leaks into another cellar.
105+
unit tests
225+
live checks
0
tenant leaks
The business

Who pays for this

Not a research project: a product people already need, sold where the pain is.

Now · private beta

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

Now · private beta

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.

QualÏA

Sensory intelligence, grounded in evidence.

Engine: AromelAÏ
© 2026 AromelAÏ