Station 8 of 13 · Accord · a design draft

The Device API

A way to write down a scent instruction — which components, in what proportions, when and how strongly — from the public teaching accords. A schema and its examples; no hardware, nothing executes.

Design only · no hardware · nothing executes A proposed standard way to write down a scent instruction (which components, in what proportions, when and how strongly), derived only from the public teaching accords. No device implements it; it never carries a Radler formula or any real perfume’s composition.

What it is

  • A JSON Schema (draft 2020-12) for a scent instruction: /data/device-api/schema.json.
  • Derived from public records only. The source must be a teaching accord (source.purpose is always “teaching”); each channel names a component by its record id, with its PubChem CID where the record has one, so any reader can follow it back to its sources.
  • Proportion, timing, intensity. Each channel carries the component’s modeled teaching share, its volatility class (from the records, or modeled and saying so), a timing envelope for a one-minute demonstration (modeled: the top arrives first, the base last) and a relative intensity (its share against the largest; proportion, not perceived strength). A timeline of keyframes gives every channel’s level every five seconds.
  • Safety fields that cannot be switched on. safety.for_skin and safety.assessed are always false; the regulation records the accord names are listed for reading. IFRA Standards are the industry’s own standards and are not law in the US; EU rules apply in the EU.
  • Why. Devices that release scent on command are being researched (the house’s vision notes wearables); a shared, open description of what to release, tied to sourced records, is a small, useful layer that needs no hardware to write down. This page offers one; it is a draft for discussion.

One instruction: the rose teaching accord

The rose teaching accord’s instruction as envelopes over one minute: each channel’s level over time (the timeline table holds the same numbers). Modeled timing; design only.0 s10 s20 s30 s40 s50 s60 s1 · 2-phenylethyl alc…2 · citronellol3 · geraniol4 · β-damascenone
The channels of the rose teaching accord’s instruction. Proportions are modeled teaching shares; the envelope is modeled timing; design only.
ChannelComponentProportionClassEnvelope (s)Intensity
12-phenylethyl alcohol (Molecule, PubChem CID 6054)0.450heart (its role in the accord (documented))from 8, rise 6, hold 24, fade 201.000
2citronellol (Molecule, PubChem CID 8842)0.300heart (its role in the accord (documented))from 8, rise 6, hold 24, fade 200.667
3geraniol (Molecule, PubChem CID 637566)0.249heart (its role in the accord (documented))from 8, rise 6, hold 24, fade 200.553
4β-damascenone (Molecule, PubChem CID 5366074)0.001heart (no class on record (role: trace): modeled as heart)from 8, rise 6, hold 24, fade 200.002
The timeline: each channel’s level (0 to 1) every five seconds.
Time2-phenylethyl alcoholcitronellolgeraniolβ-damascenone
0 s0.000.000.000.00
5 s0.000.000.000.00
10 s0.330.220.180.00
15 s1.000.670.550.00
20 s1.000.670.550.00
25 s1.000.670.550.00
30 s1.000.670.550.00
35 s1.000.670.550.00
40 s0.900.600.500.00
45 s0.650.430.360.00
50 s0.400.270.220.00
55 s0.150.100.080.00
60 s0.000.000.000.00
The first lines of the file
{
  "format": "radler-scent-instruction",
  "version": "0.1.0",
  "status": "design draft: no device implements this, and nothing executes it",
  "source": {
    "type": "Accord",
    "id": "rose-teaching-accord",
    "record_version": 2,
    "url": "https://www.radlerparfums.com/accord/rose-teaching-accord",
    "data": "https://www.radlerparfums.com/data/accord/rose-teaching-accord.json",
    "purpose": "teaching",
    "licence": "https://creativecommons.org/licenses/by/4.0/"
  },
  "disclaimer": "A teaching accord for learning: not a Radler formula, not a finished perfume, not safety-assessed; do not make it for skin.",
  "units": {
    "time": "seconds from the start of the instruction",
    "proportion": "share of the accord, 0 to 1 (modeled teaching share)",
    "intensity": "relative, 0 to 1: the channel's share against the largest share (proportion, not perceived strength)"
  },
  "channels": [
    {
      "channel": 1,
      "component": {
        "type": "Molecule",
        "id": "phenylethyl-alcohol",
        "name": "2-phenylethyl alcohol",
        "pubchem_cid": 6054,
        "url": "https://www.radlerparfums.com/molecule/phenylethyl-alcohol"
      },
      "proportion": 0.45,
      "volatility_class": "heart",
      "class_from": "its role in the accord (documented)",
      "envelope": {
        "onset_s": 8,
        "attack_s": 6,
        "hold_s": 24,
        "release_s": 20
      },
      "intensity": 1
    },
    "…"
  ],
  "timeline": [
    {
      "t_s": 0,
      "levels": [
        0,
        0,
        0,
        0
      ]
    },
    {
      "t_s": 5,
      "levels": [
        0,
        0,
        0,
        0
      ]
    },
    "…"
  ],
  "safety": {
    "for_skin": false,
    "assessed": false,
    "regulation_refs": [
      "ifra-rose-ketones",
      "eu-2009-1223",
      "eu-2023-1545"
    ],
    "note": "A teaching accord for learning, not a finished product; IFRA Standards are the industry's own standards (not law in the US); EU regulation applies in the EU. Read each regulation record for its jurisdiction."
  }
}

Every field

The fields of the schema, from /data/device-api/schema.json.
FieldRequiredValueMeaning
formatyesalways "radler-scent-instruction"Names this representation.
versionyesstring, pattern ^0\.1\.[0-9]+$The version of this draft.
statusyesalways "design draft: no device implements this, and nothing executes it"Says what the file is, every time.
sourceyesobjectThe public record the instruction is derived from. Only a teaching accord is allowed.
source.typeyesalways "Accord"
source.idyesstring, pattern ^[a-z0-9-]+-teaching-accord$
source.record_versionyesinteger, ≥ 1
source.urlyesstring, pattern ^https://www\.radlerparfums\.com/accord/[a-z0-9-]+$
source.datanostring, pattern ^https://www\.radlerparfums\.com/data/accord/[a-z0-9-]+\.json$
source.purposeyesalways "teaching"
source.licenceyesalways "https://creativecommons.org/licenses/by/4.0/"
disclaimeryesstringCarried from the teaching accord record, unchanged.
unitsyesobject
units.timeyesalways "seconds from the start of the instruction"
units.proportionyesalways "share of the accord, 0 to 1 (modeled teaching share)"
units.intensityyesalways "relative, 0 to 1: the channel's share against the largest share (proportion, not perceived strength)"
channelsyesarrayOne channel per component of the accord.
channels.[ ]channelyesinteger, ≥ 1
channels.[ ]componentyesobject
channels.[ ]component.typeyesone of Molecule, Material, Unrecorded
channels.[ ]component.idyesstring or null, pattern ^[a-z0-9-]+$
channels.[ ]component.nameyesstring
channels.[ ]component.pubchem_cidnointeger or null, ≥ 1
channels.[ ]component.urlnostring or null
channels.[ ]proportionyesnumber, ≥ 0, ≤ 1
channels.[ ]volatility_classyesone of top, heart, base
channels.[ ]class_fromyesstringWhere the class came from on the records, or that it is modeled.
channels.[ ]envelopeyesobjectModeled timing for a demonstration playback: when the channel starts, rises, holds and fades.
channels.[ ]envelope.onset_syesnumber, ≥ 0
channels.[ ]envelope.attack_syesnumber, ≥ 0
channels.[ ]envelope.hold_syesnumber, ≥ 0
channels.[ ]envelope.release_syesnumber, ≥ 0
channels.[ ]intensityyesnumber, ≥ 0, ≤ 1
timelineyesarrayKeyframes: at each time, the level of every channel in channel order (envelope times intensity).
timeline.[ ]t_syesnumber, ≥ 0
timeline.[ ]levelsyesarray
safetyyesobject
safety.for_skinyesalways false
safety.assessedyesalways falseNot safety-assessed; not assessed against any standard.
safety.regulation_refsyesarrayRegulation record ids the source accord names, for reading; their wording names their jurisdiction.
safety.noteyesstring

An instruction for every teaching accord

Generated from the records at every build and checked against the schema; a build fails if one does not validate.

This page’s data is published under CC BY 4.0: /data/device-api/schema.json.

schema version 0.1.0 · updated 2026-09-30