SMILES in.
A checked IUPAC name out.

Orthonym builds the name from the rules of the IUPAC 2013 recommendations, aiming at the Preferred IUPAC Name. Then OPSIN, which never saw your structure, reads the name back, and the two structures are compared by InChIKey. Every name carries its tier. When no name passes, you get the reason instead of a guess.

Install. Needs Python 3.10+ and a Java 11+ runtime.

pip install "git+https://github.com/Steinbeck-Lab/Orthonym.git"
orthonym --fetch-jars

No installing? Name a structure in the web app.

Examples of each tier

PIN pin_verified

1,3,7-trimethyl-3,7-dihydro-1H-purine-2,6-dione

orthonym "Cn1cnc2c1c(=O)n(C)c(=O)n2C"caffeine

InChIKey of your structure
RYYVLZVUVIJVGH-UHFFFAOYSA-N
InChIKey of what OPSIN read back
RYYVLZVUVIJVGH-UHFFFAOYSA-N

Same molecule: a verified Preferred IUPAC Name.

Fallback pin_unverified

(2S,3R,4E)-2-aminooctadec-4-ene-1,3-diol

orthonym --emit-tier valid "CCCCCCCCCCCCC/C=C/[C@H]([C@H](CO)N)O"sphingosine

Read back by OPSIN to the same molecule; its preferred status is not certified.

Best effort best_effort

cis-decahydronaphthalene

orthonym --emit-tier best-effort "C1CC[C@H]2CCCC[C@H]2C1"cis-decalin

From a last-resort producer; OPSIN read it back to the same molecule.

No name abstain

inorganic compound (not supported)

orthonym --on-failure label "O=[U](=O)=O"uranium trioxide

Declined, with the reason code UNSUPPORTED_ELEMENT. By default the name is empty and the reason goes to the error stream.

Every line is the engine's own output. What the tiers mean.

Find your way

Orthonym is described in a ChemRxiv preprint. Please cite it.